Foros del Web » Programando para Internet » PHP »

Inyeccion SQL

Estas en el tema de Inyeccion SQL en el foro de PHP en Foros del Web. He tenido problemas de seguridad com mi web y le he pasado el programa Acunetix Web Vulnerability Scanner 4 para ver las causas y ha ...
  #1 (permalink)  
Antiguo 06/05/2007, 05:51
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Inyeccion SQL

He tenido problemas de seguridad com mi web y le he pasado el programa Acunetix Web Vulnerability Scanner 4 para ver las causas y ha econtrado varias cosas que he ido solucionando.

Tengo una duda. Tengo una consulta al BD:
Código:
$consulta = "SELECT * from contingut WHERE id = $id ";
					$res = mysql_query($consulta) or die ("No s'ha pogut fer la consulta");
y me dice que le codigo es vulnerable a inyecciones SQL. En cambio si les pongo comilla simples a la variable $id se soluciona el problema.

Código:
$consulta = "SELECT * from contingut WHERE id = '$id'";
					$res = mysql_query($consulta) or die ("No s'ha pogut fer la consulta");
Alguine podría explicarme el por que?
Seguramente tiene una explicación muy simple y de primero de PHP pero yo no veo la diferencia.
  #2 (permalink)  
Antiguo 06/05/2007, 05:55
Avatar de kaninox  
Fecha de Ingreso: septiembre-2005
Ubicación: In my House
Mensajes: 3.597
Antigüedad: 18 años, 7 meses
Puntos: 49
Re: Inyeccion SQL

por que te pueden hacer sentencias tipo

