web-dev-qa-db-fra.com

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'obtiens 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?

41
John

Selon le manuel vous pouvez souvent installer un php.ini personnalisé sur l'hébergement partagé, où mod_php n'est pas utilisé et la directive php_value Conduit donc à une erreur. Pour les configurations suexec/FastCGI, il est assez courant d'avoir un espace par web php.ini Dans tous les cas.

-

Je ne pense pas que O (lettre majuscule o) soit une valeur valide pour définir un drapeau ini. Vous devez utiliser une valeur true/false, 1/0 ou "on"/"off".

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

[~ # ~] modifier [~ # ~]

Après avoir vérifié la liste des paramètres ini , je vois que magic_quotes_gpc est un paramètre PHP_INI_PERDIR (Après 4.2.3), ce qui signifie que vous ne pouvez pas le changer avec ini_set() (seuls les paramètres PHP_INI_ALL peuvent être modifiés avec ini_set())

Cela signifie que vous devez utiliser un fichier .htaccess pour ce faire - OR - implémentez un script pour inverser les effets des citations magiques. Quelque chose comme ça

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 );
}
42
Peter Bailey

Bien que je ne puisse pas dire pourquoi php_flag vous donne 500 Internal Server Errors, je soulignerai que le PHP manual a un exemple pour détecter si les guillemets magiques sont activés et les retirer des superglobaux lors de l'exécution. Contrairement aux autres postés, celui-ci est récursif et supprimera correctement les citations des tableaux:

Mise à jour: j'ai remarqué aujourd'hui qu'il y a une nouvelle version du code suivant dans le manuel PHP qui utilise des références aux super-globaux à 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);
}
?>
30
Powerlord

Cela résoudra le problème d'obtenir "Classe 'PDO' non trouvé" lorsque vous créez un fichier php.ini local.

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

  1. Créer un fichier texte
  2. Renommez-le en "php.ini"
  3. Ajoutez les lignes

    magic_quotes_gpc = Off
    magic_quotes_runtime = Off
    magic_quotes_sybase = Désactivé
    extension = pdo.so
    extension = pdo_mysql.so

  4. Enregistrez-le dans le ou les répertoires dans lesquels vos scripts s'exécutent.

Mise à jour: si vous souhaitez avoir une seule copie du nouveau fichier php.ini, ajoutez cette ligne à votre fichier racine .htaccess:

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

De toute évidence, vous devez déplacer le fichier ini à cet emplacement, car il n'y est pas déjà.

J'espère que ça sauve quelqu'un les 2 heures que ça m'a juste pris!

20
gonzo

Les php_flag et php_value à l'intérieur d'un fichier .htaccess sont techniquement corrects - mais pour PHP installé uniquement en tant que module Apache. Sur un hôte partagé, vous ne trouverez presque jamais une telle configuration; PHP est exécuté en tant que CGI à la place, pour des raisons liées à la sécurité (garder vos voisins de serveur hors de vos fichiers) et à la façon dont phpsuexec exécute les scripts en tant que 'vous' au lieu de l'utilisateur Apache.

Apache est donc correct en vous donnant une erreur de serveur: il ne connaît pas la signification de php_flag à moins que le module PHP soit chargé. Un binaire CGI est à Apache un programme externe à la place, et vous pouvez ne le configurez pas depuis Apache.

Maintenant pour la bonne nouvelle: vous pouvez mettre en place une configuration par répertoire en y mettant un fichier nommé ' php.ini ' et en y définissant vos instructions en utilisant le même syntaxe comme dans le php.ini principal du système. Le manuel PHP répertorie toutes les directives paramétrables: vous pouvez définir celles marquées avec PHP_INI_PERDIR ou PHP_INI_ALL, tandis que seul l'administrateur système peut définir celles marquées PHP_INI_SYSTEM dans le php.ini à l'échelle du serveur.

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

10
djn

======================== =============== MA SOLUTION ========= =================== (renommer votre php.ini en php5.ini)

et en haut (!), ajoutez ceux-ci:

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

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

5
T.Todua

Si vous exécutez PHP 5.3+ cela fera l'affaire, placez-le en haut de votre page:

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

Gère les clés, les valeurs et les tableaux multidimensionnels.

2
Alix Axel

si votre hébergeur utilise cpanel, vous pouvez essayer de copier php.ini dans votre répertoire web et le modifier avec magic_quotes_gpc = off

1
Adnan Anwar

Je sais que je suis en retard pour répondre à cela, mais j'ai lu la plupart des réponses et même si beaucoup étaient géniales, seulement djn a en fait expliqué pourquoi vous obteniez ce 500 Internal Server Error.

Bien que son explication soit correcte à 100%, c'est un exemple parfait de la raison pour laquelle vous devriez toujours envelopper ceux-ci dans un <IfModule>. Bien que cela ne résoudra pas le problème réel de ne pas pouvoir définir ces indicateurs dans votre .htaccess, cela empêchera au moins le 500 erreur .

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

Ou pour les anciennes versions, ce serait <IfModule mod_php.c> etc.

J'essaie de prendre l'habitude de toujours le faire afin d'éviter de telles 500 erreurs. Après cela, il suffit d'appliquer ce que Peter Bailey a dit .

1
Yes Barry

La réponse de BaileyP est déjà assez bonne, mais j'utiliserais plutôt cette condition:

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

C'est plus défensif.

0
middus

Que diriez-vous $_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); 
}
0
ZoRNdYuKe

Différents fournisseurs d'hébergement ont des procédures différentes pour ce faire, donc je demanderais sur leurs forums ou déposer une demande d'assistance.

Si vous ne pouvez pas les désactiver, vous pouvez toujours utiliser quelque chose comme ça qui échappera à la saisie, que les guillemets magiques soient activés ou désactivés:

//using mysqli

public function escapeString($stringToBeEscaped) {

    return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped));
}
0
Philip Morton
  1. Cela fonctionne-t-il si vous supprimez la ligne AddType? Je ne sais pas trop pourquoi cela est pertinent pour désactiver les citations magiques.

  2. Si PHP ne fonctionne pas sous mod_php, htaccess ne fonctionnera pas. Fonctionne-t-il comme CGI?

C'est vraiment un pour votre hébergeur.

0
Philip Reynolds