Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

injeccion SQL

Estas en el tema de injeccion SQL en el foro de Mysql en Foros del Web. Hola a todos, Esta yo creo que debe ser fácil. ¿Para que te hagan inyección SQL tienen que conocer el nombre de las tablas? ¿O ...
  #1 (permalink)  
Antiguo 18/04/2006, 21:29
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 20 años, 2 meses
Puntos: 1
injeccion SQL

Hola a todos,

Esta yo creo que debe ser fácil. ¿Para que te hagan inyección SQL tienen que conocer el nombre de las tablas? ¿O eso tambien pueden sacarlo? Sino con poner nombre de tabla 'raros' se ganaría bastante, no?
__________________
Guarda tus configuration files
  #2 (permalink)  
Antiguo 19/04/2006, 08:29
 
Fecha de Ingreso: abril-2006
Mensajes: 268
Antigüedad: 18 años
Puntos: 2
Cita:
Iniciado por bictorman
¿Para que te hagan inyección SQL tienen que conocer el nombre de las tablas?
Eso depende del tipo de ataque que se este intentando realizar. Si el atacante solo quiere ingresar al sistema sin permiso, probablemente no necesite conocer nombres de campos ni de tablas, con solo manipular las datos que van a ser utilizados en la consulta (nombre de usuario y password) podria realizar su ataque.
En cambio, si un atacante quiere obtener algunos datos quizá deba tener algún conocimiento de la estructura de la base de datos.
Lo que decís de los nombres es cierto. Hay ciertos tablas típicas, como las que almacenan contraseñas, que siempre utilizan nombres de campos que siguen un patrón deteminado (el campo que almacena la contraseña generalmente se llama password, pass, contra, etc). Si nosotros utilizamos nombres de campos "no convencionales" estaremos haciéndole las cosas más difíciles al atacante.
Igualmente, no deberias confiarte en este tipo de cosas. La validación de los datos ingresados por el usuario es la principal defensa contra los ataques de inyección de sql.
Saludos.
  #3 (permalink)  
Antiguo 19/04/2006, 08:51
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
Es importante manejar los errores que lanza el RDBMS, MySql en este caso, de manera que tu aplicación no tire errores de este tipo:

doesn´t match column xxx in table yyyy

Pues este error indica que existe una tabla yyyy.
  #4 (permalink)  
Antiguo 19/04/2006, 16:08
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 20 años, 2 meses
Puntos: 1
Estoy usando nombres de tablas poco comunes, aunque reconozco que he caido en llamar password al campo de las password . Lo de los errores a mi siempre me sale un escueto "mysql_error".

Para validar los datos estoy usando una funcion "comillas_inteligentes" que encontre en la página de PHP.


Código PHP:
<?php
// Aplicar comillas sobre la variable para hacerla segura
function comillas_inteligentes($valor)
{
   
// Retirar las barras
   
if (get_magic_quotes_gpc()) {
       
$valor stripslashes($valor);
   }

   
// Colocar comillas si no es entero
   
if (!is_numeric($valor)) {
       
$valor "'" mysql_real_escape_string($valor) . "'";
   }
   return 
$valor;
}

// Conexion
$enlace mysql_connect('mysql_host''mysql_usuario''mysql_contrasenya')
   OR die(
mysql_error());

// Realizar una consulta segura
$consulta sprintf("SELECT * FROM usuarios WHERE usuario=%s AND password=%s",
           
comillas_inteligentes($_POST['username']),
           
comillas_inteligentes($_POST['password']));

mysql_query($consulta);
?>
¿Alguno la ha usado? Como yo no se injectar desconozco si es realmente eficaz o no.
__________________
Guarda tus configuration files
  #5 (permalink)  
Antiguo 20/04/2006, 10:10
 
