Foros del Web » Programando para Internet » PHP »

Sobre las inyecciones Sql

Estas en el tema de Sobre las inyecciones Sql en el foro de PHP en Foros del Web. Quisiera saber como protejer mis paginas php-mysql contra las inyecciones, tanto sql como de codigo, y como se hacen? mas que nada para evitar-lo saludos...
  #1 (permalink)  
Antiguo 17/06/2005, 08:23
Avatar de TCL_ZIP  
Fecha de Ingreso: noviembre-2003
Ubicación: Esporles, Mallorca, España
Mensajes: 690
Antigüedad: 21 años
Puntos: 4
Sobre las inyecciones Sql

Quisiera saber como protejer mis paginas php-mysql contra las inyecciones, tanto sql como de codigo, y como se hacen? mas que nada para evitar-lo


saludos
  #2 (permalink)  
Antiguo 17/06/2005, 08:35
Avatar de raffskizze  
Fecha de Ingreso: marzo-2004
Ubicación: ...
Mensajes: 433
Antigüedad: 20 años, 8 meses
Puntos: 0
tcl suena a grupo hacker :P

Por lo que yo tengo entendido la mejor forma de evitalarlas es poniendo las variables globales a off del apache, y programando asi tu página, ademas en las consultas a sql que hagas con variables que se pasen por get, usar encadenamiento de variables para pasar las consultas "consulta= Selec * from tabla where nombre=".$_GET["nombre"];
__________________
echo ( www.tutorial-enlace.net == tutoriales gratis ) ? 'Aprenderas gratis !!' : 'No aprenderas !!';
  #3 (permalink)  
Antiguo 17/06/2005, 09:22
Avatar de TCL_ZIP  
Fecha de Ingreso: noviembre-2003
Ubicación: Esporles, Mallorca, España
Mensajes: 690
Antigüedad: 21 años
Puntos: 4
jajaja, si muy hacker... eso fue el cabron k me jodio una web la semana pasada :S

Tenia las variables superglobales desactiadas y las sentencias como tu dices i con comillas, es decir:

sql= "Select * From tabla Where ID=" & $_POST['id'] & " ";

y me hicieron la pua per aqui creo, alguien sabe como evitar que te la hagan y como te la pueden hacer?
  #4 (permalink)  
Antiguo 17/06/2005, 10:45
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 19 años, 5 meses
Puntos: 2
buenas, voy a explicarte un poco de que se trata esto...
Por ejemplo cuando tenemos q validar a un usuario la consulta sql es algo asi
Código:
"select * from TablaUsuario where nomb = ".$_GET['usu']." and pass = ".$_GET['pass'].""
pero q pasa si el atacante inserta algo q no corresponde, por ejemplo en el lugar del pass te pone asi "estepass" or pass != "" ... el color naranja es el pass q tendria q haber sido pasado por GET... entonces la consulta con inyeccion esa quedaria asi....
Código:
"select * from TablaUsuario where nomb = "UsuarioGET" and pass = "estepass" or pass != ""
entonces (aclaro la sintaxis no esta del todo bien es solomente de ejemplo para poder explicarlo) pasandonos por GET nos pasaron el nombre de usuario "UsuarioGET" y en lugar del pass nos paso " estepass or pass != "" ....
como el usuario lo va a encontrar y cuando se compare el pass dira q es incorrecto pero el " or pass != "" " como el campo pass siempre es distinto a NULL se podria logear con cualquier usuario... la unica frma de evitar esto es mediante el script en php se depure el string pasado, primero q nada sacando los caracteres "$%&/()@#;" porq estos se pueden usar en contra sulla y tener claro de limitar la cantidad de caracteres para los usuarios y los pass, por ejemplo el nombre de usuarios yo no permito q sean mayores a 15 digitos y los pass a 10, y cuando reciven los script de php verifico q no sean mayores a esos valores, si lo son hay un intento de hack... otra buena forma de evitar algunas cosas es q se encripte el pass del usuario y se guarde ya encriptado en la base de datos, y cada vez q se quieran logear solamente hay q encriptarlo y despues comparar el pass ingresado con el pass guardado...
aca dejo como manejo mas o menos los script contra esto, aclaro no es la mejor forma pero si bastante buena y nada complicada para entender...
Código PHP:
$pass $_POST['pass'];
$user $_POST['usuario'];

