magic_quotes_gpc + Administrador cazurro = Desastre
Los que héis trabajado mucho con PHP conoceréis magic_quotes_gpc, o mejor, lo odiaréis.
Los que no, no sabréis de que os estoy hablando hoy. Magic Quotes es una “característica” de PHP, sin sentido hoy en día, que cuando no se deshabilita añade barras invertidas “\” al lado de cada comilla, comilla simple y carácteres nulos enviados por POST o GET a la web, justo antes de procesarlos.
Evidentemente, esto suena estúpido. ¿Por qué existe esto? Pues en un inicio se creó para que a los principiantes con el cráneo vacío no fueran vulnerables a SQL Injection. No parece una mala idea, pero ahora pensemos en una cosa. Han enviado el código fuente de una página HTML a tu PHP, para que lo procese. Lo que no sabes es que está lleno de barras invertidas hasta en la sopa, y al procesarlo tu PHP te dice: “¿WTF es esto?”.
Típico. Magic Quotes me jodió pero bien hace poco, trabajando en una herramienta para la página web http://ikmilitartools.com. Cuando lo desarrollé en mi servidor (debidamente configurado) no había ningún problema. En cuanto lo pasé a el de IK Militar Tools, desastre absoluto.
Casi me vuelvo loco intentando encontrar el problema. Ahora veo lo evidente que era, pero en ese momento no se me ocurrió y me pasé un buen tiempo haciendo pruebas en mi Ubuntu, a ver que era lo que desequilibraba la balanza, por qué en uno funcionaba y en el otro no.
Por supuesto, llegué a ver que con magic_quotes_gpc en ON, había un desastre, y con magic_quotes_gpc en OFF, funcionaba de maravilla. ¿Sabéis que es lo mejor? PHP lleva diciendo que lo desactivemos siglos. Será eliminado de PHP en breve, y en las configuraciones PHP de ejemplo que incluyen en su código fuente (tanto la de producción como la de desarrollo) muestran que magic_quotes_gpc debe estar desactivado.
Ahora hay que solucionarlo. Podría pasar por la mente de cualquiera hacer un ini_set(‘magic_quotes_gpc’, 0); al principio de la aplicación, pero no cuela. Una vez llega a leer esa línea, el código en $_POST y $_GET ya ha sido pasado por magic_quotes_gpc, y no se puede evitar con un ini_set. ¿Qué hay que hacer, entonces? Sencillo. PHP nos da la función stripslashes($string);, que hace exactamente lo inverso que hace Magic Quotes.
Entonces, ¿qué pasa si has de portar esa aplicación y no sabes si el server tiene Magic Quotes o no? Sencillo, aplica el siguiente bloque de código al empezar:
<?php
// Pongamos que $_POST['string'] es lo que envia el usuario, y lo guardamos en $str
if (get_magic_quotes_gpc()) {
$str = stripslashes($_POST['string']);
} else {
$str = $_POST['string'];
}
?>
Y listo. Pero ahora vayamos al asunto. Es escandaloso que hayan muchos Web Hosts que lo tengan activado, cuando está extremadamente desaconsejado por PHP. El negocio del hosting no es para principiantes, y si ciertos hosts lo tienen activado es de suponer que sus Administradores de Sistemas son un poco (o un mucho) cazurros. A ver si aprendéis un poco de los hostings de verdad y os dejáis de tonterías, leche.





