J'ai des cordes comme
var str = 'One & two & three';
rendu en HTML par le serveur web. J'ai besoin de transformer ces cordes en
'One & two & three'
Actuellement, c'est ce que je fais (avec l'aide de jQuery):
$(document.createElement('div')).html('{{ driver.person.name }}').text()
Cependant, j'ai le sentiment troublant de me tromper. j'ai essayé
unescape("&")
mais cela ne semble pas fonctionner, ni decodeURI / decodeURIComponent.
Y a-t-il d'autres façons plus natives et élégantes de le faire?
escape
d ou URI , ces fonctions ne fonctionneront pas.𝕫
. C'est un problème avec une spécification en évolution; en tant que tel, vous devez choisir un outil en cours de maintenance pour le résoudre.Réponses:
Une option plus moderne pour interpréter HTML (texte et autres) à partir de JavaScript est le support HTML dans l'
DOMParser
API ( voir ici dans MDN ). Cela vous permet d'utiliser l'analyseur HTML natif du navigateur pour convertir une chaîne en un document HTML. Il est pris en charge dans les nouvelles versions de tous les principaux navigateurs depuis fin 2014.Si nous voulons simplement décoder du contenu textuel, nous pouvons le mettre comme seul contenu dans un corps de document, analyser le document et retirer le son
.body.textContent
.Nous pouvons voir dans le projet de spécification
DOMParser
que JavaScript n'est pas activé pour le document analysé, nous pouvons donc effectuer cette conversion de texte sans problèmes de sécurité.Cela dépasse le cadre de cette question, mais veuillez noter que si vous prenez les nœuds DOM analysés eux-mêmes (pas seulement leur contenu texte) et les déplacez vers le document en direct DOM, il est possible que leur script soit réactivé, et il pourrait y avoir être des préoccupations de sécurité. Je n'ai pas fait de recherche, alors soyez prudent.
la source
Avez-vous besoin de décoder toutes les entités HTML encodées ou juste
&
lui - même?Si vous avez seulement besoin de gérer,
&
vous pouvez le faire:Si vous devez décoder toutes les entités HTML, vous pouvez le faire sans jQuery:
Veuillez prendre note des commentaires de Mark ci-dessous qui mettent en évidence les failles de sécurité dans une version antérieure de cette réponse et recommandez d'utiliser
textarea
plutôt quediv
d'atténuer les vulnérabilités XSS potentielles. Ces vulnérabilités existent que vous utilisiez jQuery ou JavaScript simple.la source
encoded='<img src="bla" onerror="alert(1)">'
alors l'extrait ci-dessus affichera une alerte. Cela signifie que si votre texte encodé provient d'une entrée utilisateur, le décoder avec cet extrait peut présenter une vulnérabilité XSS.null
après avoir reçu le texte, l'alerte dans l'img n'est pas déclenchée - jsfiddle.net/Mottie/gaBeb/128alert(1)
se déclenche toujours pour moi sur Chrome sur OS X. Si vous voulez une variante sûre de ce hack, essayez d' utiliser untextarea
.Matthias Bynens a une bibliothèque pour cela: https://github.com/mathiasbynens/he
Exemple:
Je suggère de le préférer aux hacks impliquant de définir le contenu HTML d'un élément, puis de relire son contenu textuel. De telles approches peuvent fonctionner, mais sont trompeusement dangereuses et présentent des opportunités XSS si elles sont utilisées sur des entrées utilisateur non fiables.
Si vous ne pouvez vraiment pas supporter de charger dans une bibliothèque, vous pouvez utiliser le
textarea
hack décrit dans cette réponse à une question presque en double, qui, contrairement à diverses approches similaires qui ont été suggérées, n'a pas de failles de sécurité à ma connaissance:Mais prenez note des problèmes de sécurité, affectant des approches similaires à celle-ci, que j'énumère dans la réponse liée! Cette approche est un hack, et les modifications futures du contenu autorisé d'un
textarea
(ou des bogues dans les navigateurs en particulier) pourraient conduire à un code qui repose sur un soudain trou XSS un jour.la source
he
est absolument géniale! Merci beaucoup pour la recommandation!Ceci provient du code source ExtJS.
la source
htmlEnDecode.htmlDecode('€')
devrait revenir'€'
, mais revient à la place'€'
.element.innerText
fait aussi l'affaire.la source
Vous pouvez utiliser la fonction unescape / escape de Lodash https://lodash.com/docs/4.17.5#unescape
str deviendra
'fred, barney, & pebbles'
la source
Dans le cas où vous le recherchez, comme moi - en attendant, il existe une méthode JQuery agréable et sûre.
https://api.jquery.com/jquery.parsehtml/
Vous pouvez f.ex. tapez ceci dans votre console:
Donc $ .parseHTML (x) retourne un tableau, et si vous avez du balisage HTML dans votre texte, le tableau.length sera supérieur à 1.
la source
x
a une valeur de<script>alert('hello');</script>
ce qui précède plantera. Dans jQuery actuel, il n'essaiera pas d'exécuter le script, mais[0]
il donneraundefined
donc l'appel àtextContent
échouera et votre script s'arrêtera là.$('<div />').html(x).text();
semble plus sûr - via gist.github.com/jmblog/3222899jQuery va encoder et décoder pour vous. Cependant, vous devez utiliser une balise textarea, pas une div.
la source
.html()
. Ainsi, même l'utilisation d'untextarea
ne suffit pas pour assurer la sécurité ici; Je suggère de ne pas utiliser jQuery pour cette tâche et d'écrire du code équivalent avec l'API DOM ordinaire . (Oui, ce vieux comportement de jQuery est fou et horrible.)Créez d'abord un
<span id="decodeIt" style="display:none;"></span>
endroit dans le corpsEnsuite, affectez la chaîne à décoder comme innerHTML à ceci:
Finalement,
Voici le code global:
la source
stringtodecode
contient quelque chose comme<script>alert(1)</script>
.une solution javascript qui attrape les plus courantes:
c'est l'inverse de https://stackoverflow.com/a/4835406/2738039
la source
map[c] || ''
des outils non reconnus, ils ne seront pas affichés commeundefined
unescapeHtml(str){ var map = {amp: '&', lt: '<', le: '≤', gt: '>', ge: '≥', quot: '"', '#039': "'"} return str.replace(/&([^;]+);/g, (m, c) => map[c]|| '') }
Pour les gars d'une ligne:
la source
La question ne précise pas l'origine de
x
mais il est logique de se défendre, si nous le pouvons, contre les entrées malveillantes (ou tout simplement inattendues, de notre propre application). Par exemple, supposonsx
que la valeur est& <script>alert('hello');</script>
. Un moyen sûr et simple de gérer cela dans jQuery est:Trouvé via https://gist.github.com/jmblog/3222899 . Je ne vois pas beaucoup de raisons d'éviter d'utiliser cette solution étant donné qu'elle est au moins aussi courte, sinon plus courte que certaines alternatives et offre une défense contre XSS.
(J'ai initialement posté cela en tant que commentaire, mais je l'ajoute comme réponse, car un commentaire ultérieur dans le même fil m'a demandé de le faire).
la source
J'ai tout essayé pour supprimer et d'un tableau JSON. Aucun des exemples ci-dessus, mais https://stackoverflow.com/users/2030321/chris a donné une excellente solution qui m'a amené à résoudre mon problème.
Je ne l'ai pas utilisé, car je ne comprenais pas comment l'insérer dans une fenêtre modale qui tirait des données JSON dans un tableau, mais j'ai essayé cela en fonction de l'exemple, et cela a fonctionné:
Je l'aime parce que c'était simple et cela fonctionne, mais je ne sais pas pourquoi il n'est pas largement utilisé. Recherche hi & low pour trouver une solution simple. Je continue de chercher à comprendre la syntaxe et s'il y a un risque à l'utiliser. Je n'ai encore rien trouvé.
la source