Apparemment, c'est plus difficile à trouver que je ne le pensais. Et c'est même si simple ...
Existe-t-il une fonction équivalente aux htmlspecialchars de PHP intégrés en Javascript? Je sais qu'il est assez facile de l'implémenter vous-même, mais utiliser une fonction intégrée, si elle est disponible, est tout simplement plus agréable.
Pour ceux qui ne connaissent PHP, htmlspecialchars traduit des choses comme <htmltag/>
dans<htmltag/>
Je le sais escape()
et encodeURI()
ne fonctionne pas de cette façon.
javascript
html
escaping
html-encode
Bart van Heukelom
la source
la source
Réponses:
Il y a un problème avec votre code de solution - il n'échappera qu'à la première occurrence de chaque caractère spécial. Par exemple:
Voici le code qui fonctionne correctement:
Mettre à jour
Le code suivant produira des résultats identiques à ceux ci-dessus, mais il fonctionne mieux, en particulier sur de gros blocs de texte (merci jbo5112 ).
la source
C'est l'encodage HTML. Il n'y a pas de fonction javascript native pour faire cela, mais vous pouvez google et en obtenir des bien conçues.
Par exemple, http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/
EDIT:
C'est ce que j'ai testé:
Production:
<htmltag/>
la source
encodeURIComponent
fait et pas du tout ce que l'OP a demandé. Alors pouvez-vous modifier s'il vous plaît? Je n'arrive pas à annuler mon -1.div
élément et un nœud de texte. Créer un nœud de texte avec du texte `<img src = bogus onerror = alert (1337)>` créera simplement un nœud de texte, pas unimg
élément.Vaut le détour: http://bigdingus.com/2007/12/29/html-escaping-in-javascript/
Remarque : ne l'exécutez qu'une seule fois. Et ne l'exécutez pas sur des chaînes déjà encodées, par exemple
&
devient&amp;
la source
Avec jQuery, cela peut être comme ceci:
À partir d'une question connexe Échapper des chaînes HTML avec jQuery
Comme mentionné dans le commentaire, les guillemets doubles et simples sont laissés tels quels pour cette implémentation. Cela signifie que cette solution ne doit pas être utilisée si vous devez créer un attribut d'élément sous la forme d'une chaîne html brute.
la source
<!-- Caps rage begin -->
Cette réponse doit avoir un score NÉGATIF car elle ne se rapproche même pas de la réponse à la question «équivalent HtmlSpecialChars».<!-- Caps rage end -->
il-n'échappe pas aux-citations-jésus-christ-et-autres-divinités. OMG vous jquery les gens.Voici une fonction pour échapper au HTML:
Et pour décoder:
la source
Underscore.js fournit une fonction pour cela:
http://underscorejs.org/#escape
Ce n'est pas une fonction Javascript intégrée, mais si vous utilisez déjà Underscore, c'est une meilleure alternative que d'écrire votre propre fonction si vos chaînes à convertir ne sont pas trop volumineuses.
la source
Une autre solution consiste à renoncer complètement à la correspondance des caractères et à convertir à la place tous les caractères indésirables en leurs références de caractères numériques respectives, par exemple:
Notez que le RegEx spécifié ne gère que les caractères spécifiques que l'OP voulait échapper mais, selon le contexte dans lequel le HTML échappé va être utilisé, ces caractères peuvent ne pas être suffisants. L'article de Ryan Grove Il y a plus à échapper HTML que &, <,> et " est une bonne lecture sur le sujet. Et selon votre contexte, le RegEx suivant peut très bien être nécessaire pour éviter l'injection XSS:
la source
échantillon :
la source
Il y a de fortes chances que vous n'ayez pas besoin d'une telle fonction. Puisque votre code est déjà dans le navigateur *, vous pouvez accéder directement au DOM au lieu de générer et encoder du HTML qui devra être décodé à l'envers par le navigateur pour être réellement utilisé.
Utilisez la
innerText
propriété pour insérer du texte brut dans le DOM en toute sécurité et beaucoup plus rapidement que d'utiliser l'une des fonctions d'échappement présentées. Encore plus rapide que d'attribuer une chaîne préencodée statique àinnerHTML
.Utilisez
classList
pour éditer des classes,dataset
pour définir desdata-
attributs etsetAttribute
pour d'autres.Tous ces éléments géreront votre fuite. Plus précisément, aucun échappement n'est nécessaire et aucun encodage ne sera effectué sous **, puisque vous travaillez autour du HTML, la représentation textuelle de DOM.
* Cette réponse n'est pas destinée aux utilisateurs JavaScript côté serveur (Node.js, etc. )
** Sauf si vous le convertissez explicitement en HTML réel par la suite. Par exemple en accédant
innerHTML
- c'est ce qui se passe lorsque vous exécutez$('<div/>').text(value).html();
suggéré dans d'autres réponses. Donc, si votre objectif final est d'insérer des données dans le document, en procédant de cette façon, vous ferez le travail deux fois. Vous pouvez également voir que dans le HTML résultant, tout n'est pas encodé, seulement le minimum nécessaire pour qu'il soit valide. Cela est fait en fonction du contexte, c'est pourquoi cette méthode jQuery n'encode pas les guillemets et ne doit donc pas être utilisée comme un escaper à usage général. L'échappement des guillemets est nécessaire lorsque vous créez du HTML sous forme de chaîne avec des données non approuvées ou contenant des guillemets à la place de la valeur d'un attribut. Si vous utilisez l'API DOM, vous n'avez pas du tout à vous soucier de vous échapper.la source
el.textContent = str; el.innerHTML = el.innerHTML.replace(/\n/g, '<br>')
), ou définir lawhite-space
propriété CSS surpre
oupre-wrap
innerText
au lieu detextContent
. Bien qu'un peu plus lent et présente d' autres différences lors de la lecture de la propriété, il est plus intuitif en ce sens qu'il effectue le<br>
remplacement automatiquement lors de son affectation.Pour les utilisateurs de Node.JS (ou les utilisateurs utilisant le runtime Jade dans le navigateur), vous pouvez utiliser la fonction d'échappement de Jade.
Cela n'a aucun sens de l'écrire vous-même si quelqu'un d'autre le maintient. :)
la source
Je développe un peu la réponse d'okw.
Vous pouvez utiliser les fonctions DOM du navigateur pour cela.
Cela renvoie
<escapeThis>&
Il utilise la fonction standard
createElement
pour créer un élément invisible, puis utilise la fonctiontextContent
pour définir une chaîne comme son contenu, puisinnerHTML
pour obtenir le contenu dans sa représentation HTML.la source
la source
J'espère que cela gagnera la course en raison de ses performances et surtout pas d'une logique chaînée utilisant .replace ('&', '&'). Replace ('<', '<') ...
la source
Inversé un:
la source
<
et&gr;
dans une chaîne.To write a greater than sign in HTML type &gt;
il s'affichera incorrectement à la>
place de>
OWASP recommande que "[e] xscepté pour les caractères alphanumériques, [vous devriez] échapper tous les caractères avec des valeurs ASCII inférieures à 256 avec le
&#xHH;
format (ou une entité nommée si disponible) pour empêcher le changement de [un] attribut."Voici donc une fonction qui fait cela, avec un exemple d'utilisation:
la source
Cette solution utilise le code numérique des caractères, par exemple
<
est remplacé par<
.Bien que ses performances soient légèrement inférieures à celles de la solution utilisant une carte , elle présente les avantages:
la source