inyección de sql: comilla simple vs comilla doble

3

¿Puede alguien explicarme por qué este código:

$sql='select * from admin where user_name="$user" and password="$pass" ' ;  

$re = mysql_query($sql);  

no es vulnerable (carga útil: "o 1 = 1--) mientras este código:

$sql="select * from admin where user_name='$user' and password='$pass' " ;

$re = mysql_query($sql);

es vulnerable (carga útil: 'o 1 = 1--)?

Solo alterno las comillas simples con comillas dobles.
Sistema: FreeBSD 10.2-RELEASE
MySql: mysql Ver 14.14 Distrib 5.6.24, para FreeBSD10.1 (i386) usando el envoltorio EditLine

Gracias

    
pregunta Dimopoulos Elias 19.11.2015 - 11:27
fuente

1 respuesta

4

En las variables de PHP no se expandirán dentro de comillas simples (consulte enlace ) para que cuando toda la cadena se incluye en comillas simples, no se verá afectada por su ejemplo de SQLi. Eso significa que la siguiente declaración se enviaría al servidor SQL:

select * from admin where user_name="$user" and password="$pass"

Probablemente no sea lo que esperaría, porque esperaba que las variables se expandieran, es decir, algo como esto:

select * from admin where user_name="some-user-name" and password="some-password"

Para hacer que las variables se expandan en la cadena, debes usar comillas dobles alrededor de la cadena en PHP, como hiciste en tu otro ejemplo. Pero entonces eres vulnerable a SQLi como notaste.

Para obtener información sobre cómo protegerse adecuadamente contra SQLi, consulte enlace .

    
respondido por el Steffen Ullrich 19.11.2015 - 11:45
fuente

Lea otras preguntas en las etiquetas