Position actuelle: Accueil> Derniers articles> Des questions et des solutions fréquemment posées pour get_magic_quotes_gpc lorsqu'ils traitent avec un codage de caractères multi -yte

Des questions et des solutions fréquemment posées pour get_magic_quotes_gpc lorsqu'ils traitent avec un codage de caractères multi -yte

gitbox 2025-09-18

Dans PHP, get_magic_quotes_gpc est une fonction qui vérifie si l'élément de configuration magique_quotes_gpc est activé. Magic_Quotes_GPC est un paramètre PHP obsolète qui a été utilisé autrefois pour échapper automatiquement aux données de l'entrée, de l'URL ou des cookies pour empêcher les attaques d'injection SQL. Cependant, dans le codage des caractères multi-octets (comme UTF-8), le traitement de get_magic_quotes_gpc peut causer des problèmes inattendus, en particulier pour les jeux de caractères non anglais.

1. Le rôle de get_magic_quotes_gpc

get_magic_quotes_gpc Vérifiera les paramètres MAGIC_QUOTES_GPC de PHP, renvoyant True ou Faux . Si Magic_Quotes_GPC est défini sur ON , PHP échappera automatiquement aux données de $ _get , $ _post et $ _cookie . Cela signifie que toutes les citations simples ( ' ), les citations doubles ( " ) et les barres oblique inverse ( \ ) sont automatiquement échappées avec des barres oblique inverse ( \\ ).

2. Problème d'encodage de caractères multi-octets

Magic_Quotes_GPC peut souvent conduire à des résultats inattendus lorsqu'ils traitent avec un codage de caractères multi -yte (comme UTF-8). Le codage UTF-8 utilise plusieurs octets pour représenter un caractère, tandis que le traitement de Magic_Quotes_GPC est principalement destiné aux jeux de caractères à un octet, ce qui peut ajouter à tort des barreaux de bar aux caractères multi-octets, brisant ainsi l'encodage original des caractères.

Par exemple:

Supposons que l'entrée de formulaire contient un caractère chinois "bonjour". Si Magic_Quotes_GPC est activé, il insère la barre arrière au milieu du flux d'octets codé par le caractère sur certains octets, ce qui fait que la chaîne devient "vous \ ok" ou "vous \ ok", ce qui empêchera le backende de décoder correctement les caractères originaux lors du traitement, et peut même conduire à un code brouillé.

3. Pourquoi PHP déprécie-t- il Magic_Quotes_GPC ?

Magic_Quotes_GPC a été conçu pour empêcher l'injection de SQL au début, mais avec le développement continu de PHP, cette configuration n'est plus recommandée car elle apporte de nombreux problèmes:

  • Il ne gère pas correctement le codage des caractères de plusieurs habitants.

  • Il ajoute des caractères d'évasion supplémentaires, ce qui fait que les développeurs font une inversion supplémentaire lors du traitement des données d'entrée.

  • Pour les requêtes de base de données modernes, l'utilisation de instructions préparées peut effectivement empêcher l'injection SQL sans s'appuyer sur Magic_Quotes_GPC .

Par conséquent, après PHP 5.4.0, Magic_Quotes_GPC a été complètement abandonné et complètement supprimé dans PHP 7.0.0.

4. Solutions lorsqu'ils traitent avec un codage de caractères à plusieurs rejets

4.1 Assurez-vous de désactiver Magic_quotes_gpc

Tout d'abord, assurez-vous que Magic_Quotes_GPC est désactivé. Il peut être désactivé en vérifiant le fichier de configuration PHP ( PHP.ini ):

 <span><span><span class="hljs-attr">magic_quotes_gpc</span></span><span> = </span><span><span class="hljs-literal">Off</span></span><span>
</span></span>

De plus, vous pouvez également utiliser get_magic_quotes_gpc () dans le code PHP pour déterminer si le paramètre est actuellement activé. Si vous êtes activé, vous pouvez supprimer manuellement les caractères échappés:

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">get_magic_quotes_gpc</span></span><span>()) {
    </span><span><span class="hljs-variable">$_GET</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_GET</span></span><span>);
    </span><span><span class="hljs-variable">$_POST</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_POST</span></span><span>);
    </span><span><span class="hljs-variable">$_COOKIE</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'stripslashes'</span></span><span>, </span><span><span class="hljs-variable">$_COOKIE</span></span><span>);
}
</span></span>

4.2 Utiliser le codage des caractères approprié

Lors du traitement de l'entrée du formulaire, assurez-vous que le client et le serveur utilisent le même codage de caractères et que UTF-8 est recommandé. Cela peut être fait en spécifiant le jeu de caractères dans le document HTML:

 <span><span><span class="hljs-tag">&lt;<span class="hljs-name">meta</span></span></span><span> </span><span><span class="hljs-attr">charset</span></span><span>=</span><span><span class="hljs-string">"UTF-8"</span></span><span>&gt;
</span></span>

En même temps, utilisez la fonction MB_CONVERT_ENCODING en PHP pour assurer la cohérence du codage des caractères:

 <span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'auto'</span></span><span>);
</span></span>

4.3 Utiliser des instructions SQL préparées

Pour éviter les attaques d'injection SQL, vous devez toujours utiliser des instructions SQL préparées au lieu de compter sur magic_quotes_gpc pour s'échapper automatiquement. Cette méthode résout non seulement le problème du codage, mais empêche également efficacement l'injection de SQL.

Utilisez PDO ou MySQLI pour implémenter les instructions préparées:

 <span><span><span class="hljs-comment">// utiliserPDO</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();

</span><span><span class="hljs-comment">// utiliserMySQLi</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>

5. Résumé

get_magic_quotes_gpc et magic_quotes_gpc ne sont plus recommandés dans le développement de PHP moderne. Pour le traitement du codage des caractères multi-octets, une attention particulière doit être accordée à la cohérence de l'évasion et du codage des caractères pour assurer l'exactitude et la sécurité des données. La meilleure chose à faire est de désactiver Magic_Quotes_GPC , d'utiliser des méthodes de vérification des entrées modernes telles que des instructions SQL préparées et de s'assurer d'utiliser un codage de caractères uniforme (comme UTF-8) pour éviter les caractères brouillés et les problèmes d'évacuation inutiles.