Является ли htmlspecialchars достаточным для предотвращения SQL-инъекции переменной, заключенной в одинарные кавычки?

Хотя многие источники цитируют функцию 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']); 

    Здесь параметризованные запросы очень удобны.