Foros del Web » Programando para Internet » PHP »

PHP OO Class Anti-XSS, Anti SQL Injection

Estas en el tema de Class Anti-XSS, Anti SQL Injection en el foro de PHP en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original class seguridad {     function decode ( $source ) {         $source = html_entity_decode ( ...
  #1 (permalink)  
Antiguo 14/12/2010, 14:33
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 8 meses
Puntos: 10
Class Anti-XSS, Anti SQL Injection

Código PHP:
Ver original
  1. class seguridad{
  2.     function decode($source) {
  3.         $source = html_entity_decode($source, ENT_QUOTES, "ISO-8859-1");
  4.         //$source = preg_replace('/&#(\d+);/me',"chr(\\1)", $source);
  5.         //$source = preg_replace('/&#x([a-f0-9]+);/mei',"chr(0x\\1)", $source);
  6.         $source=preg_replace('[^A-Za-z0-9_]','',$source);
  7.         return $source;
  8.     }
  9.     function safeSQL($source, &$connection) {
  10.         if (is_array($source)) {
  11.             foreach($source as $key => $value)
  12.                 if (is_string($value)) $source[$key] = $this->quoteSmart($this->decode($value), $connection);
  13.             return $source;
  14.         } else if (is_string($source)) {
  15.             if (is_string($source)) return $this->quoteSmart($this->decode($source), $connection);
  16.         } else return $source;    
  17.     }
  18.     function quoteSmart($source, &$connection) {
  19.         if (get_magic_quotes_gpc()) $source = stripslashes($source);
  20.         $source = $this->escapeString($source, $connection);
  21.         return $source;
  22.     }
  23.     function escapeString($string, &$connection) {
  24.         if (version_compare(phpversion(),"4.3.0", "<")) mysql_escape_string($string);
  25.         else mysql_real_escape_string($string);
  26.         return $string;
  27.     }
  28.    
  29.     public function printf_array($elementosql,$link){
  30.         $sqlfiltrado=$this->safeSQL(array_shift($elementosql), $link);
  31.         return vprintf($sqlfiltrado,$elementosql);
  32.     }
  33. }
  34.  
  35.         include("db.php");
  36.         $seguridad=new seguridad;
  37. $consulta[0]="UPDATE `usuarios` SET `intentos`='%s',`ja`='%s' WHERE `usuario` = 'a'";
  38. $consulta[1]="Augusto/·%";
  39. $consulta[2]="Algo%/";
  40. echo $seguridad->printf_array($consulta,$link);

Deberia aparecer sin caracter extraños, pero todavia aparece asi

UPDATE `usuarios` SET `intentos`='Augusto/·%',`ja`='Adriana%/' WHERE `usuario` = 'a'85

Lo raro es el 85, de donde sale

Que es lo que esta mal?

Para que me aparescan todavia los caracteres extraños, si en la primera funcion, elimino todos esos caracteres extraños con esta linea

$source=preg_replace('[^A-Za-z0-9_]','',$source);

Saludos y gracias de antemano
  #2 (permalink)  
Antiguo 14/12/2010, 15:08
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Class Anti-XSS, Anti SQL Injection

Tienes que escapar cada dato por separado, antes de armar la consulta, de lo contrario:

$consulta = "update tabla SET campo = 'contenido del campo'";

mysql_real_escape_string() escapara las comillas que delimitan el contenido del campo.

Por otra parte, ejecutar simplemente mysql_real_escape_string($variable) no funciona, debes asignar el resultado a otra (o la misma) variable:

$variable = mysql_real_escape_string($variable);

Mas info en el manual de PHP.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 14/12/2010, 15:35
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 8 meses
Puntos: 10
Respuesta: Class Anti-XSS, Anti SQL Injection

De hecho la idea de usar mysql_real_escape_string($variable) lo tome de phpclasses, modifique la classe, aunque este mal usado mysql_real_escape_string, aunque sea

Deberia funcionar $source=preg_replace('[^A-Za-z0-9_]','',$source); , no crees?

Rescribire la clase si tengo un problema te aviso en este mismo hilo
  #4 (permalink)  
Antiguo 14/12/2010, 16:49
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 8 meses
Puntos: 10
Respuesta: Class Anti-XSS, Anti SQL Injection

Código PHP:
Ver original
  1. class seguridad{
  2.  
  3.     function limpiar($value){
  4.         $value=preg_replace('[^A-Za-z0-9_]','',$value);
  5.         if (get_magic_quotes_gpc()){
  6.             $value = stripslashes($value);
  7.         }
  8.         return $value;
  9.     }
  10.     function recursivo($matriz){
  11.         if (is_array($matriz)){  
  12.             foreach($matriz as $key=>$value){
  13.                 if (is_array($value)){  
  14.                     $this->recursivo($value);
  15.                 }else{  
  16.                     $value=$this->limpiar($value);        
  17.                 }    
  18.             }
  19.  
  20.         }else{
  21.             $value=$this->limpiar($matriz);
  22.         }
  23.         return $value;
  24.     }
  25.    
  26.     public function printf_array($elementosql){
  27.         $sqlfiltrado=$this->recursivo(array_shift($elementosql));
  28.         return vprintf($sqlfiltrado,$elementosql);
  29.     }
  30. }
  31.  
  32. $consulta[0]="UPDATE `usuarios` SET `intentos`='%s',`ja`='%s' WHERE `usuario` = 'a'";
  33. $consulta[1]="valor1?";
  34. $consulta[2]="valor2%/";
  35. echo $seguridad->printf_array($consulta);

Esto no esta funcionando

$value=preg_replace('[^A-Za-z0-9_]','',$value);

Pues esta escribiendome esto


UPDATE `usuarios` SET `intentos`='valor1?',`ja`='valor2%/' WHERE `usuario` = 'a'82

Me muestra signos y no deberia que estoy haciendo mal??

ya quite el mysql_real_escape_string
  #5 (permalink)  
Antiguo 14/12/2010, 17:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Class Anti-XSS, Anti SQL Injection

lo que sucede es que el método limpiar() no es aplicado como debe, y es fácil de observar esto en printf_array()

pues ahí solo se limpia la consulta, y los demás argumentos se dejan intactos...

una solución sería aplicar el método de limpieza al arreglo $elementosql con array_map() antes de ser usado con vprintf()
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 14/12/2010, 17:11
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Class Anti-XSS, Anti SQL Injection

El problema no es con mysql_real_escape_string, sino con la forma en que estas creando tu clase:

Código PHP:
Ver original
  1. if (is_array($value)){  
  2.                     $this->recursivo($value); // Aqui deberias asignar el resultado a una variable
  3.                     // Ejemplo: $value = $this->recursivo($value);
  4.              }else{  
  5.                     $value=$this->limpiar($value);        
  6.              }

Si no asignas el resultado a una variable, este valor se perdera (?) conservando el original, es el mismo problema que tenias en el primer script.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 15/12/2010, 17:28
 
Fecha de Ingreso: febrero-2005
Mensajes: 626
Antigüedad: 19 años, 8 meses
Puntos: 10
Respuesta: Class Anti-XSS, Anti SQL Injection

Hola pateketrueke y Triby

Oigan tengo una pregunta, no es una vulnerabilidad, tener una funcion recursiva que acepte arrays infinitamente grandes, imaginense hacer un formulario incluso automatico con arrays de mil dimensiones, colgaria el servidor, no?

El problema lo resolvi, pero no fue por igualar una variable a la funcion, fue porque se esta reinicializando la variable y la borraba

Última edición por August; 15/12/2010 a las 19:49

Etiquetas: class, injection, 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 12:14.