Работа с цитатами, добавленными PDO :: prepare () - PullRequest
7 голосов
/ 16 января 2012

В соответствии с PHP-документацией PDO :: prepare () добавляет кавычки ко всем вашим параметрам, чтобы вам не приходилось беспокоиться об этом:

"Параметры для подготовленных операторов don 'не нужно заключать в кавычки; драйвер автоматически обрабатывает это. Если приложение использует исключительно подготовленные операторы, разработчик может быть уверен, что SQL-инъекция не произойдет (однако, если другие части запроса создаются с неэкранированным вводом, SQL-инъекциявсе еще возможно).

Проблема с этим для меня заключается в том, как я строю свои запросы и мою структуру базы данных.Обычно часть FROM оператора SQL не нуждается в параметризации, потому что таблица, вероятно, будет определяться прямым пользовательским вводом.Однако с моим кодом это имеет место в некоторых местах, и поэтому я чувствую себя более комфортно с параметризованной версией.

SELECT * FROM ? WHERE ?=?

в отличие от SELECT * FROM tablename WHERE? =?

Так что мойВопрос в том, можно ли запретить моему объекту PDO добавлять кавычки вокруг параметра FROM, чтобы у меня не возникало ошибок SQL?Или я должен сделать это по-другому.

Ответы [ 2 ]

4 голосов
/ 16 января 2012

Заполнители в подготовленных утверждениях предназначены только для значений.Единственный способ вставить динамические имена таблиц - сделать это самостоятельно

"SELECT FROM `".$table."` WHERE `".$column."` = ?"
3 голосов
/ 27 февраля 2014

@ KingCrunch наиболее правдив в своем ответе.Вы должны действительно избежать строки самостоятельно.Нечто подобное должно защищать от большинства инъекций:

//make sure $table and $column only contain alphanumeric chars  
$table = preg_replace("/[^A-Za-z0-9]/", '', $table);
$column = preg_replace("/[^A-Za-z0-9]/", '', $column); 

$query = "SELECT FROM `{$table}` WHERE `{$column}` = ?"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...