Foros del Web » Programando para Internet » PHP »

Codigo Anti Sql Injection

Estas en el tema de Codigo Anti Sql Injection en el foro de PHP en Foros del Web. Hola amigos, estoy a fines del desarrollo de las inyecciones SQL Para esto cree una funcion para pasar a cada variable ya sea POST o ...
  #1 (permalink)  
Antiguo 03/11/2005, 18:03
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Codigo Anti Sql Injection

Hola amigos, estoy a fines del desarrollo de las inyecciones SQL
Para esto cree una funcion para pasar a cada variable ya sea POST o GET

El codigo es el siguiente y despues les comento mi traba.


Código PHP:
 <?php function clean_bad_chars($char,$do)
$hack_array = array("'"'"'";""UNION""union""DROP""drop""table""TABLE""SET""set""UPDATE""update""SELECT""select""-""--""MEMB_INFO""memb_info""memb__pwd""memb___id");
$hack_replace "";
if(
ereg("",$char,$hack_array))
{
$add="ESTAS HACKEANDO SI SI"
}
else 
{
$add="NO ESTAS HACKEANDO"
}
$char_w_replaced $char;
$char_replaced str_replace($hack_array$hack_replace$char);
$char_clean=htmlentities(trim($char_replaced)); 
 
if (
$do==1)
{
$char=$char_w_replaced;
}
elseif (
$do==0)
{
 
 
$char=$char_clean.$add;
} return 
$char;
?>
Bueno si a la variable $do le pasamos 0 limpia todo y devuelve la cadena limpia, ahora si le pasamos 1 devuelve la cadena original, esto tiene como finalidad informacion para la base datos donde pienso almacenar el ip y la consulta que quisieron ejecutar.
Ahora, estoy tratando de que si ejecutaron codigo malicioso, osea alguna inyeccion sql, me lo detecte, para que dentro de la funcion me almacene en la base de datos todo.
Veran que concateno con la salida cuando $do tiene el valor 0 la variable $add, esto es solo una prueba para saber si me funciona la deteccion de una iyeccion, espero haberme explicado, necesito que me ayuden con esto y bueno queda la funcion lista, ahora estoy complicado con el tiempo, pero cuando tenga todo listo la voy a dejar perfecta para compartirla, y hasta la pienso implementar en POO.
Desde ya muchas gracias y espero les sirva la parte que funciona.
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-

Última edición por Znet; 04/11/2005 a las 16:29
  #2 (permalink)  
Antiguo 03/11/2005, 22:18
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Alguna ideilla por ahi???¿?¿'¡
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #3 (permalink)  
Antiguo 04/11/2005, 00:49
 
Fecha de Ingreso: febrero-2004
Ubicación: España. Madrid
Mensajes: 454
Antigüedad: 20 años, 2 meses
Puntos: 0
si eso lo haces.. p.ej en un formulario de logueo...
que pasa si el tio quiere que su usuario se llame "select"? :p
  #4 (permalink)  
Antiguo 04/11/2005, 07:40
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Pues es simple, podes agregar a la funcion un mensaje de error alegando que no se puede usar esa palabra porque es una palabra reservada.
Aparte si te das cuenta con solo elmininar la comilla simple y el ";" es suficiente, solo que esta funcion creo yo brinda mas seguridad, es para aplicar segun te convenga, por ejemplo un panel de administracion del sitio. :P

A ver otras ideas de como solucionar el problema de mas arriba??
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #5 (permalink)  
Antiguo 04/11/2005, 12:18
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Help Pleaseeeeeee
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #6 (permalink)  
Antiguo 04/11/2005, 15:58
Avatar de Master Solution  
Fecha de Ingreso: octubre-2005
Mensajes: 51
Antigüedad: 18 años, 6 meses
Puntos: 1
Para evitar SQL Injections, tenes 2 funciones basicas.

De MySQL, si lo usas:

mysql_real_escape_string()

De PHP:

addslashes()

Y para otros gestores de bd, en general es lo mismo que el de MySQL solo que cambiando el prefijo mysql, por el nombre correspondiente.

addslashes() se deberia usar solo en caso de que el servidor no tenga activado magic_quotes_gpc, que para eso podes verificarlo, con la funcion get_magic_quotes_gpc()
__________________
-=[ 3KLabs ]=-
-=[ Diseño - Programación - Desarrollo ]=-
-=[ Posicionamiento en Buscadores ]=-
-=[ Hosting de Calidad ]=-
  #7 (permalink)  
Antiguo 04/11/2005, 16:28
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Gracias Master_Solucion, pero no es eso lo que necesito.
De hecho trabajando en mi pc con una base de datos de MSSQL y aun usando las funciones que nombras, logre borrar tablas de mi base de datos simplemente usando esto ' ; drop table TABLA --

