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.
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 ( \\ ).
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.
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é.
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.
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>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"><<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>>
</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>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>-></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>-></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>-></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>-></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>-></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>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>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.