Я слышал, что 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.