php - prevencion - inyeccion sql postgresql
¿Es suficiente htmlspecialchars para evitar una inyección de SQL en una variable incluida entre comillas simples? (2)
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 declaración con múltiples puntos de inyección. Con esto, puede escapar 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 declaración 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
Aunque muchas fuentes citan la función htmlspecialchars
con ENT_QUOTES
para que no sea suficiente para evitar la inyección de SQL, ninguna de ellas proporciona una prueba 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 alrededor de mysql_real_escape_string () ?
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.