Использование связанных параметров достаточно в обычных случаях и хорошая практика для избежания SQL-инъекции.
Но параметр в подготовленном операторе может использоваться только для значения в выражении SQL. Другими словами, где вы обычно пишете цитируемый строковый литерал, цитируемый литерал даты или числовой литерал. И один параметр == одно значение (без списков).
Вы должны использовать связанные параметры для этих случаев. Если вы задаете этот вопрос, потому что считаете, что можете пропустить с помощью связанных параметров, если кто-то ответит, что их недостаточно, то извините, вы не получите оправдание от практики безопасного программирования.
Однако существуют и другие (возможно, менее распространенные) случаи, для которых связанные параметры не работают. Если вам нужно написать запрос с именем динамической таблицы, именем столбца или другим идентификатором или целым выражением или ключевым словом SQL, тогда вам нужен другой метод. Эти случаи должны быть исправлены в синтаксисе SQL на этапе , подготовив, поэтому их нельзя параметризовать.
Например, вот запрос с динамическими частями, обозначенных использованием переменных, которые не могут быть параметрами:
$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";
Вы должны использовать белый список для тех случаев. Другими словами, убедитесь, что строка, которую вы интерполируете в свой запрос в качестве имени динамической таблицы, фактически является одной из таблиц, существующих в вашей базе данных. Убедитесь, что ключевые слова SQL являются законными ключевыми словами.
Никогда вход берут пользователя дословное и интерполировать его в SQL (или любой другой код, который обрабатывается во время выполнения, как аргумент вы кормите к eval()
или shellexec()
). И это не просто пользовательский ввод, который может быть небезопасным контентом.
См. Также мою презентацию SQL Injection Myths and Fallacies для более подробного объяснения.
Отличный ответ и объяснение! Я сейчас пытаюсь избежать практики безопасного программирования, я просто гарантирую, что мои текущие методы безопасны для моих баз данных/серверов. Я ценю время @ bill! –