safe off must magic_quotes_gpc magic inteligentes help gpc disabled desactivar comillas php magic-quotes-gpc

must - php magic quotes gpc off



¿Cómo desactivar las comillas mágicas en el alojamiento compartido? (13)

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

Cuando intenté agregar php_flag magic_quotes_gpc off a mi archivo .htaccess, recibí un error interno de 500 servidores. Esto es lo que mi archivo .htaccess se ve así:

AddType x-mapp-php5 .php php_flag magic_quotes_gpc off

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

¿Cómo desactivo las citas mágicas?


  1. ¿Funciona si elimina la línea AddType? No estoy seguro de por qué eso es relevante para desactivar las cotizaciones mágicas.

  2. Si PHP no se está ejecutando en mod_php, htaccess no funcionará. ¿Funciona como un CGI?

Esta es una para su empresa de alojamiento de verdad.


¿Qué tal $_SERVER ?

if (get_magic_quotes_gpc() === 1) { $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true); $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true); $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true); $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); $_SERVER = json_decode( stripslashes(json_encode($_SERVER,JSON_HEX_APOS)), true); }


======================================= MY SOLUCIÓN ========= =================== (cambie el nombre de su php.ini a php5.ini)

y en la parte superior (!), agregue estos:

magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off extension=pdo.so extension=pdo_mysql.so

luego en .htaccess, agregue esto (en la parte superior):

SetEnv PHPRC /home/your_path/to/public_html/php5.ini

ps change /home/your_path/to/ correctamente (puede ver esa ruta ejecutando el <?php phpinfo(); ?> de un archivo .php típico).


Aunque no puedo decir por qué php_flag te está dando 500 Internal Server Error s, señalaré que el manual de PHP tiene un ejemplo de detección de si hay comillas mágicas activadas y quitándola de los superglobales en tiempo de ejecución. A diferencia de los otros publicados, este es recursivo y quitará correctamente las comillas de las matrices:

Actualización: Hoy noté 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); } ?>


De acuerdo con el manual, a menudo puede instalar un php.ini personalizado en el alojamiento compartido, donde mod_php no se utiliza y la directiva php_value genera un error. Para las configuraciones de suexec / FastCGI es bastante común tener un php.ini por php.ini en cualquier caso.

-

No creo que O (letra mayúscula o) sea un valor válido para establecer una bandera ini. Necesita usar un valor verdadero / falso, 1/0, o "encendido" / "apagado".

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

EDITAR

Después de consultar la lista de ajustes de ini , veo que magic_quotes_gpc es una configuración de PHP_INI_PERDIR (después de 4.2.3), lo que significa que no puede cambiarlo con ini_set() (solo la configuración de PHP_INI_ALL se puede cambiar con ini_set() )

Lo que esto significa es que tiene que usar un archivo .htaccess para hacer esto - O - implementar un script para invertir 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 ); }


Esto resolverá el problema de que no se encuentre "PDO de clase" cuando se crea 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. Crea un archivo de texto
  2. Cambiarle el nombre a ''php.ini''
  3. Agrega las líneas

    magic_quotes_gpc = Off
    magic_quotes_runtime = Off
    magic_quotes_sybase = Off
    extension = pdo.so
    extension = pdo_mysql.so

  4. Guárdelo en el / los directorio / s donde se están ejecutando sus scripts.

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

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

Obviamente necesita mover el archivo ini a esta ubicación que ya no está allí.

¡Espero que le ahorre a alguien las 2 horas que me acaba de llevar!


La respuesta de BaileyP ya es bastante buena, pero usaría esta condición en su lugar:

if(function_exists(''get_magic_quotes_gpc'') && get_magic_quotes_gpc() === 1){ $_POST = array_map( ''stripslashes'', $_POST ); $_GET = array_map( ''stripslashes'', $_GET ); $_COOKIE = array_map( ''stripslashes'', $_COOKIE ); }

Es más defensivo.


Los diferentes proveedores de hosting tienen diferentes procedimientos para hacer esto, por lo que preguntaría en sus foros o presentar una solicitud de soporte.

Si no puede desactivarlos, siempre puede usar algo como esto que escapará a la entrada independientemente de si las comillas mágicas están activadas o desactivadas:

//using mysqli public function escapeString($stringToBeEscaped) { return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped)); }


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

Por lo tanto, Apache es correcto y le da 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 en su lugar, y no puede configurarlo desde Apache.

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

Tenga en cuenta que las directivas php.ini no son heredadas por los subdirectorios, tendrá que darles su propio php.ini.


Sé que llego tarde para responder a esto, pero leí la mayoría de las respuestas y, aunque muchas fueron excelentes, solo djn explicó por qué recibía este 500 Internal Server Error .

Si bien su explicación fue 100% correcta, este es un ejemplo perfecto de por qué siempre debes envolverlos en un <IfModule> . Si bien esto no solucionará el problema real de no poder establecer esos indicadores en su .htaccess , al menos evitará el error 500 .

<IfModule mod_php5.c> # put all of your php_flags here, for example: php_flag magic_quotes_gpc off </IfModule>

O para versiones anteriores sería <IfModule mod_php.c> etc.

Intento acostumbrarme a hacer esto siempre para evitar esos 500 errores. Después de eso, solo aplica lo que dijo Peter Bailey .


Si está ejecutando PHP 5.3+ esto hará el truco, colóquelo en la parte superior de su página:

if (get_magic_quotes_gpc() === 1) { $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true); $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true); $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true); $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); }

Maneja claves, valores y matrices multidimensionales.


Si no puede apagarlo, esto es lo que suelo hacer:

get_magic_quotes_gpc() ? $_POST[''username''] : mysql_real_escape_string($_POST[''username'']);

Se colocará en la base de datos en su formato adecuado.


si su proveedor de hosting usa cpanel, puede intentar copiar php.ini en su directorio web y editarlo con magic_quotes_gpc = off