if(
$user != null and $pass != null)
{
        if( 
strlen($user) > 15 OR strlen($pass) > 10)
        {
                 exit(
"El Nombre de usuario o contraseña son mayores de lo permitido. vuelva atras e intentelo de nuevo.");
         }

        
//Saco los caracteres especiales...
        
$user eregi_replace("[<>%&'|!--.]","",$user);
        
$pass eregi_replace("[<>%&'|!--.]","",$pass);

        
$usercomp strtolower($user);

        
$base = new data_base;

        
$sql "select * from usuarios where nomb_user = '".$usercomp."' and password = '".md5($pass)."'"
despues es solamente enviar la consulta a MySql.... espero q te sirva de algo... cualquier cosa escribeme [email protected] ... saludos
  #5 (permalink)  
Antiguo 17/06/2005, 10:59
 
Fecha de Ingreso: diciembre-2003
Mensajes: 218
Antigüedad: 20 años, 11 meses
Puntos: 0
Una opcion algo mas comoda podria ser la siguiente.

Código PHP:
"SELECT * FROM TABLA WHERE CAMPO='".$_GET['valorGET']."';" 
de esta forma si te quieren hacer un UNION o alguna otra cosa obtendrias el siguiente resultado.

Código PHP:
SELECT FROM TABLA WHERE CAMPO='valor UNION SELECT * FROM TABLAPRIVADA'
Lo cual daria error o no devolveria nada.

Un saludo.
__________________
SymbianForever
SymbianForever.com, todo sobre y para tu symbian
aNieto2K | Themes para WordPress
De todo un poco
  #6 (permalink)  
Antiguo 17/06/2005, 11:26
Avatar de raffskizze  
Fecha de Ingreso: marzo-2004
Ubicación: ...
Mensajes: 433
Antigüedad: 20 años, 8 meses
Puntos: 0
pero si en ves de usar GET usas POST para pasar los formularios, con la clave y el user y ademas las variables globales a OFF, esta forma de hackear seria inutil desde mi punto de vista... por que no podrian ingresarte variables mediante la url los juakers... como el ejemplo que explico dario dario.
__________________
echo ( www.tutorial-enlace.net == tutoriales gratis ) ? 'Aprenderas gratis !!' : 'No aprenderas !!';
  #7 (permalink)  
Antiguo 17/06/2005, 12:14
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 19 años, 5 meses
Puntos: 2
Cita:
Iniciado por raffskizze
pero si en ves de usar GET usas POST para pasar los formularios, con la clave y el user y ademas las variables globales a OFF, esta forma de hackear seria inutil desde mi punto de vista... por que no podrian ingresarte variables mediante la url los juakers... como el ejemplo que explico dario dario.
buenas, por el metodo POST no se puede pasar variables ni valores en la URL pero el problema es q este es un punto demaciado facil de saltear, lo esencial de la seguridad contra sql inyeccion es la depuracion de los string en el codigo, a demas de un buen estudio sobre las tablas, ah y sobre todo trata de manejar los errores vos no dejes q los errores q se producen lo informe php porq cuando se producen errores es cuando a los hacker mas informacion se le da, asiq trata de manejar todos los errores...

Spyn_ET tienes razon esa es una forma comoda tambien de de agregar seguridad pero no es del toda segura, por ejemplo supongamos q desarrollamos un paginador de resultados, y cuando queremos ver los otros 30 resultados lo pasamos por URL, la consulta sql quedaria...
Consulta correcta:
Código:
select * from alimentos where = 'manzana' limit 30,30;
Consulta erronea:
Código:
select * from alimentos where = 'manzana' limit '30','30';
pero que pasaria si en vez de pasar numeros el atacante modifica e inyecta otra consulta o un DELETE o lo que sea... ese es un error tipico y en la consulta el limite no se puede poner con comillas, entonces es un error potencial y por lo tanto yo recomiendo acostumbrar la depuracion de string, por ejemplo los valores pasados por GET o POST para la paginacion es convertir la cadena en un integer con settype($loquesea,'integer');...
espero que sea alla entendido....
  #8 (permalink)  
Antiguo 17/06/2005, 12:40
Avatar de TCL_ZIP  
Fecha de Ingreso: noviembre-2003
Ubicación: Esporles, Mallorca, España
Mensajes: 690
Antigüedad: 21 años
Puntos: 4
muchisimas hacias!! ;);) me habeis ayudado mucho, haver si consigo que no me vuelvan a hackear
  #9 (permalink)  
