Autor Tema: Consultas Seguras y evitar SQL injection - Mysql y PHP - *-*  (Leído 1220 veces)

4ng3r

  • Moderador
  • Mensajes: 145
    • Ver Perfil
    • 4ng3r Blog
    • Email
Hola a todo, primero me surgió la duda en mi trabajo de como enviar consultas seguras a la base de datos me puse en la tarea de leer un poco acerca del tema y asi fue como solucione el tema, espero que sea la mejor manera de hacerlo:

¿Que es SQL injection?

Cita
Es una vulnerabilidad informática en el nivel de la validación de las entradas a la base de datos de una aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las partes del programa con código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o de script que esté incrustado dentro de otro.

Por lo general cuando nosotros estamos c0d34ndo hacemos lo siguiente:

Código: (php) [Seleccionar]
<?php 
$query 
"SELECT * FROM users WHERE id=' $id'";
mysql_query($query);
?>


Esta es una consulta vulnerable, entonces la solución que le doy al problema es utilizar dos funciones incluidas en PHP que se llaman mysql_escape_string para mejar como texto la variable que esta en la comillas y sprintf para dar el formato de a la cadena, el ejemplo queda algo asi:

Código: (php) [Seleccionar]
<?php 
$query 
"SELECT * FROM users WHERE id=%d";
mysql_real_escape_string($id);
mysql_query($query);
?>


PDD: Si conocen otro método, compartelo y comparemos cual es el mejor, salu2

FUNTE
« Última Modificación: enero 03, 2010, 08:33:20 pm por 4ng3r »

Phicar

  • :P
  • Administrador
  • Mensajes: 283
  • (1+sqrt(5))/2
    • MSN Messenger - diego_villahacker@hotmail.com
    • Ver Perfil
    • Phicar's Blog
    • Email
Re: Consultas Seguras y evitar SQL injection - Mysql y PHP - *-*
« Respuesta #1 : enero 05, 2010, 01:30:19 am »
ehhh eso si funca??

Cita
<?php
$query = "SELECT * FROM users WHERE id=%d";
mysql_real_escape_string($id);
mysql_query($query);
?>

creo que es asi ;)

<?php
$query = sprintf("SELECT * FROM users WHERE id=%d",mysql_real_escape_string($id));
mysql_query($query);
?>


Saludos ;)

:)

my.opera.com/phicar

4ng3r

  • Moderador
  • Mensajes: 145
    • Ver Perfil
    • 4ng3r Blog
    • Email
Re: Consultas Seguras y evitar SQL injection - Mysql y PHP - *-*
« Respuesta #2 : enero 05, 2010, 03:27:56 pm »
Corrijo el c

[D-m-K]

  • Administrador
  • Mensajes: 229
  • [-.|.-]
    • MSN Messenger - d4rk.m0nk3y@hotmail.com
    • Ver Perfil
    • Red Informatica Colombiana
    • Email
Re: Consultas Seguras y evitar SQL injection - Mysql y PHP - *-*
« Respuesta #3 : enero 05, 2010, 08:46:30 pm »
Bueno otra forma de evitar esto (Aunque no garantiza el 100% de la restricciones para las  inyecciones pero sirve de mucho), es la configuracion en el archivo php.ini de la siguiente manera.

Deshabilitar las comillas seg
:: Todas las grandes cosas que se disfrutan son el producto de las pequeñas cosas que se logran ::

manix

  • Moderador
  • Mensajes: 28
    • Ver Perfil
    • Email
Re: Consultas Seguras y evitar SQL injection - Mysql y PHP - *-*
« Respuesta #4 : enero 15, 2010, 02:16:48 pm »
Tambien se encuentra una forma mas pulida usando una extencion de php llamada mysqli, esta es una manera poco habitual pero es bueno que la tengamos en cuenta.

se crea la conexion:
Código: (php) [Seleccionar]
$conexion = new mysqli("localhost", "usuario", "contrasena", "base_datos");

Se prapara la consulta antes de ser ejecutada, si usted necesita pasarle parametros a la consulta entonces se debe poner un ? )signo de pregunta) donde ira la variable
Código: (php) [Seleccionar]
$consulta = $conexion->prepare("SELECT nombre, edad FROM usuarios WHERE id = ? and pais = ?");

Con la ayuda de bind_param, se pasan las variables a ser reemplazas por el ? segun el orden. Y es aca donde esta la magia de la seguridad.
Código: (php) [Seleccionar]
$consulta ->bind_param( "is", 4, "costa rica" );
Notar que el primer parametro realmente equivale a dos valores: i y una s, que especifican que los proximos paramtros seran un integer y un string respectivamente

Se ejecuta la consulta
Código: (php) [Seleccionar]
$resultado = $consulta->execute();
« Última Modificación: enero 15, 2010, 02:28:21 pm por manix »

merlyn

  • Visitante
Re: Consultas Seguras y evitar SQL injection - Mysql y PHP - *-*
« Respuesta #5 : marzo 27, 2010, 01:47:36 am »
Hola colega,
Lo que habria que hacer es efectuar una validacion de entrada y salida. La validacion es:
1: canonicalizacion: es convertir un entrada en un formado unico, utf-8 por ejemplo
2: sanizacion: es escapar los caracteres potencialmente peligroso y que tienes que permitir, puedes hacerlo con funciones como mysql_real_escape o htmlspecialchars o similares. Obviamente si no tienes que permitir estos caracteres no necesitas escaparlos ya que en la siguiente fase los detectaria y no acpetas la entrada. Por ejemplo, la comilla en un email no hay que permitirla, pero en un apellido puede que se tenga que permitir, entonces si hay que permitirla se escapa
3: validacion datos entrada y salida: es verificar que lo que te llega es lo que te espera. o sea hay que verificar espacio de caracteres o rango de numeros, formado, tama