magic_quotes_gpc et htaccess

Eléphant du PHP | 193 Messages

08 juin 2009, 14:57

Bonjour à tous!

Habitués à Infomaniak, nous avons toujours eu par défaut dans notre php.ini des magic_quotes_gpc = off. Nous utilisions donc des fonctions mysql_real_escape_string pour protéger les quotes.

Nous sommes en trains d'essayer Ophos qui par défaut place les magic_quotes_gpc à ON; ce qui nous donne des phrases du type :
Ceci est une phrase de test que j\\\\\\\\\'essaie de tester
J'ai donc essayé de régler cet élément sur off via htaccess avec

Code : Tout sélectionner

magic_quotes_gpc = Off
Mais là j'ai le droit à une erreur 500...

Savez-vous quelle est est la solution?

Merci par avance

Cordialement,

@+!

Neomcdn
Modifié en dernier par Neomcdn le 09 juin 2009, 10:42, modifié 1 fois.

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 15:03

Essaies plutôt : php_flag magic_quotes_gpc off

Eléphant du PHP | 193 Messages

08 juin 2009, 15:43

Salut AB et merci pour ta réponse.

Je viens de tester et j'ai toujours l'erreur :

http://www.parcs-jardins.fr/

Le .htaccess placé à la racine contient :

php_flag magic_quotes_gpc off

Est-ce suffisant ?

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 16:11

Apparemment ton serveur n'accepte pas les configurations via .htaccess (c'est assez fréquent)

Il te reste à modifier tes pages pour inclure par exemple :
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);
}
Ainsi tu retrouveras l'équivalent de ton ancienne config et tu n'auras pas besoin de retirer ces lignes si tu retrouve un serveur avec magic_quotes_gpc sur off
Modifié en dernier par AB le 08 juin 2009, 17:13, modifié 1 fois.

Eléphant du PHP | 193 Messages

08 juin 2009, 16:34

Je trouve çà bizarre que ce ne soit pas autorisé.

Il y a ici une liste des choses permises :

http://www.ophos.com/hebergement/faq-as ... info5.html

et il est indique '--enable-magic-quotes'

Et là, ils précisent que le htaccess est autorisé...

http://www.ophos.com/hebergement/faq-as ... CCESS.html

Qu'en penses-tu?

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 17:12

Le premier lien que tu donne indique la configuration serveur et que magic quote est activé (mais pas que tu peux le modifier).

Le deuxième lien indique que tu peux créer des .htaccess . Mais le serveur peut prendre en compte certaines règles inclues dans le .htacces et en refuser certaines autres. La plupart du temps ils autorisent les redirections, les réécritures et les règles de restriction mais cela se limite là.
Ce serait d'ailleurs assez cohérent avec la configuration php puisque je vois que ini_set est désactivé.

C'est le cas de la très grande majorité des mutualisés, mais tu peux toujours contacter ton hébergeur pour en être certain.

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 17:17

La doc ici http://fr2.php.net/manual/fr/security.m ... abling.php (j'ai modifié mon avant dernier post pour indiquer la fonction de l'exemple 2).

Eléphant du PHP | 193 Messages

08 juin 2009, 17:41

Merci!

çà semblait fonctionner avec

Code : Tout sélectionner

<?php if (get_magic_quotes_gpc()) { $_POST = array_map('stripslashes',$_POST); $_GET = array_map('stripslashes',$_GET); $_COOKIE = array_map('stripslashes',$_COOKIE); } ?>
Il faut mieux que j'utilise le second?

Code : Tout sélectionner

<?php if (get_magic_quotes_gpc()) { $_POST = array_map('stripslashes',$_POST); $_GET = array_map('stripslashes',$_GET); $_COOKIE = array_map('stripslashes',$_COOKIE); } ?>
Merci pour ton aide!

@+!
Je n'ai toujours pas codé de fonction... Le temps viendra!

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 20:56

Oui mais le code ci-dessus ne fonctionne que pour les tableaux uni dimensionnels. C'est pour cela que j'ai édité mon précédent post pour indiquer un code (cf ci-dessous) qui fonctionne même pour les tableaux multi dimensionnels (c'est l'exemple 2 du manuel).
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);
} 

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 22:49

Ou là décidément cette page du manuel est buguée.

Dans le cas où les clés des tableaux possèdent des quotes (cas relativement rare, mais bon...), les clés ne seront pas traitées avec la fonction donnée dans l'exemple 2.

