Intereting Posts
Расширение PHP с помощью C ++? SQL / PHP: получить все результаты в течение времени от X до Y и определить, есть ли промежутки времени между ними Экспорт большой базы данных в файл без mysqldump, низкий объем памяти Служба проверки URL-адреса для вредоносного ПО или фишинга? Regex для удаления http: // и www. из URL-адресов Кодирование JSON с проблемами PHP с массивом __destruct в __construct? Htaccess Удалить часть URL-адреса перенаправить после входа в систему fos user bundle symfony Как объединить запросы для нескольких файлов javascript в один HTTP-запрос? Добавление выражения else в число страниц? Как я могу обрабатывать субдомены с одной установкой laravel Инструмент ретроспективного автоматического комментария / phpDocumentor Netbeans-esque (для Eclipse или автономного) Как установить пакет Python для глобального использования всеми пользователями (включая www-data) XMLHttpRequest для открытия PDF в браузере

PHP. Предоставляет ли PDO цитату из SQL Injection?

$id = trim((int)$_GET['id']); $sql = 'SELECT * FROM users WHERE id = ' . $db->quote($id) . ' LIMIT 1'; $run = $db->query($sql)->fetch(); 

Метод цитаты PDO безопасен в качестве подготовленных операторов? Или я должен использовать подготовленные заявления в моем сценарии?

В основном quote() является безопасным в качестве подготовленных операторов, но это зависит от правильной реализации quote() и, конечно же, от его последующего использования. Кроме того, для ответа на вопрос необходимо принять во внимание внедрение используемой системы баз данных / PDO.

Хотя подготовленный оператор может быть признаком базового протокола базы данных (например, MySQL) и затем будет «подготовлен» на сервере базы данных ( подготовка сайта сервера ), он не обязательно должен быть и может быть проанализирован на клиентском сайте, поскольку хорошо ( клиентский сайт готовит ).

В PDO это зависит от:

  • Подготавливает ли драйвер / сервер базы данных серверную информацию?
  • PDO::ATTR_EMULATE_PREPARES должен быть установлен в false (по умолчанию, если драйвер поддерживает его)

Если одно из условий не выполнено, PDO возвращается на клиентский сайт, готовится , снова используя что-то вроде quote() под капотом.


Вывод:

Использование подготовленных заявлений не повредит, я бы рекомендовал вам использовать их. Даже если вы явно используете PDO::ATTR_EMULATE_PREPARES или ваш драйвер не поддерживает подготовку сайта на PDO::ATTR_EMULATE_PREPARES либо сайте, подготовленные операторы будут обеспечивать соблюдение рабочего процесса, в котором можно не забывать, что цитата не может быть забыта. Проверьте также ответ @ YourCommonSense. Он уточняет это.

Технически – да.

Однако это означает, что вы форматируете свои значения вручную . И ручное форматирование всегда хуже, чем подготовленные заявления, так как это делает код раздутым и склонным к глупым ошибкам и путаницам.

Основная проблема с ручным форматированием – съемная . Означает, что это может быть выполнено где-то далеко от фактического выполнения запроса. Где его можно забыть, опустить, смутить и тому подобное.

Какой смысл использовать trim по int. А потом, цитируя это значение? Поскольку у вас есть целочисленное значение, используйте его как таковое

 $sql = 'SELECT * FROM users where id = ' . $id . ' LIMIT 1'; 

Вместо того, чтобы слепо процитировать все, просто подумайте о типах ваших переменных и убедитесь, что вы не делаете глупые вещи, такие как $id = trim((int)$_GET['id']); где $id = (int)$_GET['id']; было бы более чем достаточно

Если вы не уверены, что можете это сделать, используйте подготовленные заявления. Но учтите, что вы кодируете