2011-07-10 5 views
5

Mi administrador de servidor actualizó recientemente a PHP 5.3 y obtengo un "error" extraño (o feature, como lo tienen los usuarios de PHP). Tenía mysql_real_escape_string alrededor de la mayoría de mis datos de formularios por razones obvias de seguridad, pero ahora parece que PHP ya ha escapado.

<?php 

echo $_GET["escaped"]; 

?> 

<form method="get"> 
    <input type="text" name="escaped" /> 
</form> 

Este salidas, si entro por ejemplo escape 'this test', escape \'this test\'. Lo mismo ocurre si uso POST en lugar de GET.

¿Está directamente relacionado con la actualización 5.3 o podría mi administrador haber activado algún cambio automático en el archivo php.ini?

Además, debería dejarlo tal como está (en el caso de que sea un buen mecanismo a prueba de fallas que atrape correctamente todas las variables get y post), o debería deshabilitarlo (¡si eso es posible!) E ir volver a mysql_real_escape_string? Mis agallas me dicen que el enfoque 2 sería lo mejor, pero el enfoque 1 sería algo automágico. :)

EDITAR: En realidad, necesito deshabilitarlo. A veces reúno los datos del formulario y lo vuelvo a enviar al formulario del cliente en caso de que algo esté mal (es decir, campo faltante), así que no quiero que tenga barras que aparezcan de la nada.

+0

También debe tenerse en cuenta que, si su archivo 'php.ini' contiene un error de sintaxis, el valor predeterminado es habilitar' magic_quotes_gpc'. Por lo tanto, si cree que ha desactivado 'magic_quotes_gpc' en su archivo de configuración, es posible que el archivo contenga un error que impida que se aplique su configuración. Experiencia personal. : P –

Respuesta

11

Este "característica" se conoce como magic_quotes_gpc y hace no lo protege de todos los ataques de inyección SQL (se llama al addslashes en cada elemento de los superglobales de entrada, como $_POST y $_GET). Esto ignora la entrada real/codificación de la base de datos). Por lo tanto, está en desuso y should not be used.

El manual php oficial includes a neat way to undo it in php code, pero usted debe simplemente apáguelo.

+0

La forma "ordenada" de deshacerlo es lenta, es O (n), no está mal, pero aún puede causar problemas con una gran cantidad de datos. –

+0

@Nicklas A. Puede ser lento, pero a primera vista, esta parece ser la manera más rápida posible de deshacer citas mágicas. ¿Podrían dar más detalles sobre cómo se podría mejorar este código? Y si 'n' es el tamaño de todo el cuerpo POST, cualquier algoritmo * any * que deshaga una codificación de texto tomará O (n), ¿no? – phihag

+0

No, por supuesto, no hay otra solución. Simplemente quise decir que modificar el php.ini es una solución mucho mejor :) –

6

Esto se debe a magic quotes, debe apagarlo.

Y aquí es cómo usted lo apaga: http://www.php.net/manual/en/security.magicquotes.disabling.php

Lo haces bien a través de php.ini o mediante la eliminación de barras de todas las variables en $_GET y $_POST, obviamente, el primero es el método recomendado para ir.


Como Will Martin sugiere también se puede cambiar a través de un .htaccess así:

 
php_flag magic_quotes_gpc off 

Más información aquí: http://php.net/manual/en/configuration.changes.php

+0

Se aceptará cuando S/O me permita. Nunca pensé que una "característica" tan loca pudiera existir.Le pedí a mi administrador que lo desactive, porque lamentablemente, ini_set no funcionará. Grr. – Lazlo

+0

ini_set solo funciona en cosas que suceden después de que el script ha sido analizado y lamentablemente el escape ocurre antes. Las citas mágicas son malas y solo causan problemas, nunca las resuelven. Especialmente porque las personas pueden confiar en ellos para cosas. –

+2

Puede deshabilitarlo usando .htaccess: eso ocurre antes de que se analice la página. 'php_flag magic_quotes_gpc Off' en su .htaccess. –