Désinfection de la saisie de l'utilisateur avant de l'ajouter au DOM en Javascript
Je suis en train d'écrire le JS pour une application de chat, je travaille sur mon temps libre, et j'ai besoin d'avoir HTML identificateurs qui changent en fonction de l'utilisateur des données soumises. C'est généralement quelque chose de conceptuellement assez fragile que je n'aurais même pas essayer, mais je ne me vois pas avoir trop le choix cette fois. Ce dont j'ai besoin pour faire est d'échapper à l'HTML id pour s'assurer qu'elle ne permettait pas de XSS ou de la rupture de HTML.
Voici le code:
var user_id = escape(id)
var txt = '<div class="chut">'+
'<div class="log" id="chut_'+user_id+'"></div>'+
'<textarea id="chut_'+user_id+'_msg"></textarea>'+
'<label for="chut_'+user_id+'_to">To:</label>'+
'<input type="text" id="chut_'+user_id+'_to" value='+user_id+' readonly="readonly" />'+
'<input type="submit" id="chut_'+user_id+'_send" value="Message"/>'+
'</div>';
Quel serait le meilleur moyen d'échapper à id
pour éviter tout type de problème mentionné ci-dessus? Comme vous pouvez le voir, en ce moment je suis en utilisant le haut- escape()
fonction, mais je ne suis pas sûr de savoir comment cela est censé être comparé à d'autres solutions de rechange. Je suis surtout utilisé pour la désinfection de l'entrée avant qu'il aille dans un nœud de texte, pas un identifiant lui-même.
- Quelle est exactement la fonction de
id
? - l'id est maintenant de toute chaîne de caractères représentant un utilisateur. Je l'utilise pour se différencier des structures similaires de la page qui appartiennent à différents utilisateurs. par cette logique, MD5 ou base64 pourrait être un bon attendre pour le faire, je suppose. Il n'y a juste pas de trucs pour que.
Vous devez vous connecter pour publier un commentaire.
Jamais utilisation
escape()
. Il n'a rien à voir avec le HTML de codage. C'est plus comme URL de codage, mais c'est pas la même bien que. C'est bizarre de codage non standard disponible uniquement en JavaScript.Si vous voulez un codeur HTML, vous devez écrire vous-même que JavaScript n'est pas de vous donner une. Par exemple:
Toutefois, si cela est suffisant pour mettre votre
user_id
dans des endroits comme leinput value
, il n'est pas assez pourid
parce que les Id ne pouvez utiliser qu'un choix limité de caractères. (Et%
n'est pas parmi eux, de sorteescape()
ou mêmeencodeURIComponent()
n'est pas bon.)Vous pourriez inventer votre propre schéma de codage pour mettre tous les caractères d'un IDENTIFIANT, par exemple:
Mais vous avez encore un problème si le même
user_id
se produit deux fois. Et pour être honnête, la chose à jeter dans les chaînes HTML est généralement une mauvaise idée. Utilisez les méthodes du DOM au lieu de cela, et de conserver JavaScript références pour chaque élément, de sorte que vous n'avez pas de continuer à l'appelergetElementById
, ou s'inquiéter de la façon arbitraire les chaînes de caractères sont insérés dans Id.par exemple.:
Vous pouvez également utiliser une fonction de commodité ou JS cadre de couper vers le bas sur la lenteur de la créer-ensemble-ajoute les appels.
ETA:
OK, puis envisager la jQuery 1.4 création de raccourcis, par exemple.:
Vous pouvez garder une recherche de
user_id
de nœuds d'élément (ou le papier d'emballage des objets) en JavaScript, pour éviter de mettre cette information dans les DOM, où les caractères qui peuvent aller dans unid
sont limités.(Le
_map_
préfixe est parce que les objets JavaScript n'est pas assez travail comme une cartographie de l'arbitraire des chaînes de caractères. La chaîne vide, et, dans IE, certainsObject
noms des membres, le confondre.)Vous pouvez utiliser ceci:
Voir aussi OWASP XSS Prévention de la Feuille de Triche.
`
Vous pouvez utiliser une expression régulière simple d'affirmer que l'id contient uniquement des caractères autorisés, comme suit:
Mon exemple permet de seuls les caractères alphanumériques et les chaînes de longueur 1 à 16, vous devez le modifier pour l'adapter au type d'identifiants que vous utilisez.
Par la façon dont, à la ligne 6, la valeur de la propriété est manquant d'une paire de guillemets, une erreur facile à faire lorsque l'on cite à deux niveaux.
Je ne peux pas voir votre flux de données selon le contexte, cette case ne doit pas être nécessaire, ou il peut ne pas être suffisant. Afin de faire un bon examen de la sécurité, nous aurions besoin de plus d'informations.
En général, construit en échapper ou de désinfecter les fonctions, de ne pas leur faire confiance aveuglément. Vous avez besoin de savoir exactement ce qu'ils font, et vous devez établir que c'est en fait ce dont vous avez besoin. Si ce n'est pas ce dont vous avez besoin, le code de votre propre, la plupart du temps une simple liste blanche des regex comme celui que je vous ai donné fonctionne très bien.
Depuis le texte que vous êtes échapper apparaîtra dans un attribut HTML, vous devez être sûr d'échapper non seulement les entités HTML, mais aussi les attributs HTML:
Ensuite, votre échapper code devient
var user_id = escapeHTML(id, true)
.Pour plus d'informations, voir À toute épreuve HTML échapper en Javascript.
Vous devez prendre des précautions supplémentaires lors de l'utilisation de données fournies par les utilisateurs dans les attributs HTML. Parce que les attributs a beaucoup plus de vecteurs d'attaque de sortie à l'intérieur des balises HTML.
La seule façon d'éviter les attaques XSS est de coder tout, sauf de caractères alphanumériques. Échapper tous les caractères ASCII des valeurs de moins de 256 avec les &#xHH; format. Qui, malheureusement, peut causer des problèmes dans votre scénario, si vous utilisez des classes CSS et javascript pour récupérer ces éléments.
OWASP a une bonne description de la façon d'atténuer attribut HTML XSS:
http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.233_-_JavaScript_Escape_Before_Inserting_untrusted_data_into_html_javascript_data_values