Como evito SQL Inyection?

Iniciado por Skeletron, 7 Diciembre 2009, 18:12 PM

0 Miembros y 3 Visitantes están viendo este tema.

Skeletron

Hola gente.. les comento que en mi web, tengo algunas entradas y salidas de datos, que me gustarian mejroarlas en seguridad.. para evitar SQL Inyection.

Supongamos en el metodo INSERT:
$res = mysql_query("INSERT INTO mails (mail) VALUES ('" . $_POST['mail'] . "')");

Y en el metodo SELECT:
$res = mysql_query("SELECT calle FROM locales WHERE calle = '" . $_POST['direccion'] . "' ORDER BY calle");
while($row = mysql_fetch_array($res)){
   echo $row['calle'] . "<br />";
}

Y que me dicen del UPDATE???

MazarD

Si usas php>=5 y mysql>=4.1 lo mejor es que uses prepared statments
Si no, tienes que escapar los caracteres especiales, utilizando mysql_real_escape_string($_POST['VAR']) o htmlentities($_POST['VAR'],ENT_QUOTES)

De todos modos hay mucha información sobre esto en el foro

Saludos!

pd:y seguramente este hilo debería ir en el subforo de php :P
-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net

Skeletron

Ohhh por dios.. no me gusta todo eso que se ve ahi..!!!
Porque tanto codigo?

En cada consulta SQL, con poner mysql_real_escape_string($xxx) ya es suficiente?
Y al presentar los datos en la web, colocar el htmlspeciacharacters() de php (no recuerdo si se escribiía así :P)

^Tifa^

Para intentar protegerte de inyecciones SQL tienes softwares como este:

http://www.greensql.net/

Pero si quieres algo mas personalizado, puedes crear dentro del motor de BD procedimientos almacenados y pasarle cierta cantidad de parametros, tambien existen en php creo que magic_quotes... (O no se bien, en Perl se conoce como placeholder) en php no se como se llame esta tecnica, pero tambien se utiliza dentro del lenguaje scripting para intentar evitar las inyecciones SQL.


Skeletron

Veré el Software, y lo del magicquotes..

porque esta sentencia: "INSERT INTO mails (mail) VALUES ('" . mysql_real_escape_string($_POST['mail']) . "')"
Me sigue ingresando perfectamente..

MazarD

#5
Citarporque esta sentencia: "INSERT INTO mails (mail) VALUES ('" . mysql_real_escape_string($_POST['mail']) . "')"
Me sigue ingresando perfectamente..
Que significa que te sigue ingresando perfectamente?
Con mysql_real_escape_string lo que consigues es que los caracteres especiales como las comillas simple se escapen con \', asi te aseguras que no cierran la primera comilla y añaden codigo.
Por lo tanto si a $_POST['mail'] se le pasa: '); drop database bd;-- Puedes estar seguro de que en mails se habrá insertado "'); drop database bd;"-- y no se habrá borrado la base de datos.

Y añadir capas de software para prevenir esto como comenta ^Tifa^ siempre está genial, pero programar bien para evitarlo tampoco cuesta nada y es aún más seguro

Saludos!
-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net

Skeletron

Huy.. es verdad... que idiota.. creí que tambien en la base de datos iba a aparecer el \'

Perfecto entonces... FUnciona perfectamente el "ingresado" de datos :D

Los amo...

Y en cuanto al UPDATE, hay que hacer lo mismo, o no?

Y para evitar XSS, imprimo los campos con htmlspecialchars? o htmlentities?

MazarD

#7
Si, hay que hacer lo mismo siempre que construyas sql dinámicamente a partir de la entrada del usuario, en el caso de que construyas el sql con un campo numérico debes comprobar también la entrada con un is_numeric() para que no haya inyección.

Citarif (!is_numeric($_POST['edad']) exit(1);
$r=mysql_query('insert into usuario (mail,edad) values (\''.mysql_real_escape_string($_POST['mail']) .'\','.$_POST['edad'].')');
Pues si, para evitar xss con htmlspecialchars ya te vale puesto que convierte solo lo peligroso, aunque yo siempre utilizo htmlentities por costumbre, te transforma todos los tags posibles aunque la mayoría no sean necesarios teniendo bien puesto el encoding :P
Tienes que vigilar siempre todo get, post y cookie. No se que libro que leí hace mucho empezaba con: "La entrada del usuario es siempre incorrecta y peligrosa hasta que se demuestre lo contrario"

Después así sobre seguridad web relacionado también te quedaría prevenir CSRF sin tener en cuenta todo lo más simple: path traversal, rfi, lfi, etc...

Saludos!


-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net

Skeletron

Jamas entendi CSRF (tampoco investigue mucho)
Acabo de leer los otros items, y no me imagine esas vulnerabilidades.

A la web la tengo en un hosting, así que creo que varias vulnerabilidades estan evitadas por software..

Nadie conoce algun libro o algun documento donde se hablen de las vulnerabilidades mas generles a nivel web?

Nakp

cross site request forgery... el ejemplo mas burdo es cuando muestras un link en una imagen (el link de eliminiar algo por ejemplo) pero solo lo puede ejecutar alguien con permisos, sin embargo no pide un token asi que al "ver la imagen" el que tiene permisos, ejecuta alguna accion sin su consentimiento :P
Ojo por ojo, y el mundo acabará ciego.