Foros del Web » Programando para Internet » PHP »

Evitar SQL Injection

Estas en el tema de Evitar SQL Injection en el foro de PHP en Foros del Web. Hola a todos. En este código de consulta a MYSQL cómo podría evitar el SQL Injection? Código PHP: if(isset( $_GET [ 'url' ])){ $url  =  ...
  #1 (permalink)  
Antiguo 26/03/2011, 17:57
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 21 años, 4 meses
Puntos: 0
Evitar SQL Injection

Hola a todos.

En este código de consulta a MYSQL cómo podría evitar el SQL Injection?

Código PHP:
if(isset($_GET['url'])){
$url $_GET['url'];
database_connect();
$query "SELECT * from articulos where url = '$url'";
$result = @mysql_query($query); 
Es que me comentaron que si alguien entrara en midominio.com/articulo.php?url=blablabla <- desde aquí podrían atacarme. Me gustaría saber cómo evitarlo y aplicar algún filtrado a la variable $url antes de realizar la consulta.

Un saludo.

Última edición por PYTUFYN; 26/03/2011 a las 18:13
  #2 (permalink)  
Antiguo 26/03/2011, 18:15
 
Fecha de Ingreso: noviembre-2005
Mensajes: 426
Antigüedad: 19 años
Puntos: 87
Respuesta: Evitar SQL Injection

Correcto, hay podrian hacer una consulta SQL indeseada (sql Injection)

Para solucionar este problema 100% tienes que usar la funcion de php mysql_real_escape_string

Código PHP:
if(isset($_GET['url'])){ 
$url mysql_real_escape_string($_GET['url']); 
database_connect(); 
$query "SELECT * from articulos where url = '$url'"
$result = @mysql_query($query); 
  #3 (permalink)  
Antiguo 26/03/2011, 18:24
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: Evitar SQL Injection

Perfecto InKarC, muchísimas gracias por tu rápida y eficaz respuesta.
  #4 (permalink)  
Antiguo 26/03/2011, 18:38
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 21 años, 4 meses
Puntos: 0
Respuesta: Evitar SQL Injection

Como apunte:

Código PHP:
if(isset($_GET['url'])){ 
database_connect();
$url mysql_real_escape_string($_GET['url']); 
$query "SELECT * from articulos where url = '$url'"
$result = @mysql_query($query); 
La conexión a la base de datos la tuve que poner antes, sino me daba mil errores.
  #5 (permalink)  
Antiguo 26/03/2011, 18:41
 
Fecha de Ingreso: noviembre-2005
Mensajes: 426
Antigüedad: 19 años
Puntos: 87
Respuesta: Evitar SQL Injection

Nop, mysql_real_escape_string es una funcion php y no tiene nada ver con el momento en que haces la conexion.

Saludos.
  #6 (permalink)  
Antiguo 26/03/2011, 18:54
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Evitar SQL Injection

InKarC, segun el manual de php para mysql_real_escape_string(), SI se requiere una conexion activa, de lo contrario se generara un error tipo E_WARNING y devolverá FALSE.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 26/03/2011, 19:27
 
Fecha de Ingreso: noviembre-2005
Mensajes: 426
Antigüedad: 19 años
Puntos: 87
Respuesta: Evitar SQL Injection

Cita:
Iniciado por Triby Ver Mensaje
InKarC, segun el manual de php para mysql_real_escape_string(), SI se requiere una conexion activa, de lo contrario se generara un error tipo E_WARNING y devolverá FALSE.
Ok que raro, mucho bruto yo. Yo hago eso con objectos y no me percato de estos detalles.
  #8 (permalink)  
Antiguo 26/03/2011, 19:29
 
Fecha de Ingreso: noviembre-2005
Mensajes: 426
Antigüedad: 19 años
Puntos: 87
Respuesta: Evitar SQL Injection

Aqui una funcion que simula el accionar de mysql_real_escape_string() sin necesitar una conexion activa:

Código PHP:
Ver original
  1. <?php
  2. function mysql_escape_mimic($inp) {
  3.     if(is_array($inp))
  4.         return array_map(__METHOD__, $inp);
  5.  
  6.     if(!empty($inp) && is_string($inp)) {
  7.         return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp);
  8.     }
  9.  
  10.     return $inp;
  11. }
  12. ?>
  #9 (permalink)  
Antiguo 26/03/2011, 19:58
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Evitar SQL Injection

Cuando no se puede usar mysql_real_escape_string, está la función addslashes y addcslashes.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 26/03/2011, 21:40
 
Fecha de Ingreso: noviembre-2005
Mensajes: 426
Antigüedad: 19 años
Puntos: 87
Respuesta: Evitar SQL Injection

Cita:
Iniciado por abimaelrc Ver Mensaje
Cuando no se puede usar mysql_real_escape_string, está la función addslashes y addcslashes.
Falso, addslashes deja abierto huecos de seguridad como se puede apreciar en este articulo http://shiflett.org/blog/2006/jan/ad...-escape-string
  #11 (permalink)  
Antiguo 26/03/2011, 22:33
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Evitar SQL Injection

Muy buen artículo , mi intensión no es que se use solamente addslashes y addcslashes, en realidad yo he usado una función que nos enseñó un usuario de este foro, http://www.forosdelweb.com/3497564-post2.html
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #12 (permalink)  
Antiguo 26/03/2011, 23:06
Avatar de jpunk  
Fecha de Ingreso: octubre-2005
Ubicación: Bogota
Mensajes: 335
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Evitar SQL Injection

Disculpen siguiendo el enlace del manual de php para mysql_real_escape_string(), no acabo de comprender lo de conexión activa.

Alguna explicación rápida amigos ?
  #13 (permalink)  
Antiguo 26/03/2011, 23:25
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Evitar SQL Injection

jpunk, al decir "conexion activa" se refiere a que antes de usar cualquiera de las funciones mysql_* debes haber establecido una conexion con el servidor usando mysql_connect() o mysql_pconnect() para conexiones persistentes, de las cuales desconozco la utilidad.
__________________
- León, Guanajuato
- GV-Foto
  #14 (permalink)  
Antiguo 26/03/2011, 23:28
Avatar de jpunk  
Fecha de Ingreso: octubre-2005
Ubicación: Bogota
Mensajes: 335
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Evitar SQL Injection

ahh pero no tiene que ver con conexiones persistentes ?

eso de conexiones persistentes estaba leyendo y me parecia algo ya complejo
  #15 (permalink)  
Antiguo 26/03/2011, 23:30
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Evitar SQL Injection

No, nada que ver con conexiones persistentes, simplemente es un requisito el conectar al servidor MySQL, imagino que no querian meterse en problemas de "tal funcion si requiere estar conectado y tal otra no".
__________________
- León, Guanajuato
- GV-Foto
  #16 (permalink)  
Antiguo 26/03/2011, 23:35
Avatar de jpunk  
Fecha de Ingreso: octubre-2005
Ubicación: Bogota
Mensajes: 335
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Evitar SQL Injection

Gracias Triby por la pronta respuesta, bueno siendo así no tengo problema con lo que estoy realizando.

He vuelto a descansar je je
  #17 (permalink)  
Antiguo 27/03/2011, 08:33
 
Fecha de Ingreso: abril-2003
Ubicación: Vienna
Mensajes: 9
Antigüedad: 21 años, 7 meses
Puntos: 1
Respuesta: Evitar SQL Injection

Hola,
Soy nuevo en este asunto y tengo una plataforma en php; Mi pregunta, es como corregir el problema de SQL Injection completamente y también como cubrir los huecos de seguridad de php?

Saludos,

Tradock
  #18 (permalink)  
Antiguo 27/03/2011, 10:32
 
Fecha de Ingreso: diciembre-2010
Mensajes: 77
Antigüedad: 13 años, 10 meses
Puntos: 11
Respuesta: Evitar SQL Injection

Cita:
Iniciado por Tradock Ver Mensaje
Hola,
Soy nuevo en este asunto y tengo una plataforma en php; Mi pregunta, es como corregir el problema de SQL Injection completamente y también como cubrir los huecos de seguridad de php?

Saludos,

Tradock
Si lees el post desde arriba, hay bastantes soluciones, tambien hay otras que por muy tontas que parezcan tambien ayudan, como :

- No dar permisos de DROP al usuario que usas para las consultas en PHP, solo darle los permisos que necesita y en las tablas, bases de datos que necesita, como SELECT, INSERT, UPDATE...

Para los huecos de PHP, lo mejor es tener actualizado tu PHP a la version mas estable, y estar actualizado con los nuevos parches que salen..
__________________
Convert JSON to CSV

Etiquetas: injection, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:52.