$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'];
было бы более чем достаточно
Если вы не уверены, что можете это сделать, используйте подготовленные заявления. Но учтите, что вы кодируете