Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?
26 usuarios Online (0)
Darse de alta en la web | Recuperar password   
Inicio / Foros / MySQL / UNHEX vs mysql_real_escape_string
6 respuestas recibidas | 128 visitas | Categoría MySQL

UNHEX vs mysql_real_escape_string

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 199 posts)

#0 Offline krowork Usuario 08 abr 08 (13:59)  
Hola a todos,

Mi pregunta es simple ¿Alguien utiliza UNHEX en lugar de mysql_real_escape_string?. Me explico, si yo defino la función safe como sigue puedo hacer lo siguiente:

Código PHP


<?php
function safe($s){
    
$len=strlen($s);
    
$hex='';
    for(
$i=0;$i<$len;++$i){
        
$num=ord($s[$i]);
        if(
$num<16) $hex.='0'.dechex($num);
        else
$hex.=dechex($num);
    }

    return
'UNHEX(\''.$hex.'\')';
}
//La codificación de la cadena y la del campo de la tabla tienen que ser la misma
mysql_query('INSERT INTO tabla (texto) VALUES('.safe('Lo que sea \' comillas incluidas').')');
?>


Lo bueno de esto es que luego no tienes que hacer stripslashes cuando recuperas el dato. Lo estoy empezando a utilizar pero no se si se le pueden colar alguna SQL injection de esta forma. Si alguien tiene alguna experiencia se agradecería cualquier comentario.

Un saludo

http://krowork.blogspot.com

Re: UNHEX vs mysql_real_escape_string

Avatar de xGallox
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 134 posts)

#1 Offline xGallox Usuario 09 abr 08 (11:45) Valor Valor  
Es una buena idea pero lo mejor siempre es filtrar la cadena que entran con expresiones regulares que sigan el patrón de posibles ataques de inyección SQL ademas de escapar caracteres etc...

Re: UNHEX vs mysql_real_escape_string

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 199 posts)

#2 Offline krowork Usuario 09 abr 08 (12:49)  
Hola xGallox,

Lo interesante de esta función es que es segura binariamente, es decir es el contenido binario de la candena lo que insertas en la base de datos, es por eso que pienso que no debería ser vulnerable a SQL injection. El problema surje cuando se realiza una comparación con LIKE, para ello se necesita otra función más para asegurar que no se introducen caracteres de control y concatenar si queremos introducirlos nosotros:

Código PHP


<?php
    
function safe($s){
        
$s=(string) $s;
        
$len=strlen($s);
        
$hex='';
        for(
$i=0;$i<$len;++$i){
            
$num=ord($s[$i]);
            if(
$num<16) $hex.='0'.dechex($num);
            else
$hex.=dechex($num);
        }

        return
'UNHEX(\''.$hex.'\')';
        
//return '0x'.$hex;
    
}

    function
safeLGR($s){ //LIKE GRANT REVOKE
        
return safe(addcslashes($s, '%_'));
    }

mysql_query("SELECT * FROM tabla WHERE texto LIKE CONCAT('%',".safeLGR($_GET['input']).",'%')");
?>


Como es la salida de una funcion SQL hay que hacer un concat

http://krowork.blogspot.com

Re: UNHEX vs mysql_real_escape_string

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 199 posts)

#3 Offline krowork Usuario 10 abr 08 (13:17)  
Bueno, ya que estoy solo destacar que no es un método nuevo ya que el mismo método se peude utilizar para las cadenas JavaScript que no queremos que provoquen problemas, y de paso pongo una implementación más eficiente:

Código PHP