Es por eso que estoy creando esta funcion que es general, ahora lo unico que me hace falta saber para terminar, es como hago para determinar si lo que el usuario ha ingresado ya sea por GET o por POST se encuentra en el array $hack_array, para que si esto es correcto almacene informacion en la base de datos y sino no.
Eso es todo lo que necesito saber.

A modo de comentario, observabaran que por ejemplo para el juego MU, las bases de datos de MSSQL son todas las mismas o casi similares, y conociendo las tablas podes hacer desastres es por eso que estoy haciendo esta funcion general y aplicable a cualquier situacion.
Gracias nuevamente.-
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #8 (permalink)  
Antiguo 06/11/2005, 22:15
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Funcion Terminada

Bueno amigos despues de muchas pruebas y como bien dice mi firma, ya lo consegui, si me autorizan me gustaria poner el código en las FAQ's para aquellos que quieran tener a su disposicion el mismo, usenlo como quieran y modifiquenlo como quieran a su gusto, guiense por los comentarios es sencillo, pero por lo menos a mi me dio efectividad.
aqui va:

Código PHP:
 <?php
function clean_bad_chars($char)
{
$ban=0;//Bandera para saber si estan ejecutando una Inyeccion SQL
$char_w_replaced stripslashes($char);//Guardamos la Inyeccion original para informacion a la BD
//Array con las palabras reservadas, para modificar a gusto :D
$hack_array = array("'"'"'";""UNION""union""DROP""drop""table""TABLE""SET""set""UPDATE""update""SELECT""select""-""--""MEMB_INFO""memb_info""memb__pwd""memb___id"); //Caracter por el que será reemplazada cada palabra reservada del sitio
$hack_replace ""//Separamos la cadena en un Array para poder hacer la comparacion y determinar si estan
//ejecutando o no una Inyeccion SQL
$char1=explode(" ",$char);
for(
$i=0;$i<count($char1);$i++)
{
 if(
in_array($char1[$i],$hack_array))//si se quiere se puede convertir todo a mayusculas para la comprobacion.
 
{
  
$ban=1;
 } 
}
 if (
$ban==1)
 {
  
$add="ESTAS HACKEANDO SI SI"
  
//guardar informacion en base de datos sobre el intento de hacking como IP, etc...
 
}
 else 
 {
  
$add="NO ESTAS HACKEANDO"
  
//seguir con los procesos del POST o GET sin guardar ips ni nada
 
}  
//reemplazamos las palabras reservadas
$char_replaced str_replace($hack_array$hack_replace$char);
//evitamos codigos html y espacios en blanco
$char_clean=htmlentities(trim($char_replaced)); //retornamos la cadena limpia para usar en nuestra consulta, o podemos devolver segun el resultado de ban
//un die para no ejecutar nada o como se les ocurra
 
return $char_clean.$add;
}
?>
Bueno espero que les sirva, lo hice para variable, osea para aplicarlo, se debera llamar a la funcion en cada variable GET o POST
Ahora ando ocupadillo con un sitio, pero despues lo hare para que pasen todas las variables que necesiten, ya sean GET o POST.

Saludillos.-
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #9 (permalink)  
Antiguo 13/11/2005, 10:22
Avatar de Master Solution  
Fecha de Ingreso: octubre-2005
Mensajes: 51
Antigüedad: 18 años, 6 meses
Puntos: 1
Cita:
Iniciado por Znet
De hecho trabajando en mi pc con una base de datos de MSSQL y aun usando las funciones que nombras, logre borrar tablas de mi base de datos simplemente usando esto ' ; drop table TABLA --
No creo que hayas podido borrar las tablas de tu base de datos usando esa cadena, porque simplemente addslashes() te la hubiese vuelto obsoleta.

No quiero despreciar tu trabajo, pero creo que lo que estas haciendo es innecesario. Por mas bueno que este.

O sea, nose si me explico, si en tus consultas encerras la variable que llega externamente, entre comillas simples, al usar la funcion addslashes(), ya no hay manera de que interrumpan esa cadena, para modificar la query original.

Ahora si en los campos numericos no usas esas comillas simples, al menos chequea que es numerico con la funcion is_numeric()

Con eso ya no vas a tener problemas de SQL Injection.
__________________
-=[ 3KLabs ]=-
-=[ Diseño - Programación - Desarrollo ]=-
-=[ Posicionamiento en Buscadores ]=-
-=[ Hosting de Calidad ]=-
  #10 (permalink)  
Antiguo 13/11/2005, 14:44
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Master Solution, ya se que es lo que habia pasado, pude borrar como lo dije mas arriba, pero lo hacia con GET, y la aplicacion prefabricada sobre la cual trabaja, usaba variable globales, las cuales tenia activada en mi apache, entonces ocurria lo que comentaba, :D
Igual gracias por la aclaracion.
salu2
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #11 (permalink)  
Antiguo 05/04/2008, 00:55
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 1 mes
Puntos: 20
Re: Codigo Anti Sql Injection

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 20:27.