Buenos habitos para hacer queries SQL?

Iniciado por Karcrack, 26 Septiembre 2010, 21:50 PM

0 Miembros y 1 Visitante están viendo este tema.

Karcrack

Iba a poner este tema en la sección de PHP, pero creo que aqui sabreis informarme mejor :P

Antes que nada, decir que voy a iniciar de aqui poco un pequeño proyecto y en el hay partes PHP que trabajan con bases de datos.. Mi pregunta es simple:

Cuales son los buenos habitos a la hora de acceder a la base de datos desde PHP? Para evitar inyecciones y tal...

Muchas gracias ;)

bizco

Pues limpiar siempre la cadena, todos los datos por tontos que puedan parecer si vienen de la parte cliente limpialos pq puede que contengan algo que tu script no espera y ahi empiezan los problemas. de todos modos cuando lo tengas listo si quieres puedes publicarlo y entre unos y otros podemos ver si hay algo raro.

tragantras

Hola Karcrack, antes que nada, especial ojo a TODOS los valores que se reciban por parte del usuario, esto incluye (pero no se limita a ):

COOKIES
X_FORWARDED_FOR
CABECERAS EN GENERAL
GETs
POSTs
VARIABLES DE SESION...

las cadenas encierralas en la query que vayas a hacer entre comillas simples, y aplicale mysql_real_escape_string, así mismo los valores numéricos deberías hacerle un casting a entero mediante (int), si quiers comprueba primero que sea numerico (is_numeric()).

Magic quotes off, ya sabes y... bueno, poca cosa más, cuando entre en linux si quiers te subo un cheatsheet sobre seguridad web, está muy bien resumido todo
Colaboraciones:
1 2

MazarD

Para evitar inyecciones sql lo más fácil y seguro es simplemente utilizar prepared statements.

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

Karcrack

Me recomiendas algun enlace sobre el tema?
Gracias ;)

MazarD

Que mejor que php.net: http://www.php.net/manual/en/intro.pdo.php
Y el capitulo sobre prepared statements: http://www.php.net/manual/en/pdo.prepared-statements.php

Es lo mismo en todos los lenguajes, el tema es que hay que separar la consulta de los valores, como no puede haber confusión no puede haber inyección de código... entre otras ventajas como el rendimiento.

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

tragantras

Cita de: MazarD en 11 Octubre 2010, 15:07 PM
Para evitar inyecciones sql lo más fácil y seguro es simplemente utilizar prepared statements.

Saludos.


eso es un mito urbano eh, las prepared statements tmb son vulnerables. Pongo un link a una presentacion en la que se muestra todo eso y métodos pra protegerse y asi contesto tmb a Karcrack:  http://www.slideshare.net/billkarwin/sql-injection-myths-and-fallacies
Colaboraciones:
1 2

MazarD

#7
De leyenda urbana nada, tu enlace habla de stored procedures donde se está creando una sql dinámica, una vez más, concatenando valores a la consulta en lugar de hacer un bind del valor en un prepared statment.

Evidentemente si haces un prepare('select * from tabla where val='.$val) vas a tener problemas xD pero la idea es hacer:
prepare('select * from tabla where val=?'); bindParam(1, $val);

Que es lo normal cuando se usan prepared statements, sino que sentido tiene? si seguramente ni te va a cachear la siguiente consulta cuando cambies de valor?

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

tragantras

Te doy la total razón, pero estarás conmigo entonces en que tu frase era incorrecta (formalmente hablando), una prepared statement no es segura "per se" sino que lo es porque aporta procedimientos que la hacen segura.

Sin duda alguna, es la manera correcta de hacer aplicaciones seguras, un saludo =)

Colaboraciones:
1 2

el-brujo

están hablando de lo mismo en dos sitios diferentes a la vez  :P

¿cómo evitar inyección sql en php?  
http://foro.elhacker.net/php/iquestcomo_evitar_inyeccion_sql_en_php-t307274.0.html