Plus bas dans cette page, plusieurs lecteurs mentionnent ce problème dont un qui propose une solution (17-Dec-2006 08:20). Mais la fonction proposée n'est pas parfaite non plus puisqu'elle ignore les clés de premier niveau!

Je vais donc tenter de simplifier cette dernière fonction pour qu'elle fonctionne dans tous les cas :
if (get_magic_quotes_gpc()) {
    function undoMagicQuotes($array) {
	
        $newArray = array();
		
        foreach($array as $key => $value) 
			{

				$key = stripslashes($key);

				if (is_array($value)) 
				{
					$newArray[$key] = undoMagicQuotes($value);
				}
				else 
				{
					$newArray[$key] = stripslashes($value);
				}
        	}
        return $newArray;
    }
    $_GET = undoMagicQuotes($_GET);
    $_POST = undoMagicQuotes($_POST);
    $_COOKIE = undoMagicQuotes($_COOKIE);
    $_REQUEST = undoMagicQuotes($_REQUEST);
}

Eléphant du PHP | 193 Messages

09 juin 2009, 10:32

Merci pour ton aide!

J'essaie ce code!

@+!
Je n'ai toujours pas codé de fonction... Le temps viendra!

stephrav
Invité n'ayant pas de compte PHPfrance

27 févr. 2012, 16:42

Depuis la parution de PHP 5, les concepteurs et distributeurs du langage semblent renoncer à cet échappement automatique. Le problème est de risquer de se trouver dans une situation où certain serveurs pratiquent l’échappement et d’autres non.
Le seul moyen pour régler le problème une fois pour toutes et de normaliser systématiquement les données HTTP.
Personnellement, je préfères tester, à l’entrée de tout script, si le mode d’échappement automatique est activé. Si oui, on supprime cet échappement, pour toutes les chaînes transmises, avec la fonction stripSlashes(). On peut alors considérer par la suite que les données HTTP sont représentées normalement, comme n’importe quelle autre chaîne de caractères manipulée dans le script.

Voici la fonction qui effectue cette opération sur chacun des tableaux contenant d’une part des données transmises en mode get ou post, d’autre part des cookies.
// Application de la suppression des échappements, si nécessaire, dans tous les tableaux contenant les données HTTP
function Normalisation( )
{
   // Dans le cas ou l'on est en échappement automatique, on rectifie
   if(get_magic_quotes_gpc ( ) ) 
   {
                $_POST = NormalisationHTTP($_POST) ;
                $_GET = NormalisationHTTP($_GET) ;
                $_REQUEST = NormalisationHTTP($_REQUEST) ;
                $_COOKIE = NormalisationHTTP($_COOKIE) ;
  }
}

// Puis la fonction de suppression des échappements automatique des données HTTP dans un tableau de quelconque dimension
function NormalisationHTTP($tableau)
{
   // Parcours du tableau
   foreach ($tableau as $cle => $valeur)
   {
       if(!is_array($valeur) )  // C'est un élément, on agît
        {
            $tableau[$cle] = stripSlashes($valeur) ;
        } else // c'est un tableau, on appelle récursivement
        { $tableau[$cle] = NormalisationHTTP($valeur) ; }
   }
return $tableau;
}
Bien évidement, je ne sorts pas cela d'une marmite. Je vous recommande donc vivement le livre de Philippe Rigaux : Pratique de MySQL et PHP qui est particulièrement bien structuré et méthodique.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 févr. 2012, 18:22

3 ans après c'est un peu tard :mrgreen:
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2287 Messages

27 févr. 2012, 23:23

3 ans après c'est un peu tard :mrgreen:
On peut quand même rajouter cet extrait du changelog de la dernière RC de php :

Code : Tout sélectionner

- Removed features: . Removed magic_quotes_gpc, magic_quotes_runtime and magic_quotes_sybase ini options. get_magic_quotes_gpc, get_magic_quotes_runtime are kept but always return false, set_magic_quotes_runtime raises an E_CORE_ERROR. (Pierrick, Pierre)
Cela veut dire que les magic_quotes et les problèmes qui vont avec seront définitivement oubliés à partir de php 5.4 (final).
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
AB
ViPHP | 5818 Messages

02 mars 2012, 21:18

Oui ce qui sous entend que de nombreux hébergeurs vont certainement patienter longtemps avant de proposer php 5.4 (pour compatibilité avec de vieux scripts)... notamment ceux qui ne proposent qu'une version de php dans leur offre.