¿Es suficiente htmlspecialchars para evitar una inyección de SQL en una variable incluida entre comillas simples?

Aunque muchas fonts citan la function htmlspecialchars con ENT_QUOTES para que no sea ​​suficiente para evitar la inyección de SQL, ninguna de ellas proporciona una testing del concepto. No puedo pensar en ninguna posibilidad yo mismo.

Consideremos el siguiente ejemplo:

 $username = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8'); $sql = "SELECT * from user WHERE name='$username'"; mysql_query($sql,...); 

¿Alguien puede dar un ejemplo, OTRO que los cubiertos por el caso cuando la inyección SQL se mueve alnetworkingedor de mysql_real_escape_string () ?

El carácter que htmlspecialchars no puede codificar el carácter crítico \0 (byte NUL), \b (retroceso), así como el carácter \ .

Para explotar esto, necesita una statement con múltiples puntos de inyección. Con esto, puede escaping del delimitador de cierre de un literal de cadena y así expandirlo hasta el siguiente delimitador de inicio del siguiente literal de cadena. Tres literales de cadena, cada uno con un punto de inyección, se pueden transformar en dos literales de cadena.

Por ejemplo:

 SELECT * from user WHERE (name='$login' OR email='$login') AND password='$password' 

Ahora con los siguientes valores:

 login: ) OR 1=1 /*\ password: */-- 

La statement resultante se ve así:

 SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1 /*\') AND password='*/--' 

Lo cual es equivalente a:

 SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1 

Las cadenas no son lo único con lo que SQL interactúa.

 $result = "SELECT * FROM user WHERE id = " . htmlspecialchars($_GET['id']); 

Aquí es donde las consultas parametrizadas son muy útiles.