Comment utiliser jQuery pour décoder des entités HTML dans une chaîne?
javascript
jquery
html
EddyR
la source
la source
Réponses:
En fait, essayez
la source
$("<div/>").html('<img src="http://www.google.com/images/logos/ps_logo2.png" onload=alert(1337)>')
. Dans Firefox ou Safari, il déclenche l'alerte.str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/g, "")
ou quelque chose de similaire.Sans jQuery:
Cela fonctionne de manière similaire à la réponse acceptée , mais est sûr à utiliser avec des entrées utilisateur non fiables.
Problèmes de sécurité dans des approches similaires
Comme l'a noté Mike Samuel , faire cela avec une entrée utilisateur
<div>
au lieu d'une<textarea>
entrée non approuvée est une vulnérabilité XSS, même si la<div>
n'est jamais ajoutée au DOM:Cependant, cette attaque n'est pas possible contre a
<textarea>
car aucun élément HTML n'est autorisé à contenir un<textarea>
. Par conséquent, toutes les balises HTML encore présentes dans la chaîne «encodée» seront automatiquement encodées par le navigateur.* Merci à Eru Penkman d' avoir rattrapé cette vulnérabilité.
la source
decodedString = textArea.value;
textArea.remove();
return decodedString;
if ('remove' in Element.prototype) textArea.remove();
$("<div />").html(string).text()
exécutera tout javascript dans la chaîne fournie , ce qui, à mon avis, est à l'origine de votre problème. La réponse acceptée doit être mise à jour pour celle-ci.Comme Mike Samuel l'a dit, n'utilisez pas jQuery.html (). Text () pour décoder des entités html car cela n'est pas sûr.
Utilisez plutôt un rendu de modèle comme Mustache.js ou decodeEntities du commentaire de @ VyvIT.
La bibliothèque de ceinture utilitaire Underscore.js est livrée avec les méthodes
escape
etunescape
, mais elles ne sont pas sûres pour l'entrée utilisateur:_.escape (chaîne)
_.unescape (chaîne)
la source
unescape
dans les documents maintenant, btw._.unescape("'")
résulte en "& # 39;" au lieu d'un guillemet simple. Y a-t-il quelque chose qui me manque ou qui ne souligne pas ne s'échappe pas aux codes d'entité HTML comme indiqué sur: w3schools.com/tags/ref_entities.aspescape
et lesunescape
méthodes ... ne sont pas sécuritaires pour la saisie utilisateur" . Que veux-tu dire par là? Cela me semble absurde, mais peut-être que je manque quelque chose - pouvez-vous clarifier?_.unescape("<img src=fake onerror=alert('boo!')>")
(dans Chrome / FF / IE). Mais il n'a montré aucune alerte. Je l'ai essayé dans la console ainsi que dans mon fichier JS. Même résultat.Je pense que vous confondez le texte et les méthodes HTML. Regardez cet exemple, si vous utilisez le HTML interne d'un élément comme texte, vous obtiendrez des balises HTML décodées (deuxième bouton). Mais si vous les utilisez comme HTML, vous obtiendrez la vue au format HTML (premier bouton).
Premier bouton écrit: voici un contenu HTML .
Le deuxième bouton écrit: voici un contenu <B> HTML </B>.
À propos, vous pouvez voir un plug-in que j'ai trouvé dans le plug-in jQuery - décodage HTML et encodage qui encode et décode les chaînes HTML.
la source
La question est limitée par 'avec jQuery' mais cela pourrait aider certains à savoir que le code jQuery donné dans la meilleure réponse ici fait ce qui suit en dessous ... cela fonctionne avec ou sans jQuery:
la source
Vous pouvez utiliser la bibliothèque he , disponible sur https://github.com/mathiasbynens/he
Exemple:
J'ai défié l'auteur de la bibliothèque sur la question de savoir s'il y avait une raison d'utiliser cette bibliothèque dans le code côté client en faveur du
<textarea>
hack fourni dans d' autres réponses ici et ailleurs. Il a fourni quelques justifications possibles:Si vous utilisez node.js côté serveur, l'utilisation d'une bibliothèque pour l'encodage / décodage HTML vous offre une solution unique qui fonctionne à la fois côté client et côté serveur.
Certains algorithmes de décodage d'entités de certains navigateurs comportent des bogues ou ne prennent pas en charge certaines références de caractères nommées . Par exemple, Internet Explorer décode et restitue
correctement les espaces insécables ( ) mais les signale comme des espaces ordinaires au lieu d'espaces insécables via lainnerText
propriété d' un élément DOM , brisant le<textarea>
hack (bien que de manière mineure). De plus, IE 8 et 9 ne prennent tout simplement en charge aucune des nouvelles références de caractères nommées ajoutées dans HTML 5. L'auteur de ce dernier héberge également un test de prise en charge des références de caractères nommées sur http://mathias.html5.org/tests/html / références-de-caractères-nommés / . Dans IE 8, il signale plus de mille erreurs.Si vous voulez être isolé des bogues du navigateur liés au décodage d'entité et / ou être capable de gérer la gamme complète des références de caractères nommées, vous ne pouvez pas vous en tirer avec le
<textarea>
hack; vous aurez besoin d'une bibliothèque comme lui .Il a vraiment bien l'impression que faire les choses de cette façon est moins hacky.
la source
encoder:
décoder:
la source
Utilisation
Il est plus facile de le faire côté serveur car, apparemment, JavaScript n'a pas de bibliothèque native pour gérer les entités, et je n'en ai trouvé aucune en haut des résultats de recherche pour les différents cadres qui étendent JavaScript.
Recherchez "Entités HTML JavaScript", et vous trouverez peut-être quelques bibliothèques à cet effet, mais elles seront probablement toutes construites autour de la logique ci-dessus - remplacer, entité par entité.
la source
Je devais juste avoir un caractère d'entité HTML (⇓) comme valeur pour un bouton HTML. Le code HTML semble bon depuis le début dans le navigateur:
Maintenant, j'ajoutais une bascule qui devrait également afficher le caractère. C'est ma solution
Cela affiche à nouveau ⇓ dans le bouton. J'espère que cela pourrait aider quelqu'un.
la source
"Embed & Share \u21d1"
), ou mieux encore"Embed & Share ⇑"
si vous êtes en mesure de servir votre script en UTF-8 (ou UTF-16, ou tout autre encodage prenant en charge le caractère ⇑). Utiliser un élément DOM pour analyser une entité HTML juste pour créer un caractère unicode arbitraire dans une chaîne JavaScript est une approche astucieuse et créative qui rendrait Rube Goldberg fier, mais ce n'est pas une bonne pratique; les échappements unicode sont dans le langage spécifiquement pour gérer ce cas d'utilisation.Vous devez créer une fonction personnalisée pour les entités html:
la source
Supposons que vous ayez sous String.
Nos cabines de luxe sont chaleureuses, confortables & amp; confortable
str et attribuer à nouveau
marque.
c'est tout.
la source
Pour les utilisateurs ExtJS, si vous avez déjà la chaîne codée, par exemple lorsque la valeur retournée d'une fonction de bibliothèque est le contenu innerHTML, considérez cette fonction ExtJS:
la source
Étendez une classe String:
et utiliser comme méthode:
la source
Essaye ça :
parseHTML est une fonction dans la bibliothèque Jquery et elle renverra un tableau qui inclut quelques détails sur la chaîne donnée.
dans certains cas, la chaîne est grande, de sorte que la fonction séparera le contenu de nombreux index.
et pour obtenir toutes les données d'index, vous devez aller dans n'importe quel index, puis accéder à l'index appelé "wholeText".
J'ai choisi l'index 0 car il fonctionnera dans tous les cas (petite chaîne ou grande chaîne).
la source
Voici encore un problème: la chaîne échappée ne semble pas lisible lorsqu'elle est affectée à la valeur d'entrée
Exapmle: https://jsfiddle.net/kjpdwmqa/3/
la source
escape
méthode Underscore.js. Il n'y a également aucune explication sur la façon dont votre exemple de code devrait résoudre le problème d'OP.Alternativement, il existe également une bibliothèque pour cela.
ici, https://cdnjs.com/libraries/he
L'utilisation est la suivante ...
à votre santé.
la source
Pour décoder des entités HTML avec jQuery, utilisez simplement cette fonction:
Comment utiliser:
Javascript:
HTML:
la source
Le moyen le plus simple consiste à définir un sélecteur de classe sur vos éléments et à utiliser le code suivant:
Rien de plus nécessaire!
J'ai eu ce problème et j'ai trouvé cette solution claire et cela fonctionne bien.
la source
Je pense que c'est exactement le contraire de la solution choisie.
la source