Dans l'histoire de PHP, Magic Quotes était autrefois une fonctionnalité par défaut qui ajoute automatiquement le traitement des données de GET, Post et Cookie pour empêcher les problèmes de sécurité tels que l'injection SQL. Cependant, comme la confusion sur la commodité est plus que la commodité, les citations magiques ont été complètement supprimées de PHP 5.4.0.
Néanmoins, lors du maintien de certains anciens systèmes, nous pouvons encore rencontrer PHP 5.3 et moins. Il est très important de déterminer si les citations magiques sont activées. Cet article présentera comment utiliser la fonction get_magic_quotes_gpc () pour porter des jugements et fournir des suggestions de meilleures pratiques correspondantes.
get_magic_quotes_gpc () est une fonction intégrée fournie par PHP pour déterminer si Magic_Quotes_GPC est activée. Sa valeur de retour est un booléen:
Retour True pour indiquer que les citations magiques sont activées;
Le retour de faux signifie que les citations magiques sont désactivées.
if (get_magic_quotes_gpc()) {
echo "Les citations magiques sont activées";
} else {
echo "Les citations magiques fermées";
}
Si vous recevez un message d'erreur lors de l'exécution de la fonction, telle que "fonction non définie", cela signifie que votre version PHP est supérieure à 5.4 et que les citations magiques ont été supprimées.
Bien que l'intention d'origine des citations magiques soit bonne, elle entraînera en fait une évasion répétée des données. Les développeurs doivent juger dynamiquement s'il faut gérer manuellement les lasses () en fonction de l'environnement d'exploitation. Par exemple:
$user_input = $_POST['username'];
if (get_magic_quotes_gpc()) {
$user_input = stripslashes($user_input);
}
Ce code garantit que les données de $ user_input ne seront pas échappées de manière redondante en raison de devis magiques, ce qui facilite le traitement unifié ultérieur.
Le moyen le plus recommandé est de traiter toutes les données GPC uniformément à l'entrée, plutôt que de simplement juger à chaque fois:
function strip_magic_quotes(&$array) {
foreach ($array as $key => $value) {
if (is_array($value)) {
strip_magic_quotes($array[$key]);
} else {
$array[$key] = stripslashes($value);
}
}
}
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
strip_magic_quotes($_GET);
strip_magic_quotes($_POST);
strip_magic_quotes($_COOKIE);
}
Cette méthode garantit que toutes les données d'entrée de l'utilisateur dans l'application sont "purifiées" depuis le début, simplifiant le traitement logique ultérieur.
Bien que la compatibilité puisse être gérée à l'aide des méthodes ci-dessus, la meilleure solution consiste à mettre à niveau la version PHP . Des cadres PHP modernes (tels que Laravel, Symfony, etc.) ne soutiennent plus ou ne comptent plus sur des citations magiques. Il existe des méthodes plus complètes pour le filtrage des données et le contrôle de la sécurité, telles que:
Utiliser filter_input () et d'autres fonctions de filtre d'entrée;
Utilisez des paramètres de liaison APD pour empêcher l'injection SQL;
Utilisez htmlSpecialChars () pour la sortie HTML.
Lors du débogage d'un ancien système PHP, vous pouvez utiliser un script de débogage simple pour déterminer rapidement si l'environnement actuel est activé avec des citations magiques:
echo '<pre>';
echo 'magic_quotes_gpc: ' . (get_magic_quotes_gpc() ? 'ON' : 'OFF') . PHP_EOL;
echo 'Sample $_GET: ' . print_r($_GET, true);
echo '</pre>';
Après le déploiement du script, accédez à l'URL, comme:
http://gitbox.net/debug.php?name=O\'Reilly
Si vous voyez la sortie comme:
name => O\\'Reilly
Cela signifie que les citations magiques ont pris effet (les barreaux réalisateurs sont automatiquement ajoutées) et des laslas () sont nécessaires.