viernes, 11 de junio de 2010

Desactivar Magic Quotes en PHP (php.ini)

“Comillas Mágicas” es un mecanismo de seguridad de PHP que escapa de manera automática comillas dobles y sencillas y barras invertidas con barras invertidas para evitar técnicas de inyección SQL.

Este sistema nació para evitar que los novatos escriban código inseguro pero ha terminado convirtiéndose en una característica tan molesta que actualmentesuele venir deshabilitada por defecto. Incluso los desarrolladores de PHP desaconsejan su uso.

El problema principal se presenta cuando ejecutamos nuestros scripts en diferentes servidores que pueden tener activado o no este mecanismo, y sobre todo si no tenemos acceso a la configuración del sistema como es el caso de los servidores de hosting compartidos.

PHP tiene dos funciones que escapan y desescapan cadenas que son addslashes() y stripslahes(). Si hemos escrito nuestro script en una máquina con Magic Quotes deshabilitadas, lo lógico es que escapemos nosotros mismos las variables con addslashes. Ese mismo código en un servidor con Magic Quotes activado nos daría este resultado:

$_POST['poblacion'] = "L\'alcudia";
echo addslashes($_POST['poblacion']); //escribiría "L\\\'alcudia".
Por otra parte, si no hubiésemos utilizado addslashes() confiando en Magic Quotes, en un servidor sin este mecanismo nos permitiría hacer un INSERT en una base de datos sin escapar las comillas, lo que normalmente causaría error, o algo mucho peor como una inyección SQL.

En primer lugar debemos deshabilitar esta característica en la configuración de PHP editando php.ini.

magic_quotes_gpc = Off En segundo lugar escribiremos una función para recoger las variables de formulario y las escape en caso necesario inluyéndola en nuestro script con un require(). Para detectar el estado de la configuración de Magic Quotes utilizaremos la función get_magic_quotes_gpc(). Un ejemplo podría ser:

function getFormVars($request_vars)
{
$form_vars = array();
while (list($key, $value) = each($request_vars)){
if (!get_magic_quotes_gpc()){
$var_text = addslashes($value);
}else{
$var_text = $value;
}
$form_vars[$key] = $var_text;
}
return $form_vars;
}
A esta función le pasaremos como argumento $_POST, $_GET, $COOKIE o $_REQUEST y devolverá una matriz asociativa con las variables escapadas convenientemente.

Fuente: http://www.s3v-i.net

No hay comentarios:

Publicar un comentario