Хотя многие источники цитируют функцию htmlspecialchars
с ENT_QUOTES
недостаточно для предотвращения SQL-инъекции, ни одна из них не дает доказательства концепции. Я не могу думать ни о какой возможности.
Рассмотрим следующий пример:
$username = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8'); $sql = "SELECT * from user WHERE name='$username'"; mysql_query($sql,...);
Может ли кто-нибудь представить пример, кроме тех, которые рассматриваются в случае, когда SQL-инъекция проходит вокруг mysql_real_escape_string () ?
Символ, который htmlspecialchars
не может кодировать критический символ \0
(NUL byte), \b
(backspace), а также символ \
.
Чтобы воспользоваться этим, вам понадобится инструкция с несколькими точками ввода. С помощью этого вы можете избежать закрывающего разделителя одного строкового литерала и, таким образом, расширить его до следующего начального разделителя следующего строкового литерала. Три строковых литерала, каждая с точкой впрыска, затем могут быть преобразованы в две строковые литералы.
Например:
SELECT * from user WHERE (name='$login' OR email='$login') AND password='$password'
Теперь со следующими значениями:
login: ) OR 1=1 /*\ password: */--
В результате оператор выглядит следующим образом:
SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1 /*\') AND password='*/--'
Это эквивалентно:
SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1
Строки – это не единственное, с чем взаимодействует SQL.
$result = "SELECT * FROM user WHERE id = " . htmlspecialchars($_GET['id']);
Здесь параметризованные запросы очень удобны.