<?php
//Para codificar a binario en JavaScript:
function JSEncoding($s){
    
$_lo=array(0=>'0',1=>'1',2=>'2',3=>'3',4=>'4',5=>'5',6=>'6',7=>'7',8=>'8',9=>'9',10=>'A',11=>'B',12=>'C',13=>'D',14=>'E',15=>'F');
    
$_hi=array(0=>'0',16=>'1',32=>'2',48=>'3',64=>'4',80=>'5',96=>'6',112=>'7',128=>'8', 144=>'9', 160=>'A', 176=>'B', 192=>'C', 208=>'D', 224=>'E', 240=>'F' );
    
$s=(string) $s;
    
$len=strlen($s);
    
$res='';
    for(
$i=0;$i<$len;++$i){
        
$c=ord($s[$i]);
        
$res.='\\x'.$_hi[$c&240].$_lo[$c&15];
    }
    return
$res;
}
//Para codificar a binario en SQL
function safe($s){
    
$_lo=array(0=>'0',1=>'1',2=>'2',3=>'3',4=>'4',5=>'5',6=>'6',7=>'7',8=>'8',9=>'9',10=>'A',11=>'B',12=>'C',13=>'D',14=>'E',15=>'F');
    
$_hi=array(0=>'0',16=>'1',32=>'2',48=>'3',64=>'4',80=>'5',96=>'6',112=>'7',128=>'8', 144=>'9', 160=>'A', 176=>'B', 192=>'C', 208=>'D', 224=>'E', 240=>'F' );
    
$s=(string) $s;
    
$len=strlen($s);
    
$res='';
    for(
$i=0;$i<$len;++$i){
        
$c=ord($s[$i]);
        
$res.=$_hi[$c&240].$_lo[$c&15];
    }
    return
'UNHEX(\''.$res.'\')';
}
?>

http://krowork.blogspot.com

¿UNHEX en PHP?

Avatar de jurena
Nivel 5 Nivel 5 Nivel 5 Nivel 5 Nivel 5 Nivel 5 Nivel 5

(Nivel 5 - 729 posts)

#4 Offline jurena Usuario 10 abr 08 (15:53) Valor Valor  
estimado krowork,
No he visto nada de UNHEX en PHP, pero sí lo he visto en MySQL. Sé que existe HEX en PHP y, la verdad, no entiendo por qué no hay nada al respecto, al menos en la red. A qué se debe. Tal vez mi sistema Windows es el problema, o mi anticuada versión PHP. Me gustaría que nos contaras algo más; por lo demás, como ya sabéis yo no soy un técnico y no puedo tener criterio a la hora de valorar muchas cosas, pero creo que, si se considera una innovación lo que estás proponiendo, tal vez sería conveniente, si así te parece, y bajo la supervisión de nuestros moderadores, que apareciera como artículo y con algunos ejemplos de uso para su mejor divulgación entre gente no perita como algunos de nosotros. Dinos algo más...

Gracias

Re: UNHEX vs mysql_real_escape_string

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 199 posts)

#5 Offline krowork Usuario 10 abr 08 (17:49)  
Hola jurena,

Realmente no es nada nuevo, se trata de encapsular los datos en una llamada al UNHEX del MySQL. Según yo lo veo esto permite insertar binariamente los datos que tienes en PHP en la Base de Datos sin preocuparte de comillas y caracteres de escape. De hecho mucha gente lo usa para inserciones binarias. Pero me puedo estar equivocando y tiene algún punto flaco (además de como se ve en el ejemplo del LIKE es un poco coñazo tener que estar utilizando la función CONCAT ).

Al margen de eso me he dado cuenta que puedo utilizar la función bin2hex que no me servía para javascript pero sí para aquí:

Código PHP


<?php
function safe($s){
$s=(string) $s;
return
'UNHEX(\''.bin2hex($s).'\')';
//return '0x'.bin2hex($s); //esto no lo he probado pero debería valer tb
}
?>



Un saludo

http://krowork.blogspot.com

gracias

Avatar de jurena
Nivel 5 Nivel 5 Nivel 5 Nivel 5 Nivel 5 Nivel 5 Nivel 5

(Nivel 5 - 729 posts)

#6 Offline jurena Usuario 10 abr 08 (18:31)  
Gracias, krowork,
de todas maneras, piensa lo de ese artículo cuando lo tengas lo maduro que consideres necesario.

Saludos.

Responder mensaje

Para poder participar debes estar registrado e identificado. Si no estás registrado como usuario de PHP-Hispano, :: Registrar ::
Login / Password   

Web alojada en Zilos

php-hispano.net 2002 - 2008 | XHTML 1.0
Datos Legales | Webmaster