Permet d'avoir un examen rapide Pourquoi des caractères est nécessaire dans des contextes différents:
Si vous êtes dans une chaîne délimitée par citation, vous devez être en mesure d'échapper aux citations. Si vous êtes en XML, alors vous devez séparer "contenu" de "balisage" Si vous êtes en SQL, vous devez séparer les "commandes" de "données" Si vous êtes sur la ligne de commande, vous devez séparer "commands" from "data"
C'est un aspect vraiment fondamental de l'informatique en général. Parce que la syntaxe qui délimite les données peut se produire dans les données, il doit y avoir un moyen de différencier les données de la SYNTAX, par conséquent, l'échappement.
Dans la programmation web, les cas les plus courants fuyants sont: 1. texte Émission en HTML 2. Les données de la sortie dans les attributs HTML 3. Produire du HTML en HTML 4. Les données à insérer dans Javascript 5. Données de l'insertion dans SQL 6. Insertion de données dans une commande shell
Chacune a des implications de sécurité différentes si elle n'est pas gérée correctement. C'est vraiment important! Passons en revue dans le contexte de PHP:
Texte en HTML: htmlspecialchars (...)
données dans les attributs HTML htmlspecialchars (..., ENT_QUOTES)
HTML en HTML Utilisez une bibliothèque telle que HTMLPurifier pour vous assurer que seules les balises valides sont présentes.
Données en Javascript Je préfère json_encode
. Si vous le placez dans un attribut, vous devez toujours utiliser # 2, par exemple
Insertion de données dans SQL Chaque pilote possède une fonction escape() quelconque. C'est mieux. Si vous utilisez un jeu de caractères latin1 normal, addslashes (...) est approprié. N'oubliez pas les guillemets AUTOUR de l'appel addslashes():
"INSERT INTO table1 SET field1 = '". addslashes ($ data)."'"
données sur la ligne de commande escapeshellarg() et escapeshellcmd() - lire le manuel
- Prenez-les à cœur, et vous permettra d'éliminer 95% * de commun risques de sécurité Web! (* une supposition)
Pourquoi utiliser 'ENT_QUOTES' (plutôt que' ENT_NOQUOTES 'comme suggéré par moi)? –
J'utilise ENT_QUOTES pour les champs de saisie avec les données de la base de données. Donc, si les données ont 'ou' cela ne fermera pas la variable de valeur dans l'étiquette d'entrée –
Ólafur: oui, sur les champs de saisie (ou plus généralement les attributs) cela a un certain sens. ;-) –