Existe-t-il un moyen simple de prendre une chaîne de code HTML en JavaScript et de supprimer le code HTML?
javascript
html
string
Bryan
la source
la source
strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
la source
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)"
si vous injectez viadocument.write
ou concaténez avec une chaîne qui contient un>
avant d'injecter viainnerHTML
.>
sera laissé dans le second. Ce n'est pas un risque d'injection cependant. Le danger se produit en raison de la<
gauche dans le premier, ce qui fait que l'analyseur HTML se trouve dans un contexte autre que l'état des données lorsque le second démarre. Notez qu'il n'y a pas de transition de l'état des données à>
.<button onClick="dostuff('>');"></button>
Supposons que le HTML est correctement écrit, vous devez toujours tenir compte du fait qu'un signe supérieur à peut être quelque part dans le texte cité dans un attribut. Vous voudrez également supprimer tout le texte à l'intérieur des<script>
balises, au moins.Manière la plus simple:
Cela récupère tout le texte d'une chaîne html.
la source
Je voudrais partager une version éditée de la réponse approuvée du Shog9 .
Comme Mike Samuel l'a souligné avec un commentaire, cette fonction peut exécuter des codes javascript en ligne.
Mais Shog9 raison de dire "laissez le navigateur le faire pour vous ..."
alors .. voici ma version éditée, en utilisant DOMParser :
ici le code pour tester le javascript inline:
En outre, il ne demande pas de ressources sur l'analyse (comme les images)
la source
En tant qu'extension de la méthode jQuery, si votre chaîne peut ne pas contenir de HTML (par exemple si vous essayez de supprimer du HTML d'un champ de formulaire)
retournera une chaîne vide s'il n'y a pas de HTML
Utilisation:
au lieu.
Mise à jour: Comme cela a été souligné dans les commentaires, dans certaines circonstances, cette solution exécutera le javascript contenu dans
html
si la valeur dehtml
pourrait être influencée par un attaquant, utilisez une solution différente.la source
$("<p>").html(html).text();
jQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
Conversion de HTML pour les e-mails en texte brut en conservant les hyperliens (a href) intacts
La fonction ci-dessus publiée par hypoxyde fonctionne bien, mais je recherchais quelque chose qui convertirait essentiellement du HTML créé dans un éditeur Web RichText (par exemple FCKEditor) et effacer tout le HTML mais laisser tous les liens car je voulais à la fois le HTML et la version en texte brut pour faciliter la création des parties correctes d'un e-mail STMP (HTML et texte brut).
Après une longue période de recherche sur Google, mes collègues et moi-même avons trouvé cela en utilisant le moteur regex en Javascript:
la
str
variable commence comme ceci:puis après l'exécution du code, il ressemble à ceci: -
Comme vous pouvez le voir, tout le HTML a été supprimé et le lien a été persévéré avec le texte hyperlié est toujours intact. J'ai également remplacé les balises
<p>
et<br>
par\n
(newline char) afin de conserver une sorte de formatage visuel.Pour modifier le format du lien (par exemple
BBC (Link->http://www.bbc.co.uk)
), il suffit de modifier le$2 (Link->$1)
, où$1
est l'URL / URI href et le$2
texte est un lien hypertexte. Avec les liens directement dans le corps du texte brut, la plupart des clients de messagerie SMTP les convertissent afin que l'utilisateur ait la possibilité de cliquer dessus.Espérant que ceci puisse t'être utile.
la source
Une amélioration de la réponse acceptée.
De cette façon, quelque chose comme ça ne fera aucun mal:
Firefox, Chromium et Explorer 9+ sont sûrs. Opera Presto est toujours vulnérable. De plus, les images mentionnées dans les chaînes ne sont pas téléchargées dans Chromium et Firefox pour enregistrer les requêtes http.
la source
<script><script>alert();
Cela devrait faire le travail sur n'importe quel environnement Javascript (NodeJS inclus).
la source
<html><style..>* {font-family:comic-sans;}</style>Some Text</html>
J'ai modifié la réponse de Jibberboy2000 pour inclure plusieurs
<BR />
formats de balises, tout supprimer à l'intérieur<SCRIPT>
et<STYLE>
balises, formater le HTML résultant en supprimant plusieurs sauts de ligne et espaces et convertir du code codé HTML en normal. Après quelques tests, il apparaît que vous pouvez convertir la plupart des pages Web complètes en texte simple où le titre et le contenu de la page sont conservés.Dans l'exemple simple,
devient
La fonction JavaScript et la page de test ressemblent à ceci:
Il a été utilisé avec ce HTML:
la source
/<p.*>/gi
devrait l'être/<p.*?>/gi
.<br>
les balises vous pouvez utiliser une bonne expression régulière à la place:/<br\s*\/?>/
cette façon , vous avez juste un remplacement au lieu de 3. En outre , il me semble que , sauf pour le décodage des entités que vous pouvez avoir un seul regex, quelque chose comme ceci:/<[a-z].*?\/?>/
.Il s'agit d'une version regex, plus résistante au HTML malformé, comme:
Balises non fermées
Some text <img
"<", ">" à l'intérieur des attributs de balise
Some text <img alt="x > y">
Newlines
Some <a href="http://google.com">
Le code
la source
Une autre solution, certes moins élégante que celle de nickf ou Shog9, serait de parcourir récursivement le DOM en commençant par la balise <body> et d'ajouter chaque nœud de texte.
la source
Si vous souhaitez conserver les liens et la structure du contenu (h1, h2, etc.), vous devez vérifier TextVersionJS.Vous pouvez l'utiliser avec n'importe quel code HTML, bien qu'il ait été créé pour convertir un e-mail HTML en texte brut.
L'utilisation est très simple. Par exemple dans node.js:
Ou dans le navigateur avec pure js:
Il fonctionne également avec require.js:
la source
Après avoir essayé toutes les réponses mentionnées, la plupart sinon toutes avaient des cas marginaux et ne pouvaient pas répondre complètement à mes besoins.
J'ai commencé à explorer comment php le fait et je suis tombé sur la lib php.js qui réplique la méthode strip_tags ici: http://phpjs.org/functions/strip_tags/
la source
allowed == ''
je pense que c'est ce que le PO a demandé, ce qui est presque ce que Byron a répondu ci-dessous (Byron a seulement eu[^>]
tort.)allowed
paramètre, vous êtes vulnérable à XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
retours<p onclick="alert(1)">mytext</p>
Tient compte des attributs internes et des
<img onerror="javascript">
éléments dom nouvellement créés.usage:
démo:
https://jsfiddle.net/gaby_de_wilde/pqayphzd/
démo de la meilleure réponse faisant les choses terribles:
https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/
la source
string with <a malicious="attribute \">this text should be removed, but is not">example</a>
).Beaucoup de gens ont déjà répondu à cette question, mais j'ai pensé qu'il pourrait être utile de partager la fonction que j'ai écrite qui supprime les balises HTML d'une chaîne mais vous permet d'inclure un tableau de balises que vous ne souhaitez pas supprimer. C'est assez court et ça fonctionne bien pour moi.
la source
Je pense que le moyen le plus simple est d'utiliser simplement les expressions régulières comme quelqu'un mentionné ci-dessus. Bien qu'il n'y ait aucune raison d'en utiliser un tas. Essayer:
la source
[^<>]
avec[^>]
car une balise valide ne peut pas inclure de<
caractère, alors la vulnérabilité XSS disparaît.J'ai apporté quelques modifications au script Jibberboy2000 original J'espère qu'il sera utile à quelqu'un
la source
Voici une version qui répond en quelque sorte au problème de sécurité de @ MikeSamuel:
Remarque, il retournera une chaîne vide si le balisage HTML n'est pas du XML valide (aka, les balises doivent être fermées et les attributs doivent être cités). Ce n'est pas idéal, mais cela évite d'avoir le potentiel d'exploiter la sécurité.
Si vous n'avez pas besoin d'un balisage XML valide, vous pouvez essayer d'utiliser:
mais ce n'est pas une solution parfaite non plus pour d'autres raisons.
la source
Vous pouvez supprimer les balises html en toute sécurité à l'aide de l' attribut sandbox iframe .
L'idée ici est qu'au lieu d'essayer de regexer notre chaîne, nous profitons de l'analyseur natif du navigateur en injectant le texte dans un élément DOM puis en interrogeant la propriété
textContent
/innerText
de cet élément.L'élément le mieux adapté pour injecter notre texte est un iframe en bac à sable, de cette façon nous pouvons empêcher toute exécution de code arbitraire (également connu sous le nom de XSS ).
L'inconvénient de cette approche est qu'elle ne fonctionne que dans les navigateurs.
Voici ce que j'ai trouvé (non testé au combat):
Utilisation ( démo ):
la source
let
etconst
. De plus, en utilisant votre solution, j'ai obtenu de nombreuses références deiframes
non utilisées dans le document. Pensez à ajouter undocument.body.removeChild(sandbox)
dans le code pour les futurs lecteurs basés sur les pâtes à copier.Avec jQuery, vous pouvez simplement le récupérer en utilisant
la source
Le code ci-dessous vous permet de conserver certaines balises html tout en supprimant toutes les autres
la source
phpjs
). Si vous utilisez leallowed
paramètre, vous êtes vulnérable à XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
retours<p onclick="alert(1)">mytext</p>
Il est également possible d'utiliser le fantastique analyseur HTML JS htmlparser2 pur. Voici une démo fonctionnelle:
La sortie sera
This is a simple example.
Voyez-le en action ici: https://tonicdev.com/jfahrenkrug/extract-text-from-html
Cela fonctionne à la fois sur le nœud et sur le navigateur si vous compressez votre application Web à l'aide d'un outil tel que webpack.
la source
J'avais juste besoin de retirer les
<a>
balises et de les remplacer par le texte du lien.Cela semble très bien fonctionner.
la source
title="..."
.Pour une solution plus simple, essayez ceci => https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
la source
J'ai moi-même créé une expression régulière de travail:
la source
simple jquery 2 lignes pour dépouiller le html.
la source
La réponse acceptée fonctionne très bien la plupart du temps, cependant dans IE si la
html
chaîne est,null
vous obtenez le"null"
(au lieu de ''). Fixé:la source
Utilisation de Jquery:
la source
input
l'élément ne prend en charge qu'un texte de ligne :Mise à jour: cela fonctionne comme prévu
la source
Définissez-le comme un plugin jquery et utilisez-le comme suit:
la source