Foros del Web » Programando para Internet » PHP »

Prevenir un SQL-INJECTION

Estas en el tema de Prevenir un SQL-INJECTION en el foro de PHP en Foros del Web. Hola a todos!! En esta ocacion, quiero consultar a todos, estoy haciendo un buscador, funciona a la perfeccion, dicho buscador genera una sentencia SQL la ...
  #1 (permalink)  
Antiguo 04/01/2005, 22:17
Avatar de stock  
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 13 años, 5 meses
Puntos: 53
Prevenir un SQL-INJECTION

Hola a todos!!

En esta ocacion, quiero consultar a todos, estoy haciendo un buscador, funciona a la perfeccion, dicho buscador genera una sentencia SQL la cual regresara los registros encontrados, Lo que quiero hacer es ponerle eguridad a esto, por que pues asi como esta es muy facil poder hacer un SQL-INJECTION, por ahora y tengo una solucion, pero creo que no es la mejor, anyway, este es el codigo:

Código PHP:
<?
$PtrDb 
mysql_connect("localhost","CV4","****")or die ('No se puede conectar con la DB por que: ' mysql_error());
mysql_select_db("mybase");

$masdeuno="NO";
$sql="SELECT * FROM perfiles WHERE ";
$tam=strlen($sql);
if(
$matricula!="")
    
$sql.="Matricula='$matricula'";
else{
    if(
$nombre!=""){
        
$sql.="Nombre LIKE '%$nombre%'";
        
$masdeuno="SI";
    }
    if(
$apellido!=""){
        if(
$masdeuno=="SI")
            
$sql.=" AND ";
        
$sql.="Apellidos LIKE '%$apellido%'";
        
$masdeuno="SI";
    }
    if(
$residencia!=""){
        if(
$masdeuno=="SI")
            
$sql.=" AND ";
        
$sql.="Residencia='$residencia'";
        
$masdeuno="SI";
    }
    if(
$sexo!=""){
        if(
$masdeuno=="SI")
            
$sql.=" AND ";
        
$sql.="Genero='$sexo'";
        
$masdeuno="SI";
    }
    if(
$ciudad!=""){
        if(
$masdeuno=="SI")
            
$sql.=" AND ";
        
$sql.="Ciudad='$ciudad'";
        
$masdeuno="SI";
    }
    if(
$estado!=""){
        if(
$masdeuno=="SI")
            
$sql.=" AND ";
        
$sql.="Estado='$estado'";
        
$masdeuno="SI";
    }
    if(
$pais!=""){
        if(
$masdeuno=="SI")
            
$sql.=" AND ";
        
$sql.="Pais='$pais'";
        
$masdeuno="SI";
    }
}
//echo $sql."<br><br>";

if(strlen($sql)>$tam)
    
$res=mysql_query($sql,$PtrDb);
else{
    echo 
"Necesitas poner algo para buscar, no seas  FOOL";
    exit();
}

while(
$Info=mysql_fetch_assoc($res)){
    echo 
"Matricula: ".$Info['Matricula']."<br>";
    echo 
"Nombre: ".$Info['Nombre']."<br>";
    echo 
"Apellido: ".$Info['Apellidos']."<br>";
    echo 
"Residencia: ".$Info['Residencia']."<br>";
    echo 
"Sexo: ".$Info['Genero']."<br>";
    echo 
"Ciudad: ".$Info['Ciudad']."<br>";
    echo 
"Estado: ".$Info['Estado']."<br>";
    echo 
"Pais: ".$Info['Pais']."<br><br>";
}
?>
Ok, como vez es un buscador de personas, las busca deacuerdo a los datos introducidos en un formulario, como vez no estan validadas las entradas.

Para evotar el SQL-INJECTION pues se me ocurre, por ejemplo para la matricula, pues verificar que todos sean numeros, si hay una letra colada, pues entonces no se ahce nada, para la varible del nombre, pues determino un numero maximo de caracteres para este el cual sera el que tenga el nombre mas largo en la base de datos, para el apellido igual, i algo similar con las otras variables.

esta es mi solucion al problema, pero estoy seguro habra una mejor, espero y me puedan aconsejar y ayudar.

thanks

Última edición por stock; 04/01/2005 a las 22:19
  #2 (permalink)  
Antiguo 05/01/2005, 01:45
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

En http://www.php.net/manual/en/security.database.php tienes una seccion dedicada al sql injection (basicamente comprobar/modificar el tipo de datos de la entrada y escapar los caracteres peligrosos).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
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 17:55.