" or 1=1/*
' or 1=1/*
" or isnull(1/0)/*
' or insull(1/0)/*
0xbf27 or isnull(1/0)/*

logica ;)
__________________
Gokuh Salvo al mundo. PUNTO!!!!
  #3 (permalink)  
Antiguo 06/05/2007, 05:57
Avatar de Krammerkiller  
Fecha de Ingreso: septiembre-2006
Ubicación: En Cuba
Mensajes: 6
Antigüedad: 17 años, 6 meses
Puntos: 0
Re: Inyeccion SQL

Hay una diferencia entre las comillas simples y las comillas dobles
""se usan para captar cadenas substring o sea cadenas de caracteres inferiores a una cantidad de bytes que ahora no recuerdo.

'' se usan para captar cadenas de caracteres sin limites.

Ahora las inyecciones SQL tienen un cierto limite para funcionar y requieren de las comillas dobles ....ahora si les pones simples se les fastidio la cosa.
Espero haberte ayudado
  #4 (permalink)  
Antiguo 06/05/2007, 06:04
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Re: Inyeccion SQL

Muchas gracias por las aclaraciones.

Si hubiera puesto es esta consulta dentro de un if() esperando que la variable $id fuera un número del 1 al 27 :
Código:
	if ( $id < 27 ){
	$conexio = conectar($host,$usuariodb,$pwddb,$db) or die("No es pot conectar a la BD1 : " . mysql_error());
	$consulta = "SELECT * from contingut WHERE id = '$id'";
					$res = mysql_query($consulta) or die ("No s'ha pogut fer la consulta");

.......
.......
					}else{
					    echo "Informació no disponible.";
}
desconectar($conexio);
} else {
echo "OOOOOOOOOOOOOOOOO";
}
No se solucionaria el problema?
  #5 (permalink)  
Antiguo 06/05/2007, 06:30
Avatar de kaninox  
Fecha de Ingreso: septiembre-2005
Ubicación: In my House
Mensajes: 3.597
Antigüedad: 18 años, 7 meses
Puntos: 49
Re: Inyeccion SQL

no entiendo tu problema o sea tu pregunta :/
solucion a que :/ eso es solo una consulta de $id < 27 que pasa si $id vale 80 no lo hace nunca eso numas te puedo decir pero no entiendo....
a que va enfocado? el codigo esta bien lo veo yo algo desordenado pero son gustos na mas :P ham esto pa que es
desconectar($conexio);
} else {
echo "OOOOOOOOOOOOOOOOO";
}

:/ no hace na
__________________
Gokuh Salvo al mundo. PUNTO!!!!
  #6 (permalink)  
Antiguo 06/05/2007, 06:51
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Re: Inyeccion SQL

El codigo no esta entero.
La pregunta es si pongo la consulta a la BD dentro de un IF en el que se ejecute el código si el valor de $id esta entre los números 1 al 27 hay posibilidad de que te inyecten codigo SQL.

Solucion a que te inyecten codigo SQL.
  #7 (permalink)  
Antiguo 06/05/2007, 09:07
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Inyeccion SQL

Cita:
Iniciado por da2 Ver Mensaje
El codigo no esta entero.
La pregunta es si pongo la consulta a la BD dentro de un IF en el que se ejecute el código si el valor de $id esta entre los números 1 al 27 hay posibilidad de que te inyecten codigo SQL.
Si es que no haces ningún tipo de conversión a entero del valor de $id, si.

El siguiente ejemplo demuestra lo que digo:
Código PHP:
$id "1' or 1 #";
if ( 
$id && $id 27 ) {
    
$consulta "SELECT * FROM tabla WHERE id = '$id'";
    echo 
$consulta;

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #8 (permalink)  
Antiguo 06/05/2007, 11:12
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Re: Inyeccion SQL

Estoy muy desconcertado. Esto funciona incluso con la variable entre '', '$id'.
No hay nada seguro?
Por cierto para convertir a entero es $id = (int)$id; no?

Gracias por vuestra paciencia
  #9 (permalink)  
Antiguo 06/05/2007, 11:41
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
Re: Inyeccion SQL

Cita:
Iniciado por Krammerkiller Ver Mensaje
Hay una diferencia entre las comillas simples y las comillas dobles
""se usan para captar cadenas substring o sea cadenas de caracteres inferiores a una cantidad de bytes que ahora no recuerdo.

'' se usan para captar cadenas de caracteres sin limites.

Ahora las inyecciones SQL tienen un cierto limite para funcionar y requieren de las comillas dobles ....ahora si les pones simples se les fastidio la cosa.
Espero haberte ayudado
La verdad que lo que dices acá nunca lo escuche... pero me gustaría que te explayes un poco más sobre el tema.

Cita:
Iniciado por da2 Ver Mensaje
Estoy muy desconcertado. Esto funciona incluso con la variable entre '', '$id'.
No hay nada seguro?
Por cierto para convertir a entero es $id = (int)$id; no?

Gracias por vuestra paciencia
Si, eso se llama casting también tienes una función para hacer lo mismo ( settype() ).


Lo que te puedo aconsejar yo es que si esperas una variable que sea un entero compruebes que lo es y si no lo es que intentes convertirlo si todo lo anterior falla hay algo raro .
Otra cosa es que verifiques si la magic_quotes están activadas y sino lo están que escapes las cadenas con addslashes(). Siempre tienes que tener claro en que estado están las variables (si están o no escapadas).
Otra cosa que puede ayudar es que si esperas una cadena pero no mayor a 3 caracteres que también lo verifiques con strlen() y si es mayor das un error.
No dejes que salte ningún error e intenta que los errores sean personalizados por vos.
Nunca, pero nunca uses una variable "desconocida" directamente en una consulta a la DB.
Otra cosa que puedes hacer es configurar un usuario en MySql (o el motor de turno) solo con derechos de lectura y en aquellos lugares que accedas solo para consultar usar este usuario, nunca accedas con un usuario con muchos privilegios si no los necesitas.

Bueno, así puedo seguir un rato largo pero el mejor consejo es "usa tu sentido común" pero a veces este sentido es el menos común

Saludos.
  #10 (permalink)  
Antiguo 06/05/2007, 12:39
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Re: Inyeccion SQL

Muchas gracias por los consejos, ahora tengo las cosas un poco más claras.
Una preguntilla; que son magic_quotes? Se configura en el server?
Bién, he buscado información y veo que addslashes() pone una barra invertida delante de los caracteres comilla simple ('), comilla doble ("), barra invertida (\) y NUL (el byte NULL). Supongo que "escapar" sera poner esa barra-

La única pena de la programación en PHP es que el tiempo que te ahorra el lenguaje por un lado tienes que perderlo comprobando y pensando que trastada te pueden hacer.

Sobre lo de los errores personalizados pensaba en crear una pagina web por defecto que mande un correo electronico al administrador con la ip del usuario. Pero de momento no tengo ni idea de como hacerlo.
  #11 (permalink)  
Antiguo 06/05/2007, 14:34
Avatar de da2
da2
 
Fecha de Ingreso: abril-2003
Ubicación: Catalunya
Mensajes: 239
Antigüedad: 21 años
Puntos: 0
Re: Inyeccion SQL

Cita:
Iniciado por DarioDario Ver Mensaje
...
Otra cosa que puede ayudar es que si esperas una cadena pero no mayor a 3 caracteres que también lo verifiques con strlen() y si es mayor das un error.
...
Un pequeño apunte. Si a la variable le pones por ejemplo el valor "20'voy por ti" lo que hay detrás de ' no lo contabiliza.
Perdón! si lo tiene todo en cuento. El que no ha tenido en cuenta era yo que había tasformado la variable con settype($id, "integer");

Última edición por da2; 06/05/2007 a las 14:38 Razón: Falso
  #12 (permalink)  
Antiguo 05/04/2008, 01:02
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 1 mes
Puntos: 20
Re: Inyeccion SQL

usa esta funcion para todas las variables externas $_GET $_POST $_COOKIE etc...

Código PHP:

if (!function_exists("GetSQLValueString")) {
function 
GetSQLValueString($theValue$theType$theDefinedValue ""$theNotDefinedValue ""
{
  
$theValue get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  
$theValue function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch (
$theType) {
    case 
"text":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;    
    case 
"long":
    case 
"int":
      
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case 
"double":
      
$theValue = ($theValue != "") ? "'" doubleval($theValue) . "'" "NULL";
      break;
    case 
"date":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;
    case 
"defined":
      
$theValue = ($theValue != "") ? $theDefinedValue $theNotDefinedValue;
      break;
  }
  return 
$theValue;
}

ejemplo de llamando a la funcion:

Código PHP:
$variable=GetSQLValueString($_GET['Id'],"int"); 
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 10:15.