web-dev-qa-db-fra.com

La méthode jQuery .text () XSS est-elle sûre?

J'ai des données non échappées des utilisateurs.

Est-il donc sûr d'utiliser comme ceci:

var data = '<test>a&f"#</test>'; // example data from ajax response
if (typeof(data) === 'string')
    $('body').text(data);

Puis-je utiliser comme ça ou il y a des problèmes comme l'encodage ou certains symboles spécifiques que je dois faire attention et ajouter une validation plus stricte?

62
Vytautas

Lorsque vous définissez le texte d'un élément à l'aide de la méthode text, jQuery utilise createTextNode en interne, ce qui échappe à tous les caractères spéciaux.

Depuis les documents jQuery :

Nous devons être conscients que cette méthode échappe à la chaîne fournie si nécessaire pour qu'elle s'affiche correctement en HTML. Pour ce faire, il appelle la méthode DOM .createTextNode(), qui remplace les caractères spéciaux par leurs équivalents d'entité HTML (tels que &lt; pour <)

Alors oui, ça devrait être sûr. Voici votre exemple dans jsfiddle . Remarquez comment les balises apparaissent sous forme de texte littéral.

57
James Allardice

Étant donné que les attaques XSS reposent sur la possibilité d'insérer des nœuds DOM (<img />, <script />), Etc., et que jQuery.fn.text() ne le prend pas en charge, il est entièrement sûr pour XSS.

Comme vous pouvez le voir dans cet exemple de base , toutes les balises éventuelles sont codées à la suite de jQuery utilisant createTextNode en interne:

jQuery('div').text('<test>a&f"#</test>');​

De sorte que ce qui est réellement inséré est plus équivalent à;

jQuery('div').html('&lt;test&gt;a&f"#&lt;/test&gt;');​
14
Matt

Vous devez toujours être prudent lors de l'insertion du résultat dans le DOM - voir: Vulnérabilité Cross-Site Scripting avec JavaScript et JQuery .

Pour définir le texte des éléments, cependant, le texte doit être sécurisé XSS.

8
Matthias

L'auteur de http://benv.ca/2012/10/02/you-are-probably-misusing-DOM-text-methods/ plaide contre l'utilisation de createTextNode ou de jQuery's .text().

... si vous connaissez le contexte dans lequel vous injectez la valeur (c'est-à-dire pas les attributs), alors cette méthode est sûre. Mon argument est que les développeurs ne comprennent pas assez bien ces contextes, et tôt ou tard ils se tromperont.

Il est préférable d'utiliser le remplacement de chaîne (d'au moins <).

Quelques exemples de bibliothèques bien sécurisées:

# 1 suggestion OWASP est:

RÈGLE # 1 - Échap HTML avant d'insérer des données non fiables dans le contenu de l'élément HTML

1
Luke

Contrairement à la méthode .html (), .text () peut être utilisé dans les documents XML et HTML. Le résultat de la méthode .text () est une chaîne contenant le texte combiné de tous les éléments correspondants. (En raison des variations des analyseurs HTML dans différents navigateurs, le texte renvoyé peut varier dans les nouvelles lignes et autres espaces blancs.)

.text(data) supprimerait le <test></test> loin et vous laisse avec a&f#

0
mas-designs