Согласно документации PHP PDO :: prepare () добавляет кавычки ко всем вашим параметрам, поэтому вам не нужно беспокоиться об этом:
«Параметры для подготовленных операторов не нужно указывать, драйвер автоматически обрабатывает это. Если приложение использует исключительно подготовленные операторы, разработчик может быть уверен, что SQL-инъекция не произойдет (однако, если другие части запроса построенный с несвязанным вводом, SQL-инъекция по-прежнему возможна). "
Проблема с этим для меня заключается в том, как я строю свои запросы и структуру моей базы данных. Обычно часть FROM инструкции SQL необязательно должна быть параметризована, потому что таблица, вероятно, будет определяться прямым пользовательским вводом. Однако с моим кодом, который имеет место в некоторых местах, и, таким образом, я чувствую себя более комфортно с параметризованной версией.
SELECT * FROM ? WHERE ?=?
в отличие от SELECT * FROM tablename WHERE? =?
Таким образом, мой вопрос заключается в том, можно ли запретить моему объекту PDO добавлять кавычки вокруг параметра FROM, чтобы я не получал SQL-ошибок, брошенных мне в лицо? Или я должен сделать это по-другому.
Заполнители в подготовленных заявлениях предназначены только для значений. Единственный способ вставить динамические имена таблиц – сделать это самостоятельно
"SELECT FROM `".$table."` WHERE `".$column."` = ?"
@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}` = ?"