Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] [Consulta] Codigo AntiSqlInject

Estas en el tema de [Consulta] Codigo AntiSqlInject en el foro de PHP en Foros del Web. Bueno mas que nada vengo a mostrar un codigo que tengo tengo desde hace tiempo y he modificado y pues mas que nad deseaba ver ...
  #1 (permalink)  
Antiguo 26/01/2013, 23:45
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 13 años, 5 meses
Puntos: 48
[Consulta] Codigo AntiSqlInject

Bueno mas que nada vengo a mostrar un codigo que tengo tengo desde hace tiempo y he modificado y pues mas que nad deseaba ver si alguien cree que podria mejorarlo o ve por ahi algun error o algo que podria mejorarle y pues tambien pues que lo use a quien le sirva si le gusta n.n

Bueno ya para no dar tanto rollo aqui os muestro:
Código PHP:
Ver original
  1. <?php
  2. function limpiar($valor)
  3. {
  4.     $check = $valor;
  5.  
  6.         $search = array('char(', 'chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(',
  7.         'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20',
  8.         'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=',
  9.         'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(',
  10.         'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm',
  11.         'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(',
  12.         'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(',
  13.         'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall',
  14.         'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20',
  15.         'insert%20into', 'select%20', 'fopen', 'fwrite', '%20like', 'like%20',
  16.         '$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20',
  17.         'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow',
  18.         'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id',
  19.         '/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python',
  20.         'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '.pl', 'lsof%20',
  21.         '/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml',
  22.         'file\://', 'window.open', '<script>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe',
  23.         'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd',
  24.         'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history',
  25.         'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20',
  26.         'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con',
  27.         '<script', 'UPDATE', 'SELECT', 'DROP', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from',
  28.         'select from', 'drop%20', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql=');
  29.  
  30.         $valor = str_replace($search, '', $valor);
  31.  
  32.         $valor = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$valor);
  33.         $valor = trim($valor);
  34.         $valor = strip_tags($valor);
  35.         $valor = addslashes($valor);
  36.         $valor = str_replace("'", "''", $valor);
  37.         $valor = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($valor) : mysql_escape_string($valor);
  38.         if( $check != $valor )
  39.         {
  40.             global $DATA;
  41.             $logf = fopen("/logs/sqli.txt", "a+");
  42.             fprintf($logf, "%s - [ID=%s NOMBRE=%s] - Fecha: %s IP: %s Valor: %s, Corregido: %s\r\n", $_SERVER['PHP_SELF'], $DATA['IDUS'], $DATA['NOMBRE'], date("d-m-Y h:i:s A"), $_SERVER['REMOTE_ADDR'], $check, $valor );
  43.             fclose($logf);
  44.             return '';        
  45.         }
  46.         return( $valor );
  47. }
  48. ?>
  #2 (permalink)  
Antiguo 26/01/2013, 23:59
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: [Consulta] Codigo AntiSqlInject

Hola, yo soy muy novatillo en esto de PHP, entonces no sé en donde se pone este código y qué hace ¿Podrías poner una breve explicación? Muchas gracias.

Saludos.
  #3 (permalink)  
Antiguo 27/01/2013, 01:05
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 13 años, 5 meses
Puntos: 48
Respuesta: [Consulta] Codigo AntiSqlInject

Cita:
Iniciado por botdevel Ver Mensaje
Hola, yo soy muy novatillo en esto de PHP, entonces no sé en donde se pone este código y qué hace ¿Podrías poner una breve explicación? Muchas gracias.

Saludos.
Hola, bueno en si el tema mas que nada era para que opinaran sobre como esta pero ok hehehe

Mira lo que debes hacer es crear un nuevo archivo llamado funciones.php o como desees, ahora en los archivos donde hagas uso de $_POST o de $_GET, llamas a este archivo con la funcion include y ya ahora utilizas la funcion limpiar de este codigo que coloque, ejemplo

Código PHP:
Ver original
  1. <?php
  2.     include("funcion.php");
  3.     $variable = limpiar( $_POST['variablerecivbida'] );
  4.     if(empty( $variable))
  5.     {
  6.         die("No se permiten datos vacios");
  7.     }
  8. ?>

Y con eso ya pues la variable se limpiara y si contenia codigo malicioso o con posible SQLi pues regresara un string vacio, y ya tu checas que si esta vacio pues le muestras un mensaje o algo ahi ya dependera de ti.

E igual como te puedes dar cuenta en el srvidor te genera un archivo donde guarda los detalles del dato que fue detectado como posible inject.

Última edición por s00rk; 27/01/2013 a las 01:47
  #4 (permalink)  
Antiguo 27/01/2013, 04:06
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: [Consulta] Codigo AntiSqlInject

Muchas gracias amigo, lamento no poder opinar, pero sí que probaré tu código, es realmente interesante y añade un nivel de seguridad que es lo que vengo buscando, aunque por el momento solo he encontrado que mejor me deslinde de responsabilidad y haga responsable de la seguridad a otros jajajajajá de nuevo gracias por compartir tu conocimiento.

Saludos!!
  #5 (permalink)  
Antiguo 27/01/2013, 08:00
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [Consulta] Codigo AntiSqlInject

