2009-02-08 10 views
5

Lors de la sortie d'une entrée utilisateur, n'utilisez-vous que htmlspecialchars() ou existe-t-il des fonctions/actions/méthodes que vous exécutez également? Je suis à la recherche de quelque chose qui va aussi traiter avec XSS.Exécutez-vous uniquement htmlspecialchars() en sortie ou y a-t-il d'autres fonctionnalités que vous utilisez?

Je me demande si je devrais écrire une fonction qui échappe l'entrée de l'utilisateur sur la sortie ou juste utiliser htmlspecialchars(). Je cherche les cas génériques, pas les cas spécifiques qui peuvent être traités individuellement.

Répondre

10

J'utilise habituellement

htmlspecialchars($var, ENT_QUOTES) 

sur les champs d'entrée. J'ai créé une méthode qui fait cela parce que je l'utilise beaucoup et cela rend le code plus court et plus lisible.

+1

Pourquoi utiliser 'ENT_QUOTES' (plutôt que' ENT_NOQUOTES 'comme suggéré par moi)? –

+2

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 –

+1

Ólafur: oui, sur les champs de saisie (ou plus généralement les attributs) cela a un certain sens. ;-) –

7

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:

  1. Texte en HTML: htmlspecialchars (...)

  2. données dans les attributs HTML htmlspecialchars (..., ENT_QUOTES)

  3. HTML en HTML Utilisez une bibliothèque telle que HTMLPurifier pour vous assurer que seules les balises valides sont présentes.

  4. Données en Javascript Je préfère json_encode. Si vous le placez dans un attribut, vous devez toujours utiliser # 2, par exemple

  5. 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)."'"

  6. 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)

-5

Vous ne devriez pas nettoyer le texte en sortie, cela devrait arriver en entrée. J'utilise un filtre qui filtre toutes les entrées de l'application. Il est configurable de sorte qu'il peut autoriser des tags/données spécifiques en cas de besoin (par exemple pour un éditeur wysiwig).

Vous devriez faire le moins de traitement de texte possible sur la sortie afin d'assurer la vitesse. Le traiter une fois crée beaucoup moins de tension, puis le traiter 500 000 fois.

+0

J'ai été d'accord avec vous, sauf que généralement la théorie est d'accepter uniquement les entrées qui sont valides, mais vous devez toujours échapper la sortie .Le problème survient quand quelqu'un entre une citation dans son nom d'utilisateur, vous échapper à i t pour HTML, il devient inutile pour la génération de PDF. –

+0

Cela dit, si vous programmez ceci pour le web, combien de fois sera-t-il visualisé sur le vers web exporté en PDF. Je suppose que vous ne générez pas de PDF à la volée sur chaque vue. Donc, mon point est fort, dans le cas d'une exportation PHP, vous pouvez simplement inverser la sortie. – Syntax

+0

Eh bien, la règle est toujours que vous voulez stocker les données des utilisateurs aussi exactement que possible dans la base de données et à la sortie de le modifier au besoin. Je travaille sur certains sites où 50% du web/HTML et 50% est PDF/Excel/etc. –