Foros del Web » Programando para Internet » PHP »

Ayuda con consultas GET e inyección a mysql

Estas en el tema de Ayuda con consultas GET e inyección a mysql en el foro de PHP en Foros del Web. Saludos amigos. Estoy buscando ayuda con este problema que tengo, no estoy seguro totalmente si se trata de inyección a mysql, ya que no se ...
  #1 (permalink)  
Antiguo 20/01/2008, 12:24
Avatar de pepejaguar  
Fecha de Ingreso: enero-2005
Ubicación: Guatemala
Mensajes: 76
Antigüedad: 19 años, 3 meses
Puntos: 0
Pregunta Ayuda con consultas GET e inyección a mysql

Saludos amigos.

Estoy buscando ayuda con este problema que tengo, no estoy seguro totalmente si se trata de inyección a mysql, ya que no se ha logrado entrar a la base de datos ni modificarla, pero seguro están tratando de atacarla.

El asunto es:

Desde una de las páginas que he creado, una de las consultas típicas que se realizan es:

Código PHP:
index.php?uno=ABC&dos=CDE 
Donde uno y dos son las variables y ABC y CDE los datos a consultar, esta consulta devuelve los valores correspondientes.

Sin embargo he notado que se hacen las consultas siguientes:

Código PHP:
index.php?uno=ABC&dos=http://dominio.malicioso/inyeccion 
Lo que deseo básicamente es evitar que se pueda hacer algún tipo de modificación a través del dominio malicioso en esa consulta y lo segundo es que se ejecute alguna página de error 404 ó 403

Las consultas se realizan con este cógigo típico:

