41 votes

Comment désactiver les citations magiques sur l'hébergement partagé?

Je veux désactiver les citations magiques de PHP. Je n'ai pas accès à php.ini.

Lorsque j'ai essayé d'ajouter php_flag magic_quotes_gpc off à mon fichier .htaccess, j'ai une erreur de serveur interne 500. Voici à quoi ressemble mon fichier .htaccess:

 AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off
 

Ensuite, j'ai essayé d'utiliser ini_set('magic_quotes_gpc', 'O') , mais cela n'a eu aucun effet.

Comment désactiver les citations magiques?

42voto

Peter Bailey Points 62125

Selon le manuel , vous pouvez souvent l'installation d'un custom php.ini sur l'hébergement mutualisé, où mod_php n'est pas utilisé et l' php_value directive a ainsi conduit à une erreur. Suexec/FastCGI des configurations, il est assez courant d'avoir un par-webspace php.ini dans tous les cas.

--

Je ne pense pas que O (lettre majuscule o) est une valeur valide pour définir un fichier ini drapeau. Vous avez besoin d'utiliser un vrai/faux, 1/0, ou "on"/"off" de la valeur.

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

MODIFIER

Après vérification de la liste de paramètres ini, je vois que magic_quotes_gpc est un PHP_INI_PERDIR réglage (après 4.2.3), ce qui signifie que vous ne pouvez pas la modifier avec ini_set() (seulement PHP_INI_ALL paramètres peuvent être modifiés qu'avec l' ini_set())

Ce que cela signifie est que vous devez utiliser une .fichier htaccess pour ce faire - OU - mettre en place un script pour inverser les effets du magic quotes. Quelque chose comme ceci

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 );
}

30voto

Powerlord Points 43989

Bien que je ne peux pas dire pourquoi php_flag est de vous donner 500 Internal Server Errors, je ferai remarquer que le manuel PHP est un exemple de détecter si les magic quotes est sur et le décapage de la superglobales au moment de l'exécution. Contrairement aux autres affiché, celui-ci est récursive et adéquate de la bande de citations de tableaux:

Mise à jour: j'ai remarqué aujourd'hui qu'il y a une nouvelle version du code ci-dessous sur le manuel PHP qui utilise les références à la super-globales " à la place.

Ancienne version:

<?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);
}
?>

Nouvelle version:

<?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);
}
?>

20voto

gonzo Points 161

Cela permettra de résoudre le problème de la "Classe " AOP" introuvable " lorsque vous créez un local php.fichier ini.

Si vous ne pouvez pas désactiver les magic quotes en utilisant le fichier htaccess (pour les raisons déjà données par Pete Bailey) juste:

  1. Créer un fichier texte
  2. Le renommer en 'php.ini'
  3. Ajouter les lignes

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

  4. L'enregistrer dans le répertoire/s dans lequel vos scripts en cours d'exécution.

Mise à jour: si vous voulez avoir juste une copie de la nouvelle version de php.fichier ini puis ajoutez cette ligne à votre racine .fichier htaccess:

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

Évidemment, vous devez déplacer le fichier ini à cet endroit, il n'y est pas déjà.

L'espoir qui sauve quelqu'un les 2 heures, il vient de prendre moi!

10voto

djn Points 3015

Le php_flag et php_value à l'intérieur d'un .fichier htaccess sont techniquement correct, mais pour le PHP installé en tant que module Apache uniquement. Sur un ordinateur hôte partagé, vous trouverez presque jamais une telle configuration; PHP est exécuté en tant que CGI au lieu de cela, pour des raisons liées à la sécurité (en gardant votre serveur voisins de vos fichiers) et de la façon phpsuexec exécute des scripts comme "vous" à la place de l'utilisateur apache.

Apache est donc juste de vous donner une erreur de serveur: il ne connaît pas le sens de l'php_flag à moins que le module PHP est chargé. Binaire CGI est à Apache d'un programme externe au lieu de cela, et vous ne pouvez pas configurer à partir de l'intérieur de Apache.

Maintenant pour les bonnes nouvelles: vous pouvez définir un répertoire de configuration d'y mettre un fichier nommé"php.ini' et de la configuration de vos instructions en utilisant la même syntaxe que dans le système principal de php.ini. Le manuel PHP répertorie tous réglables directives: vous pouvez définir celles qui sont marquées avec PHP_INI_PERDIR ou PHP_INI_ALL, alors que seul l'administrateur système peut définir ceux marqués PHP_INI_SYSTEM avec le serveur php.ini.

Notez que ces php.les directives ini ne sont pas héritées par les sous-répertoires, vous aurez à leur donner leur propre php.ini.

5voto

solution fix Points 450

===================================== Ma solution ========= =================== (renommez votre php.ini en php5.ini)

et en haut (!), ajoutez ces éléments:

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

puis dans .htaccess, ajoutez ceci (en haut):

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

ps change correctement /home/your_path/to/ (vous pouvez voir ce chemin en exécutant la commande <?php phpinfo(); ?> partir d'un fichier .php typique.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X