Quelqu'un connaît-il un moyen simple d'échapper le HTML aux chaînes dans jQuery ? Je dois pouvoir passer une chaîne arbitraire et la faire correctement échapper pour l'afficher dans une page HTML (empêchant les attaques par injection JavaScript / HTML). Je suis sûr qu'il est possible d'étendre jQuery pour ce faire, mais je ne connais pas suffisamment le framework pour le moment.
609
Réponses:
Puisque vous utilisez jQuery , vous pouvez simplement définir la
text
propriété de l'élément :la source
$(element2).attr("some-attr", $(element1).html());
Voir cet exemple: jsbin.com/atibig/1/editIl y a aussi la solution de moustache.js
la source
'
est mappé à une entité avec un format décimal , alors qu'il/
utilise le format hexadécimal .\n
à<br>
?Source: http://debuggable.com/posts/encode-html-entities-with-jquery:480f4dd6-13cc-4ce9-8071-4710cbdd56cb
la source
attr()
méthode de jQuery (à partir d'au moins 1.8.3) fait son propre encodage, de sorte que les chaînes non encodées peuvent être passées directement ; par exemple:$('<div/>').attr('test-attr', '\'Tis "fun" & stuff')[0].outerHTML
$('<div/>')
crée un nouveldiv
élément qui n'est pas attaché au DOM. Cela ne changera donc aucun élément existant. C'est un peu déroutant de voir comment jQuery utilise la même$()
fonction à la fois pour trouver des éléments ($('div')
) et pour les créer, et pour quelques autres choses en plus… :)Si vous vous échappez pour HTML, il n'y en a que trois qui pourraient être vraiment nécessaires:
En fonction de votre cas d'utilisation, vous pourriez aussi avoir besoin de faire des choses comme
"
à"
. Si la liste était suffisamment grande, j'utiliserais simplement un tableau:encodeURIComponent()
n'y échappera que pour les URL, pas pour HTML.la source
var
pour déclareritem
localement; de toute façon, n'utilisez pasfor … in
du tout de boucle lorsque vous parcourez un tableau! Utilisezfor
plutôt une boucle ordinaire . Oh, et ça ne l'estencodeURIComponent
pasescapeURIComponent
.é
; Voici une liste d'entités html, pour référence: w3schools.com/tags/ref_entities.aspSuffisamment simple à utiliser:
Underscore est une bibliothèque d'utilitaires qui fournit de nombreuses fonctionnalités que ne fournit pas js natif. Il y a aussi lodash qui est la même API que le trait de soulignement mais a été réécrit pour être plus performant.
la source
J'ai écrit une toute petite fonction qui fait ça. Il échappe seulement
"
,&
,<
et>
(mais généralement ce dont vous avez besoin est de toute façon tout). Il est légèrement plus élégant que les solutions proposées précédemment en ce qu'il n'en utilise qu'une.replace()
pour effectuer toute la conversion. ( EDIT 2: complexité du code réduite rendant la fonction encore plus petite et plus nette, si vous êtes curieux du code d'origine, voir la fin de cette réponse.)C'est du Javascript simple, pas de jQuery utilisé.
Échapper
/
et'
aussiModifier en réponse au commentaire de mklement .
La fonction ci-dessus peut facilement être étendue pour inclure n'importe quel caractère. Pour spécifier plus de caractères à échapper, insérez-les simplement dans la classe de caractères de l'expression régulière (c'est-à-dire à l'intérieur de
/[...]/g
) et en tant qu'entrée dans l'chr
objet. ( EDIT 2: raccourci également cette fonction, de la même manière.)Notez l'utilisation ci-dessus
'
pour l'apostrophe (l'entité symbolique'
peut avoir été utilisée à la place - elle est définie en XML, mais n'était pas à l'origine incluse dans la spécification HTML et pourrait donc ne pas être prise en charge par tous les navigateurs. Voir: Article Wikipedia sur les encodages de caractères HTML ). Je me souviens également d'avoir lu quelque part que l'utilisation d'entités décimales est plus largement prise en charge que l'utilisation d'hexadécimal, mais je n'arrive pas à trouver la source de cela maintenant. (Et il ne peut pas y avoir beaucoup de navigateurs qui ne prennent pas en charge les entités hexadécimales.)Remarque: L'ajout de
/
et'
à la liste des caractères d'échappement n'est pas très utile, car ils n'ont pas de signification particulière en HTML et n'ont pas besoin d'être échappés.escapeHtml
Fonction d' origineEDIT 2: La fonction d'origine a utilisé une variable (
chr
) pour stocker l'objet nécessaire au.replace()
rappel. Cette variable avait également besoin d'une fonction anonyme supplémentaire pour l'étendre, rendant la fonction (inutilement) un peu plus grande et plus complexe.Je n'ai pas testé laquelle des deux versions est la plus rapide. Si vous le faites, n'hésitez pas à ajouter des informations et des liens à ce sujet ici.
la source
mustache.js
et leunderscore.js
faire? En parlant de ce dernier: il ne reconnaît que les entités numériques (représentant'
et/
« ), dans l' hexagone majuscules forme quand un échapper. Ainsi, le texte s'est échappémustache.js
- qui utilise curieusement un mélange d'hex. et formats décimaux - ne serait pas correctement échappéunderscore.js
. Je me demande comment les autres bibliothèques populaires gèrent cela.'
ont une sorte de fonction réservée en XML (et donc XHTML, j'imagine?), C'est pourquoi XML (mais pas HTML) a l'entité nommée'
. Je ne sais pas exactement pourquoi ni de quelle manière il est «réservé». - Les barres obliques sont spéciaux dans les URL, mais cela ne fait les justifient l'inscription à échapper à HTML (comme URL encodage est quelque chose de complètement différent).'
: correct: utilisation sûre uniquement en XHTML ; directement à partir de la bouche de la foule - accentuation du mien: "(...) lu par un processeur HTML conforme , (...) l'utilisation de & apos; ou des références d'entité personnalisées peuvent ne pas être prises en charge (...)" - en pratique : les navigateurs modernes le supportent même en HTML . Re cas en nombres hexadécimaux. (même source; c'est moi qui souligne): "Le x doit être en minuscules dans les documents XML. […] Le hhhh peut mélanger majuscules et minuscules, bien que les majuscules soient le style habituel ." Nous laisse nous demander qui a décidé d'encoder les barres obliques; peut-être vraiment juste une confusion entre l'URI et le codage HTML?/
ne soit pas nécessaire, mais l'encodage'
semble toujours utile pour gérer en toute sécurité le cas où une chaîne codée est utilisée comme valeur d' attribut entre guillemets simples .Je me rends compte à quel point je suis en retard à cette fête, mais j'ai une solution très simple qui ne nécessite pas jQuery.
Edit: Cela n'échappe pas aux guillemets. Le seul cas où les guillemets devraient être échappés est si le contenu doit être collé en ligne dans un attribut dans une chaîne HTML. Il m'est difficile d'imaginer un cas où cela serait une bonne conception.
Edit 3: Pour la solution la plus rapide, vérifiez la réponse ci-dessus de Saram. Celui-ci est le plus court.
la source
<
et>
, il n'y a aucun avantage à échapper les guillemets également, à moins que l'intention du contenu généré ne soit d'aller dans un attribut.Voici une fonction JavaScript claire et claire. Il échappera du texte tel que "quelques <plusieurs" à "quelques-uns & lt; plusieurs".
la source
Après les derniers tests, je peux recommander une solution javaScript native (DOM) native la plus rapide et entièrement compatible avec les navigateurs :
Si vous le répétez plusieurs fois, vous pouvez le faire avec des variables une fois préparées:
Regardez ma comparaison finale de performance ( question de pile ).
la source
var p = document.createElement('p'); p.textContent = html; return p.innerHTML;
textContent
fonction n'est prise en charge que par Chrome 1+, Firefox 2, IE9, Opera 9.64 et Safari 3 (ces deux derniers annotés "peut-être plus tôt"). Cela briserait ainsi la revendication "totalement compatible avec tous les navigateurs" des PO.p.innerText = html; return p.innerHTML
Essayez la bibliothèque Underscore.string , cela fonctionne avec jQuery.
production:
la source
_.escape()
fonction utilitaire.J'ai amélioré l'exemple mustache.js en ajoutant la
escapeHTML()
méthode à l'objet chaîne.De cette façon, il est assez facile à utiliser
"Some <text>, more Text&Text".escapeHTML()
la source
__entityMap
à la portée locale de la fonction. Et enveloppé tout cela dansif (typeof String.prototype.escapeHTML !== 'function'){...}
escape()
etunescape()
sont destinés à encoder / décoder des chaînes pour les URL, pas HTML.En fait, j'utilise l'extrait de code suivant pour faire l'astuce qui ne nécessite aucun cadre:
la source
"
s, vous devez ajouter au moins'
et `` à la mêlée. Ceux-ci ne sont vraiment nécessaires que pour les données de balises de chaîne à l'intérieur des éléments en html. Pour les données html elles-mêmes (hors balises), seuls les 3 premiers sont requis.Si vous avez underscore.js, utilisez
_.escape
(plus efficace que la méthode jQuery publiée ci-dessus):la source
Si vous suivez la route des expressions rationnelles, il y a une erreur dans l'exemple de tghw ci-dessus.
la source
Ceci est un bel exemple sûr ...
la source
Vous pouvez facilement le faire avec vanilla js.
Ajoutez simplement un nœud de texte au document. Il sera échappé par le navigateur.
la source
Aucune variable globale, une certaine optimisation de la mémoire. Usage:
le résultat est:
la source
2 méthodes simples qui ne nécessitent AUCUN JQUERY ...
Vous pouvez encoder tous les caractères de votre chaîne comme ceci:
Ou tout simplement cibler les personnages principaux à se soucier
&
, les sauts de ligne,<
,>
,"
et'
comme:la source
Exemple d'échappement JavaScript simple:
la source
la source
fonctionne comme un charme
la source
Cette réponse fournit les méthodes jQuery et JS normales, mais c'est la plus courte sans utiliser le DOM:
Chaîne échappée:
It%27s%20%3E%2020%25%20less%20complicated%20this%20way.
Si les espaces échappés vous dérangent, essayez:
Chaîne échappée:
It%27s %3E 20%25 less complicated this way.
Malheureusement, la
escape()
fonction était obsolète dans JavaScript version 1.5 .encodeURI()
ouencodeURIComponent()
sont des alternatives, mais ils ignorent'
, donc la dernière ligne de code se transformerait en ceci:Tous les principaux navigateurs prennent toujours en charge le code court, et compte tenu du nombre d'anciens sites Web, je doute que cela changera bientôt.
la source
ES6 un liner pour la solution de moustache.js
la source
Si vous enregistrez ces informations dans une base de données , il est incorrect d'échapper au HTML à l'aide d'un script côté client , cela doit être fait sur le serveur . Sinon, il est facile de contourner votre protection XSS.
Pour clarifier mon propos, voici un exemple utilisant l'une des réponses:
Supposons que vous utilisez la fonction escapeHtml pour échapper le HTML d'un commentaire dans votre blog, puis le publier sur votre serveur.
L'utilisateur pourrait:
Si l'utilisateur colle cet extrait dans la console, il contourne la validation XSS:
la source
Toutes les solutions sont inutiles si vous ne re-fuite empêcher, par exemple la plupart des solutions garderaient échapper
&
à&
.la source