je trouve beaucoup mieux pour échapper aux données au moment où il est utilisé, et non sur la manière Vous pouvez utiliser ces données dans. JSON, XML, Shell, MySQL, Curl ou HTML et chacun aura sa propre façon d'échapper les données.
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, tel que
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)
Malheureusement, mon jeu de caractères est UTF-8 et ne se limite pas à des caractères latins. Je l'ai descendu pour que tout soit échappé correctement, mais je suppose que je suis juste trop paranoïaque que je vais laisser quelque chose ouvert d'injection SQL. – Greg
mysql_real_escape_characters est la meilleure option pour désinfecter les entrées utilisateur qui vont dans la base de données. – Residuum
@Residuum: Je n'arrive pas à trouver ça dans le manuel. – Greg