Dans les versions PHP antérieures, la fonction get_magic_quotes_gpc () a été utilisée pour déterminer si l'élément de configuration magique_quotes_gpc est activé. Lorsque cet élément sera allumé , PHP échappera automatiquement aux données soumises via Get , Post et Cookie , c'est-à-dire qu'elle ajoutera automatiquement des barreaux de barreaux avant des caractères spéciaux (tels que des citations simples , des citations doubles " et des barreaux de barreaux \ ). Cela est destiné à empêcher l'injection de SQL, mais cette pratique provoquera des inconvénients dans de nombreux scénarios, et même la conduite de Double dans les données.
Lorsque Magic_Quotes_GPC est activé, les données soumises par l'utilisateur ont été automatiquement ajoutées avec des caractères d'échappement. Si le développeur utilise manuellement ADDSLASHES () et d'autres fonctions pour traiter ces entrées après avoir reçu les données, cela entraînera des problèmes d'échappement doubles. Par exemple, la chaîne entrée à l'origine est:
I'm a user.
La première fois, il est automatiquement échappé par magic_quotes_gpc devient:
I\'m a user.
Si vous utilisez AddSlashes () à nouveau pour le moment:
I\\'m a user.
Ensuite, le contenu stocké dans la base de données est incompatible avec l'intention d'origine de l'utilisateur et peut facilement provoquer la confusion des données.
Afin d'éviter une double évasion, les développeurs doivent d'abord déterminer si Magic_Quotes_GPC est activé. Si vous êtes activé, effectuez d'abord l'inversion des données, puis décidez d'effectuer une évasion manuelle au besoin.
L'entrée du tableau par l'utilisateur peut être traitée de manière récursive pour garantir que les bombardements dans toutes les données sont supprimés correctement.
Voici un exemple de code:
<code> Fonction CleanInput ($ data) {if (is_array ($ data)) {return array_map ('CleanInput', $ data); } else {return stridslashes ($ data); }} if (get_magic_quotes_gpc ()) {
$ _Get = CleanInput ($ _ get);
$ _Post = CleanInput ($ _ post);
$ _Cookie = CleanInput ($ _ Cookie);
}
</code>
Dans cet exemple, nous définissons une fonction CleanInput () qui traite récursivement chaque valeur dans le tableau, appelant Stripslashes () pour supprimer les caractères d'échappement inutiles. Si get_magic_quotes_gpc () renvoie true , trois tableaux hyperglobaux, $ _get , $ _post et $ _cookie , sont nettoyés.
Il convient de noter que Magic_Quotes_GPC a été déprécié dans PHP 5.4.0 et a été complètement supprimé dans PHP 7.0.0. Par conséquent, dans le développement de PHP moderne, ce problème n'existe plus. Mais lorsque vous maintenez les anciens projets ou la gestion de certains systèmes hérités, il est toujours nécessaire de savoir comment y faire face.
Si vous utilisez toujours l'ancienne version de PHP et que vous ne pouvez pas mettre à niveau, il est recommandé d'effectuer une logique de traitement unifiée lorsque le projet est initialisé, nettoyez toutes les entrées avant d'effectuer des opérations ultérieures.
De plus, l'utilisation de méthodes d'accès à la base de données modernes (telles que l'APD) combinées avec des mécanismes de liaison des paramètres peut non seulement empêcher l'injection de SQL, mais également éviter la cumbersomeness de l'échappement manuelle des chaînes. Par exemple:
<code> $ PDO = new PDO ('mysql: host = localhost; dbname = test', 'utilisateur', 'mot de passe'); $ stmt = $ PDO-> Préparer ('select * chez les utilisateurs où email =: e-mail'); $ stmt-> exécuter (['email' => '[email protected]']); </code>Comme indiqué ci-dessus, la liaison des paramètres évite l'épissage direct de SQL, résolvant fondamentalement les problèmes d'évasion et d'injection.
Le mécanisme d'échappement automatique de Magic_Quotes_GPC est une conception "apparemment sécurisée", mais elle apporte souvent plus de problèmes dans le développement réel. Comprendre son principe de travail et l'adoption des méthodes de traitement appropriées peuvent éviter efficacement le problème de la double évasion des données. Dans le même temps, il est également recommandé d'utiliser des paradigmes de programmation PHP modernes et des interfaces de base de données pour éliminer progressivement les dépendances de ces fonctionnalités obsolètes pour améliorer la maintenabilité et la sécurité du code.