Código PHP:
$datos mysql_query("SELECT campo1,campo2 FROM tabla
WHERE uno = '$uno' AND dos = '$dos' ORDER BY campo3 DESC"
);
while (
$row mysql_fetch_array($datos)) {
// operaciones varias

Cualquier ayuda que me puedan proporcionar voy a estar muy agradecido.

Saludos.

Última edición por pepejaguar; 20/01/2008 a las 13:09
  #2 (permalink)  
Antiguo 20/01/2008, 12:33
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Ayuda con consultas GET e inyección a mysql

Para evitar el sql injection tienes varios métodos en PHP. Uno de ellos, y creo el más seguro es usar la función mysql_real_escape_string():

Código PHP:
$uno mysql_real_escape_string($uno);
$dos mysql_real_escape_string($dos);
 
$datos mysql_query("SELECT campo1,campo2 FROM tabla 
WHERE uno = '$uno' AND dos = '$dos' ORDER BY campo3 DESC"
); 
Date una vulta por este tema:

http://www.forosdelweb.com/f18/sufic...on-sql-545675/

Un saludo,

Última edición por okram; 20/01/2008 a las 12:57
  #3 (permalink)  
Antiguo 20/01/2008, 12:54
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Ayuda con consultas GET e inyección a mysql

Además del mysql_real_escape_string siempre es recomendable validar todas las variables, si tiene que ser un valor numerico, que sólo sean números; si tiene que tener una longitud en concreto, que la tenga; si tienen que ser sólo letras y números, que lo sean; etc...

Y si quieres evitar que borren o modifiquen datos en la BDD, puedes usar un usuario que sólo tenga permisos para realizar consultas.
  #4 (permalink)  
Antiguo 20/01/2008, 15:33
Avatar de pepejaguar  
Fecha de Ingreso: enero-2005
Ubicación: Guatemala
Mensajes: 76
Antigüedad: 19 años, 3 meses
Puntos: 0
De acuerdo Re: Ayuda con consultas GET e inyección a mysql

Okram muchas gracias por el consejo, con respecto a la función que publicaste en: http://www.forosdelweb.com/f18/sufic...5/#post2238132

¿Es complementaria a lo que publicaste mas arriba o viene a ser lo mismo pero escrito de otra forma?

Keysher gracias por la ayuda, serías tan amable de proporcionarme algunos ejemplos o referencias para validar las variables así como lo mencionas, números, textos y texto-número.

Muy agradecido con ambos.

Saludos.
  #5 (permalink)  
Antiguo 20/01/2008, 15:50
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Ayuda con consultas GET e inyección a mysql

Eso depende de las condiciones que tengan que tener los valores. Primero tienes que definir bien qué tipo de valores pueden tener y luego ya buscar el mejor método para hacerlo. Ya sea con funciones propias de PHP (is_numeric, por ejemplo) como con expresiones regulares.
  #6 (permalink)  
Antiguo 20/01/2008, 17:35
Avatar de pepejaguar  
Fecha de Ingreso: enero-2005
Ubicación: Guatemala
Mensajes: 76
Antigüedad: 19 años, 3 meses
Puntos: 0
Re: Ayuda con consultas GET e inyección a mysql

Cita:
Iniciado por Keysher Ver Mensaje
Eso depende de las condiciones que tengan que tener los valores. Primero tienes que definir bien qué tipo de valores pueden tener y luego ya buscar el mejor método para hacerlo. Ya sea con funciones propias de PHP (is_numeric, por ejemplo) como con expresiones regulares.
Gracias Keysher, podrías especificarme un poco mas, los valores pueden ser de los tres tipos, solo números, solo texto y números y texto.

Saludos.
  #7 (permalink)  
Antiguo 20/01/2008, 19:11
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Ayuda con consultas GET e inyección a mysql

La función que publiqué en ese post es alternativa. Verás, mysql_real_escape_string() existe sólo a partir de PHP >= 4.3.0, y aunque es muy muy muy poco probable que tengas instalada una versión más antigua que esa, podría darse el caso. En todo caso, la finalidad de esta función es adaptar la consulta l tipo de contenido, escapando los caracteres potencialmente peligroso y colocando entre comillas simples (') los valores no numéricos. Su uso es:

Código PHP:
 
$id 
2432;
$password "abcd'ef";
$estado null;
 
$sql sprintf("SELECT * FROM tabla WHERE id=%s AND password=%s AND estado=%s",
                
mysql_escape($id),
                
mysql_escape($password),
                
mysql_escape($estado));
 
echo 
$sql//SELECT * FROM tabla WHERE id=2342 AND password='abcd\'ef' AND estado='' 
Pero como te digo, yo uso esa función simplemente por comodidad. Pero no hay ninguna diferencia entre usar tan solo mysql_real_escape_string() a secas.

Un saludo,
  #8 (permalink)  
Antiguo 20/01/2008, 21:01
Avatar de pepejaguar  
Fecha de Ingreso: enero-2005
Ubicación: Guatemala
Mensajes: 76
Antigüedad: 19 años, 3 meses
Puntos: 0
Pregunta Re: Ayuda con consultas GET e inyección a mysql

Okram: muchas gracias por tu valiosa ayuda. En este momento estoy implementando los mysql_real_escape_string() en mis consultas.

Ahora para evitar que se ejecute

Código PHP:
index.php?uno=ABC&dos=http://dominio.malicioso/inyeccion 
bastaría con los mysql_real_escape_string() o tendría que usar además un is_string() ya que los datos consultados pueden ser números, texto o ambos y en ocasiones pueden ser palabras separadas por un espacio o agrupadas con un signo + (mas)

Saludos y gracias por la ayuda.

Última edición por pepejaguar; 21/01/2008 a las 12:33
  #9 (permalink)  
Antiguo 21/01/2008, 14:53
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Ayuda con consultas GET e inyección a mysql

Depende de la funcion que tenga en tu sitio la variable $_GET['dos']. Si vas a insertarlos en una base de datos, la elección sería mysql_real_escape_string(), si vas a usar ese valor para determinar una acción, con un switch bastaría. Si vas a imprimirlo en pantalla, tienes funciones como htmlentities() y htmlspecialchars(). Qué uso le darás a esa variable?

Un saludo,
  #10 (permalink)  
Antiguo 23/01/2008, 08:51
Avatar de pepejaguar  
Fecha de Ingreso: enero-2005
Ubicación: Guatemala
Mensajes: 76
Antigüedad: 19 años, 3 meses
Puntos: 0
Pregunta Re: Ayuda con consultas GET e inyección a mysql

Cita:
Iniciado por okram Ver Mensaje
Depende de la funcion que tenga en tu sitio la variable $_GET['dos']. Si vas a insertarlos en una base de datos, la elección sería mysql_real_escape_string(), si vas a usar ese valor para determinar una acción, con un switch bastaría. Si vas a imprimirlo en pantalla, tienes funciones como htmlentities() y htmlspecialchars(). Qué uso le darás a esa variable?

Un saludo,
Las dos variablea $_GET['uno'] y $_GET['dos'] forman parte de un buscador, consultando en la base de datos y luego imprimiendo en pantalla lo consultado, además los dos $_GET se agregan a una tabla en la BD para después saber que términos se han utilizado con mayor frecuencia en las consultas del buscador.

¿Cual opción me recomendás?

Saludos.
  #11 (permalink)  
Antiguo 23/01/2008, 15:50
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Ayuda con consultas GET e inyección a mysql

Si forma parte de un buscador debes asegurarte de:

1. Que no contenga código HTML o JS dañino
2. Evitar el SQL injection
3. Limitar la cadena de búsqueda.

Para el punto 1 tienes las funciones htmlentities() o htmlspecialchars(), dependiendo de cómo guardes los datos en la BD.

Para 2, tienes las funciones ya descritas más arriba.

Y finalmente, para limitar longitud de la cadena, tienes las funciones strlen() y substr().

Un saludo,
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 17:36.