¿Cómo desactivar las comillas mágicas en hosting compartido?
Quiero desactivar las comillas mágicas de PHP. No tengo acceso a php.ini.
Cuando intenté agregar php_flag magic_quotes_gpc off
a 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?
Según el manual, a menudo puede instalar un php.ini personalizado en un alojamiento compartido, donde no se usa mod_php y, php_value
por lo tanto, la directiva genera un error. Para configuraciones suexec/FastCGI, es bastante común tener un espacio web por espacio php.ini
en 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_PERDIR
configuración (después de 4.2.3), lo que significa que no puedes cambiarla con ini_set()
(solo PHP_INI_ALL
se 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 );
}
Si bien no puedo decir por qué php_flag le proporciona 500 Internal Server Error
mensajes 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);
}
?>
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:
- Crear un archivo de texto
- Cambie el nombre a 'php.ini'
- Añade las líneas
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.so
- 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í!
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.