Antiguo 17/06/2005, 14:51
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años, 5 meses
Puntos: 2
Cita:
pero si en ves de usar GET usas POST para pasar los formularios, con la clave y el user y ademas las variables globales a OFF, esta forma de hackear seria inutil desde mi punto de vista... por que no podrian ingresarte variables mediante la url los juakers... como el ejemplo que explico dario dario.
El echo es que esto no te asegura en lo mas minimo que no te envien datos, ya que un persona maliciosa pude reproducir tu forma e instalarla en otro servidor e enviar los datos a tu script y realizar una consulta no autorizada.

Código PHP:
"SELECT * FROM TABLA WHERE CAMPO='".$_GET['valorGET']."';" 
Este ejemplo puede ser salteado agragando a la consulta mediante la variable valorGET lo siguiente
Código PHP:
valor' UNION SELECT * FROM TABLAPRIVADA WHERE CAMPO != ' 
Con lo que la consulta quedaria de la siguiente forma
Código PHP:
SELECT FROM TABLA WHERE CAMPO='valor' UNION SELECT FROM TABLAPRIVADA WHERE CAMPO != '' 
Obviamente este tipo de consulta realmente queda avolida mediante el escapado de las comillas con funciones como:
  • magic_quotes_gpc
  • addslashes()
  • mysql_real_escape_string
Por dar algunos ejemplos, habra que consultar las que proporocione cada api para acceso a base de datos.
En el ultimo ejemplo como bien se comento en los casos que se pasen variables que esperan valores numericos lo mejor es convertir los datos que llegan al script al tipo que se requiera.
Otra cosa mas la funcion mysql_query no puede procesar dos consultas en una misma sentencia, asi que en ultimo ejemplo no aplica que envie un delete, update o similares. Para la version de la api que trabaja con php 5 hay que tener cuidado ya que hay una funcion que es mysqli_multi_query la cual si no se hace una validacion de datos adecuda puede dejar pasar una consulta que no esperemos y causar un desastre. Para otra bases de datos creo que las funciones correspondeientes aceptan mas de uan consulta como es la de postgresql.
Ahora como resumen y como ya te lo comentaron siempre es una buena practica que tu escript valide los datos que llegan de tu forma, por el tipo y por el contenido para evitar sorpresas..

Saludos.
  #10 (permalink)  
Antiguo 17/06/2005, 17:26
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 19 años, 5 meses
Puntos: 2
tambien es bueno tener encuenta q se hara en el script y sacar la mayor cantidad de permisos para el usuario q se usara en la coneccion a la base de datos... asi si se necesita solamente hacer una consulta select, restringes todos los demas permisos y por mas q pueda agregar algo en ese script no podra hacer nada el atacante...

algo mas, esto es un pedido ya que no estoy muy familiarizado con las consultas sql, podrian poner alguna pagina q explique sobre las consultas (no las consultas basicas, algo q sea avanzado) y si puede ser en español mejor, pero sino ni modo... gracias y salu2
  #11 (permalink)  
Antiguo 17/06/2005, 19:30
 
Fecha de Ingreso: diciembre-2003
Mensajes: 218
Antigüedad: 20 años, 11 meses
Puntos: 0
Echarle un vistazo a esto, puede serviros.

http://www.xlwebmasters.com/modules....&f=doc2&id=595

Un saludo.
__________________
SymbianForever
SymbianForever.com, todo sobre y para tu symbian
aNieto2K | Themes para WordPress
De todo un poco
  #12 (permalink)  
Antiguo 05/04/2008, 00:54
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 8 meses
Puntos: 20
Re: Sobre las inyecciones 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 14:43.