¿Cómo desactivar las comillas mágicas en hosting compartido?

Resuelto John asked hace 54 años • 13 respuestas

Quiero desactivar las comillas mágicas de PHP. No tengo acceso a php.ini.

Cuando intenté agregar php_flag magic_quotes_gpc offa mi archivo .htaccess, aparece un error interno del servidor 500. Así es como se ve mi archivo .htaccess:

AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off

Luego intenté usar ini_set('magic_quotes_gpc', 'O'), pero no tuvo ningún efecto.

¿Cómo desactivo las comillas mágicas?

John avatar Jan 01 '70 08:01 John
Aceptado

Según el manual, a menudo puede instalar un php.ini personalizado en un alojamiento compartido, donde no se usa mod_php y, php_valuepor lo tanto, la directiva genera un error. Para configuraciones suexec/FastCGI, es bastante común tener un espacio web por espacio php.inien cualquier caso.

--

No creo que O (letra o mayúscula) sea un valor válido para establecer un indicador ini. Debe utilizar un valor verdadero/falso, 1/0 o "activado"/"desactivado".

ini_set( 'magic_quotes_gpc', 0 );   // doesn't work

EDITAR

Después de verificar la lista de configuraciones ini , veo que magic_quotes_gpc es una PHP_INI_PERDIRconfiguración (después de 4.2.3), lo que significa que no puedes cambiarla con ini_set()(solo PHP_INI_ALLse pueden cambiar las configuraciones con ini_set())

Lo que esto significa es que debe usar un archivo .htaccess para hacer esto, O implementar un script para revertir los efectos de las comillas mágicas. Algo como esto

if ( in_array( strtolower( ini_get( 'magic_quotes_gpc' ) ), array( '1', 'on' ) ) )
{
    $_POST = array_map( 'stripslashes', $_POST );
    $_GET = array_map( 'stripslashes', $_GET );
    $_COOKIE = array_map( 'stripslashes', $_COOKIE );
}
Peter Bailey avatar Feb 05 '2009 17:02 Peter Bailey

Si bien no puedo decir por qué php_flag le proporciona 500 Internal Server Errormensajes de correo electrónico, señalaré que el manual de PHP tiene un ejemplo de cómo detectar si las comillas mágicas están activadas y eliminarlas de las superglobales en tiempo de ejecución. A diferencia de los demás publicados, este es recursivo y eliminará correctamente las comillas de las matrices:

Actualización: hoy me di cuenta de que hay una nueva versión del siguiente código en el manual de PHP que utiliza referencias a los superglobales.

Versión antigua:

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>

Nueva versión:

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>
Powerlord avatar Feb 06 '2009 13:02 Powerlord

Esto resolverá el problema de que aparece el mensaje "Clase 'PDO' no encontrada" al crear un archivo php.ini local.

Si no puede desactivar las comillas mágicas usando el archivo htaccess (por razones ya dadas por Pete Bailey), simplemente:

  1. Crear un archivo de texto
  2. Cambie el nombre a 'php.ini'
  3. Añade las líneas
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.so
  1. Guárdelo en el directorio o directorios en los que se ejecutan sus scripts.

Actualización: si desea tener solo una copia del nuevo archivo php.ini, agregue esta línea a su archivo raíz .htaccess:

SetEnv PHPRC /path/to/site/root/public_html/php.ini

Obviamente necesitas mover el archivo ini a esta ubicación si aún no está allí.

¡Espero que eso le ahorre a alguien las 2 horas que me tomó a mí!

gonzo avatar May 10 '2012 12:05 gonzo

El php_flag y el php_value dentro de un archivo .htaccess son técnicamente correctos, pero solo para PHP instalado como módulo de Apache. En un host compartido casi nunca encontrarás una configuración de este tipo; En su lugar, PHP se ejecuta como CGI, por razones relacionadas con la seguridad (mantener a los servidores vecinos fuera de sus archivos) y la forma en que phpsuexec ejecuta scripts como "usted" en lugar del usuario de Apache.

Por lo tanto, Apache tiene razón al mostrarle un error de servidor: no conoce el significado de php_flag a menos que el módulo PHP esté cargado. Un binario CGI es para Apache un programa externo y no se puede configurar desde Apache.

Ahora las buenas noticias: puede configurar la configuración por directorio colocando allí un archivo llamado ' php.ini ' y configurando allí sus instrucciones usando la misma sintaxis que en el php.ini principal del sistema. El manual de PHP enumera todas las directivas configurables: puede configurar las marcadas con PHP_INI_PERDIR o PHP_INI_ALL, mientras que solo el administrador del sistema puede configurar las marcadas PHP_INI_SYSTEM en el php.ini de todo el servidor.

Tenga en cuenta que dichas directivas php.ini no se heredan en los subdirectorios; deberá darles su propio php.ini.

djn avatar Feb 07 '2009 01:02 djn