как sprintf () снова защищает SQL-инъекцию?

Я слышал, что sprintf () снова защищает SQL-инъекцию. это правда? если да, то как он снова защищает sql-инъекцию?

почему люди рекомендуют писать запрос следующим образом:

$sql = sprintf('SELECT * FROM TABLE WHERE COL1 = %s AND COL2 = %s',$col1,$col2); 

sprintf не будет защищать! он заменяет только %s

вы должны mysql_real_escape_string так:

 $sql = sprintf('SELECT * FROM TABLE WHERE COL1 = "%s" AND COL2 = "%s"', mysql_real_escape_string($col1), mysql_real_escape_string($col2)); 

более безопасная инъекция

note: Я согласен с тем, что вы смотрите на PDO , это то, что мне нравится использовать для DBconections и запросов

Это не защищает. Использование sprintf делает для более удобочитаемого кода, а затем выводит строку и из строки для запуска mysql_real_escape_string по каждой из переменных … но этот пример не ускользает от переменных в конце, так что преимущество теряется.

Если вы хотите достойную защиту, используйте что-то, что обеспечивает связанные параметры .

Использование sprintf может защитить от SQL-инъекции для числовых полей:

 $sql = sprintf("SELECT * FROM table WHERE col1 = %i", $col1); 

Используя sprintf таким образом, вы можете быть уверены, что $ col1 будет преобразован в целое число – хотя он может генерировать ошибку или предупреждение, если это не целое число.

Правильный способ защиты от SQL-инъекции – проверить все ваши входные значения и выполнить экранирование. Но это гораздо более подробно освещено в других вопросах, поэтому я не буду вдаваться в подробности здесь.

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

Однако это может быть практический способ генерации вывода, который нуждается в дальнейшей обработке. Пожалуйста, сравните:

 echo '<p>Hello, <strong></strong>' . htmlspecialchars($name) . ', welcome to ' . htmlspecialchars($place). '</p>'; echo sprintf('<p>Hello, <strong>%s</strong>, welcome to %s</p>', htmlspecialchars($name), htmlspecialchars($place) ); 

То же самое относится к другим типам вывода, таким как код SQL, но, конечно, вам все равно нужно что-то сделать для ввода, чтобы сделать его безопасным: sprintf () – это просто регулярная строковая функция, которая не знает SQL и базы данных.

Обратите внимание, что параметры привязки используют аналогичный синтаксис:

 // Fictional DB abstraction layer $sql = 'SELECT foo_id FROM foo WHERE name=:name AND status=:status'; $params = array( 'name' => $name, 'status' => $status, ); $result = $db->run($sql, $params); 

Вот почему мне особенно удобнее использовать те библиотеки БД, которые предоставляют этот синтаксис, например PDO.