2012-10-12 241 views
6

Duplicar posibles:
Best way to prevent SQL injection in PHP?SQL Injection Protección - comillas simples

he estado haciendo un poco de pruebas para proteger a mis sitios de la inyección de SQL. Veo que hay un par de maneras de hacerlo, escapando de mis entradas de usuario, agregando barras, o mejor aún usando declaraciones SQL parametrizadas.

Tenía este código de prueba ..

$q=$_GET["q"]; 
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'"); 
$game = mysql_fetch_array($game); 

echo "<h4>ID: ".$game[0]."<br /></h4>name: " . $game[1]; 

Y he intentado varias solicitudes SQLi y no pude conseguir mi página de prueba a error, o mostrar todos los datos adicionales.

Pero cuando he cambiado de código SQL para esto (Eliminado las comillas simples alrededor de $ q) ..

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = $q"); 

pude realizar de SQLi simples y obtener algunos resultados.

¿Tan solo está envolviendo mis entradas de usuario en comillas simples lo suficientemente buenas? ¿O he visto más complejas técnicas de SQLi?

+3

Use PDO con una declaración preparada. Esa es la opción más segura a partir de ahora en el año 2012. – itachi

+1

compruebe si su servidor php tiene 'magic_quotes_gpc = ON' que ayudará a evitar la inyección de SQL – jcho360

+0

Use declaraciones preparadas (mysqli o POD). Ahorra muchas molestias y mysql está en desuso. –

Respuesta

1

Trate de esta entrada:

abc' OR id <> ' 

que dará lugar a siguiente declaración:

"SELECT * FROM `Games` WHERE `id` = 'abc' OR id <> ''" 

que devolvería todos los juegos en lugar de sólo una. Si su página permite mostrar el resultado completo, entonces definitivamente veríamos demasiado ...

La salida es usar PDO con declaraciones preparadas, es por lo menos la función mysqli_real_escape_string() antes de insertar la entrada del usuario en la declaración SQL .

SQL-Injection puede hacer mucho más, en el peor de los casos, incluso puede obtener el control del servidor.Eche un vistazo a este SQL Injection Cheat Sheet

+0

Hola, acabo de probar esa entrada y nada fue devuelto. Intenté mucho similar a esto y obtuve el mismo resultado, de ahí que pregunte si las comillas simples son suficientes. ¿Podría ser el 'magic_quotes_gpc = ON' que @ jcho360 mencionó para detener estos ataques? – user1741863

+1

@ user1741863 - Es posible, puede verificarlo muy fácilmente, solo haga una página php llamando 'phpinfo();' y busque magic_quotes_gpc. Tuve que hacer una presentación y crear una página donde puedes [jugar con Inyecciones SQL] (http://www.martinstoeckli.ch/hash/hash_sqlinjection.php?step=2), desafortunadamente está en alemán. – martinstoeckli

+0

de hecho está encendido. Gracias por la página, google translate to the rescue. – user1741863

0

se debe utilizar mysql_real_escape_string() función

En este caso, usted tiene que utilizar las comillas simples

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'"); 

deje de entrada Supongamos que el usuario es 1' que la salida escape_string será 1\'

si está no utilizando comillas que la consulta será

SELECT * FROM `Games` WHERE `id` = 1' 

//that is wrong or a injection 

Pero en el caso único cotizaciones

SELECT * FROM `Games` WHERE `id` = '1\'' 

que es bueno y se puede quitar el sql-injection

+1

'mysql_ * 'están en desuso y se eliminarán en versiones futuras. – itachi

+0

@itachi no seas demasiado inteligente. Ve la pregunta correctamente: apropiadamente. Escabullir las entradas de mi usuario, agregar barras o, mejor aún, usar declaraciones sql parametrizadas .... ' – StaticVariable

+0

El voto negativo no tiene nada que ver con la pregunta, pero la respuesta . ¿No se supone que es así? Utiliza una función que ya está en desuso. Por lo tanto, esta respuesta carece de integridad en mis ojos y, por lo tanto, de vencimiento. – itachi

Cuestiones relacionadas