Dans les versions antérieures de PHP, get_magic_quotes_gpc () est une fonction utilisée pour détecter si les "citations magiques" sont activées. Les devis magiques sont un mécanisme par lequel PHP échappe automatiquement aux devis dans les données d'entrée utilisateur (tels que $ _get , $ _post , $ _cookie ) dans le but de prévenir les attaques d'injection SQL. Cependant, avec la mise à niveau de la version PHP, cette fonction a été considérée comme à la fois dangereuse et déroutante, et a finalement été complètement supprimée dans PHP 5.4.
Néanmoins, de nombreux anciens projets et codes utilisent toujours GET_MAGIC_QUOTES_GPC () , et des erreurs courantes se produisent souvent, en particulier lorsqu'ils ignorent les citations magiques, entraînant des erreurs de traitement des données et même des risques de sécurité. Cet article couvrira ces erreurs courantes et comment les éviter.
Les citations magiques ajouteront automatiquement des barres à barres à des citations simples ( ' ), des citations doubles ( " ), des barres arrière ( \ ) et des caractères nuls dans les données d'entrée. Par exemple, l'entrée O'Reilly sera automatiquement convertie en o \' Reilly .
Bien qu'il semble empêcher l'injection de SQL, il apporte en fait les problèmes suivants:
Les données sont échappées à plusieurs reprises, ce qui entraîne une exception de chaîne.
La logique du code est chaotique et il est difficile de dire si les données ont été échappées.
Les développeurs ont tendance à ignorer la situation de fermeture des citations magiques.
if (get_magic_quotes_gpc()) {
$input = stripslashes($_GET['input']);
} else {
$input = $_GET['input'];
}
Ce code suppose que les citations magiques sont activées ou désactivées, et la logique de traitement ne considère que deux de ces cas extrêmes. Mais si certaines entrées ne sont pas échappées après la fermeture des citations magiques, l'opération de rayures détruira les données.
get_magic_quotes_gpc () est jeté dans PHP 5.4 et plus tard. Si le code appelle cette fonction directement, une erreur peut être signalée:
if (get_magic_quotes_gpc()) { // PHP 7+ Signaler une erreur
// ...
}
De nombreux développeurs ne traitent qu'une certaine partie des données dans $ _get ou $ _post , et ignorent les caractères d'évasion possibles dans d'autres variables hyperglobales telles que $ _cookie .
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
$input = stripslashes($_GET['input']);
} else {
$input = $_GET['input'];
}
De cette façon, même s'il est appelé dans la nouvelle version de PHP, cela ne provoquera pas d'erreur.
function clean_magic_quotes() {
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
}
}
clean_magic_quotes();
Ce code garantit que quelle que soit la source d'entrée, les caractères d'échappement ajoutés automatiquement peuvent être supprimés uniformément pour éviter les incohérences de données.
Étant donné que les citations magiques sont obsolètes, il est recommandé de désactiver complètement la fonctionnalité et de ne pas compter sur lui pour empêcher l'injection de SQL. Utilisez plutôt la méthode suivante:
Utilisez des instructions préparées et des liaisons de paramètres (telles que l'OPD ou l'extension MySQLI).
Vérification stricte et filtrage de l'entrée utilisateur.
Utilisez des fonctions telles que htmlSpecialChars () pour empêcher les attaques XSS.
Exemple de code:
$pdo = new PDO('mysql:host=gitbox.net;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $_GET['username']]);
$results = $stmt->fetchAll();
Ne comptez pas sur des citations magiques , c'est un design obsolète et dangereux.
Si vous maintenez l'ancien code, vous devez d'abord vérifier si la fonction existe avant d'appeler get_magic_quotes_gpc () .
Nettoyez les caractères échappés de manière unifiée dans toutes les données d'entrée pour éviter les erreurs causées par le traitement local.
Il est préférable de mettre à niveau le code, d'abandonner complètement les citations magiques et d'adopter des méthodes d'accès et de filtrage de données plus sûres.
Grâce aux méthodes ci-dessus, vous pouvez éviter efficacement les divers problèmes causés par l'ignorance des citations magiques et assurer la stabilité et la sécurité du code.