Tu función no es correcta, tal vez pueda evitar inyecciones en cierta medida, pero no funcionará como esperas, imagina que alguien escribe en inglés:

Cita:
I'm from Mexico and I want to know where are you from
Vas a eliminar las palabras marcadas en negrillas y no se trata realmente de un ataque.

Es mucho mejor la función que compartió GatorV en: http://www.forosdelweb.com/f18/aport...ar-xss-948577/

Y, para evitar inyección SQL, aquí hay algunas sugerencias: http://www.forosdelweb.com/f18/aport...8/#post4265377
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 27/01/2013, 15:03
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: [Consulta] Codigo AntiSqlInject

Hola a los dos, sobre todo Triby, ese tocho que escribiste es justo lo que buscaba, esas recomendaciones de seguridad es por lo que venía preguntando, al final y de casualidad mientras le decias al compañero que su trabajo es inútil, me ayudaste, de una forma rara pero igual se agradece.

Gracias Triby.
  #7 (permalink)  
Antiguo 27/01/2013, 15:39
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: [Consulta] Codigo AntiSqlInject

Cita:
Iniciado por botdevel Ver Mensaje
Hola a los dos, sobre todo Triby, ese tocho que escribiste es justo lo que buscaba, esas recomendaciones de seguridad es por lo que venía preguntando, al final y de casualidad mientras le decias al compañero que su trabajo es inútil, me ayudaste, de una forma rara pero igual se agradece.

Gracias Triby.
¿Dónde dice que su trabajo es inútil?

No lo veo, no comprendo, nadie ha dicho eso.

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 27/01/2013, 16:30
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: [Consulta] Codigo AntiSqlInject

En "Tu función no es correcta" y luego "Es mucho mejor la función que compartió GatorV en..." implícitamente puedes ver que algo que no es correcto seguido de una recomendación de algo que es mucho mejor, deja ver el carácter inútil de nuestro sujeto principal, aunque bastaba con "incorrecto" o si para ti algo incorrecto es útil pues...

Saludos.
  #9 (permalink)  
Antiguo 27/01/2013, 18:13
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 13 años, 5 meses
Puntos: 48
Respuesta: [Consulta] Codigo AntiSqlInject

Cita:
Iniciado por Triby Ver Mensaje
Tu función no es correcta, tal vez pueda evitar inyecciones en cierta medida, pero no funcionará como esperas, imagina que alguien escribe en inglés:



Vas a eliminar las palabras marcadas en negrillas y no se trata realmente de un ataque.

Es mucho mejor la función que compartió GatorV en: http://www.forosdelweb.com/f18/aport...ar-xss-948577/

Y, para evitar inyección SQL, aquí hay algunas sugerencias: http://www.forosdelweb.com/f18/aport...8/#post4265377
Ok, Gracias.

SI es que de hecho donde he usado este codigo han sido solo para personas de habla hispana, por lo que no tendrian que poner ese tipo de cosas, pero igual mejor paso a checar lo qu dices de esa foma pues no me limito en el lenguaje o de las personas que entren.



Sobre lo demas me limito a responder ya que no va al tema, pero si justo esto era lo que deseaba algo mas complejo o que tuviera mejor funcionamiento que el mio n_n
  #10 (permalink)  
Antiguo 27/01/2013, 21:44
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [Consulta] Codigo AntiSqlInject

Realmente has considerado muchas posibilidades en tu función, pero, suponiendo que tú mismo quieras poner trozos de código (a modo de tutorial) en tu web, no podrías incluir algo como:

Cita:
SELECT tabla.*, tabla1.* FROM tabla
LEFT JOIN tabla1 ON tabla1.campo = tabla.campo
WHERE filtro
Entonces, no es tanto que hagas tu web para habla hispana, inglesa, multi-idioma, etc., sino buscar la mejor opción para sanear las entradas; alguna vez ya me vi en una situación similar y tuve que reescribir mucho código.
__________________
- León, Guanajuato
- GV-Foto
  #11 (permalink)  
Antiguo 27/01/2013, 23:28
Avatar de s00rk  
Fecha de Ingreso: octubre-2010
Ubicación: Mexico
Mensajes: 238
Antigüedad: 13 años, 5 meses
Puntos: 48
Respuesta: [Consulta] Codigo AntiSqlInject

Cita:
Iniciado por Triby Ver Mensaje
Realmente has considerado muchas posibilidades en tu función, pero, suponiendo que tú mismo quieras poner trozos de código (a modo de tutorial) en tu web, no podrías incluir algo como:



Entonces, no es tanto que hagas tu web para habla hispana, inglesa, multi-idioma, etc., sino buscar la mejor opción para sanear las entradas; alguna vez ya me vi en una situación similar y tuve que reescribir mucho código.
Pues eso no lo tenia contemplado ya que comúnmente las web que creo son para usuarios donde se trata de login, modificación de datos de usuario y tal, por lo que no tendrian que poner ese tipo de cosas, aunque muchas gracias igual había empezado ya a leer sobre PDO y el uso de prepare, bindParam para así ahorrarme algo de código en conjunto del antixss.

Etiquetas: mysql, select, sql
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 11:57.