Fecha de Ingreso: abril-2006
Mensajes: 268
Antigüedad: 18 años
Puntos: 2
Esta técnica es eficaz, aunque nunca se puede estar seguro de que funcionará en todos los casos.
La idea general de este tipo de funciones es analizar las entradas de los usuarios que van a ser utilizadas en un consulta y "escapar" los caracteres peligrosos que posean estas entradas. PHP dispone de un mecanismo llamado "Magic Quotes" (comillas mágicas) que realiza este trabajo automáticamente. Este mecanismo es general, es decir, no tiene en cuenta el servidor de base de datos que se este utilizando. Por eso, si se encuentra disponible alguna función que realize este trabajo para alguna base de datos en especial (como el caso de mysql_real_escape_string() para bases de datos mysql), es mejor utilizar esta última que la las comillas mágicas.
Pero esto trae un problema: si utilizamos dicha función y comillas mágicas esta activado, obtendremos un doble escape. En la función que publicaste, esto se soluciona utilizando la función stripslashes(), que realiza el proceso invierso al realizado por comillas mágicas. En ese script, primero se verifica que comillas mágicas este activo y si lo esta se aplica la función stripslashes para, ahora si, poder aplicar sin problemas mysql_real_escape_string(). Otra solución sería desactivar comillas mágicas, pero eso sólo lo podés hacer si tenes acceso al php.ini, dado que no es posible a través de ini_set().
Saludos.
  #6 (permalink)  
Antiguo 20/04/2006, 12:59
 
Fecha de Ingreso: enero-2004
Mensajes: 95
Antigüedad: 20 años, 2 meses
Puntos: 1
Gracias por tus comentarios Notwen. Me quedo un poquito más tranquilo.
__________________
Guarda tus configuration files
  #7 (permalink)  
Antiguo 21/04/2006, 01:00
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Yo no me fío, prefiero validar de esta forma y no suponer que el usuario haga bien las consultas.

Si no cumplen con la expresión regular, los saco y les muestro algún mensaje predefinido.

Pasando a otra cosa, te recomiendaría que te fabricaras una función para conectarte, así no lo tienes que hacer a cada rato. Una ventaja de hacerlo así es un código más legible y la posibilidad de esa función detecte si estás o no online y de esa manera 'sabe' si conectarte con la base de datos del servidor o la que tienes en forma local.

Los mensaje_final() es una forma que ocupo p' mensajes y luego darle desde dentro de esa función unexit() para que no continúe el código. Igual se me hace una buena forma de mandarle errores personalizados y no caer en lo que claudiovega muestra que hay que evitar.

Digo, no pretendo descubrir el hilo negro, pero creo que funciona bien y con lo poderosas que son las expresiones regulares, pues se pueden adaptar muy bien a muchas formas de validación. Así nisiquiera tengo que usar las magic_quotes.

Parece que en esto de las BD cada quién tiene su estilo. Dificilmente se puede decir cuál es mejor que cuál, simplemente son diferentes. Este es el mío, gracias por compartir el vuestro.

Código PHP:
<?

// Conexion (prefiero llamar a una función que lo haga por mí)
$enlace connectDB(); 

////////// VERIFICANDO LOS DATOS DEL USUARIO //////////////
if( !ereg("^[a-z0-9]{3,}$",$_POST['username']) ) //si quiera hacer algo raro, lo saco
  
mensaje_final('errusr'); 
if ( !
ereg("^[a-z0-9]{3,}$",$_POST['password']) )
  
mensaje_final('errpss'); //lo saco y le muestro un error


//(llegando a este punto, ya se puede usar los datos de $_POST con seguridad
// VERIFICANDO QUE COINCIDAN LOS DATOS

if( cuantosDB("SELECT COUNT(*) FROM usuarios WHERE user='".$_POST['username']."' AND pass='".$_POST['password']."'",$enlace) ){
  
$_SESSION['is_user_logged'] = true;  //usuario bien loggeado
  //
  // y más líneas aquí, whatever
  //
  
}//end if
else{
  
$_SESSION['is_user_logged'] = false;  //usuario mal loggeado
  //
  // y más líneas aquí, whatever
  //

 
}
?>
__________________
"Di no al Internet Explorer" -Proverbio Chino-
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 08:57.