Gibt es eine einfache Möglichkeit, eine HTML-Zeichenfolge in JavaScript zu verwenden und die HTML-Datei zu entfernen?
javascript
html
string
Bryan
quelle
quelle
strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
quelle
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)"
wenn Sie über injizierendocument.write
oder mit einer Zeichenfolge verketten, die ein enthält,>
bevor Sie über injiziereninnerHTML
.>
in der Sekunde verlassen wird. Das ist jedoch keine Injektionsgefahr. Die Gefahr tritt aufgrund von<
left in the first auf, wodurch sich der HTML-Parser beim Start des zweiten in einem anderen Kontext als dem Datenstatus befindet . Beachten Sie, dass es keinen Übergang vom Datenstatus gibt>
.<button onClick="dostuff('>');"></button>
korrekt geschriebenes HTML annimmt. Sie müssen dennoch berücksichtigen, dass sich möglicherweise ein Zeichen größer als irgendwo im zitierten Text eines Attributs befindet. Außerdem möchten Sie<script>
zumindest den gesamten Text in Tags entfernen .Einfachster Weg:
Dadurch wird der gesamte Text aus einer HTML-Zeichenfolge abgerufen.
quelle
Ich möchte eine bearbeitete Version der genehmigten Antwort des Shog9 teilen .
Wie Mike Samuel mit einem Kommentar betonte, kann diese Funktion Inline-Javascript-Codes ausführen.
Aber Shog9 hat Recht, wenn er sagt "Lass den Browser das für dich tun ..."
also .. hier meine bearbeitete Version mit DOMParser :
hier der Code zum Testen des Inline-Javascript:
Außerdem werden keine Ressourcen zum Analysieren angefordert (wie Bilder).
quelle
Als Erweiterung der jQuery-Methode, wenn Ihre Zeichenfolge möglicherweise kein HTML enthält (z. B. wenn Sie versuchen, HTML aus einem Formularfeld zu entfernen)
gibt eine leere Zeichenfolge zurück, wenn kein HTML vorhanden ist
Verwenden:
stattdessen.
Update: Wie in den Kommentaren erwähnt, führt diese Lösung unter bestimmten Umständen Javascript aus, das darin enthalten ist,
html
wenn der Wert vonhtml
von einem Angreifer beeinflusst werden könnte. Verwenden Sie eine andere Lösung.quelle
$("<p>").html(html).text();
jQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
Konvertieren von HTML für Nur-Text-E-Mails unter Beibehaltung von Hyperlinks (a href)
Die obige Funktion von Hypoxide funktioniert einwandfrei, aber ich war auf der Suche nach etwas, das im Grunde genommen HTML konvertiert, das in einem Web RichText-Editor (zum Beispiel FCKEditor) erstellt wurde, und alles HTML löscht, aber alle Links belässt, da ich sowohl HTML als auch HTML wollte Die Nur-Text-Version hilft beim Erstellen der richtigen Teile für eine STMP-E-Mail (sowohl HTML als auch Nur-Text).
Nach langer Suche in Google haben ich und meine Kollegen dies mithilfe der Regex-Engine in Javascript gefunden:
Die
str
Variable beginnt folgendermaßen:und nachdem der Code ausgeführt wurde, sieht er folgendermaßen aus:
Wie Sie sehen können, wurde der gesamte HTML-Code entfernt und der Link wurde beibehalten. Der verlinkte Text ist noch intakt. Außerdem habe ich die Tags
<p>
und<br>
durch\n
(newline char) ersetzt, damit eine visuelle Formatierung beibehalten wird.Um das Linkformat (z. B.
BBC (Link->http://www.bbc.co.uk)
) zu ändern, bearbeiten Sie einfach das$2 (Link->$1)
, wo$1
sich die href URL / URI und das$2
der verlinkte Text befindet. Mit den Links direkt im Haupttext konvertieren die meisten SMTP-Mail-Clients diese, sodass der Benutzer auf sie klicken kann.Ich hoffe, Sie finden das nützlich.
quelle
Eine Verbesserung der akzeptierten Antwort.
Auf diese Weise schadet etwas, das so läuft:
Firefox, Chromium und Explorer 9+ sind sicher. Opera Presto ist immer noch anfällig. Auch in den Zeichenfolgen erwähnte Bilder werden in Chromium- und Firefox-Speichern von http-Anforderungen nicht heruntergeladen.
quelle
<script><script>alert();
Dies sollte die Arbeit in jeder Javascript-Umgebung erledigen (einschließlich NodeJS).
quelle
<html><style..>* {font-family:comic-sans;}</style>Some Text</html>
Ich habe die Antwort von Jibberboy2000 dahingehend geändert , dass sie mehrere
<BR />
Tag-Formate enthält, alles darin<SCRIPT>
und<STYLE>
Tags entfernt, den resultierenden HTML-Code durch Entfernen mehrerer Zeilenumbrüche und Leerzeichen formatiert und HTML-codierten Code in normalen Code konvertiert. Nach einigen Tests scheint es, dass Sie die meisten vollständigen Webseiten in einfachen Text konvertieren können, wobei Seitentitel und Inhalt beibehalten werden.Im einfachen Beispiel
wird
Die JavaScript-Funktion und die Testseite sehen folgendermaßen aus:
Es wurde mit diesem HTML verwendet:
quelle
/<p.*>/gi
sollte sein/<p.*?>/gi
.<br>
Tags stattdessen einen guten regulären Ausdruck verwenden können: Auf/<br\s*\/?>/
diese Weise haben Sie nur einen Ersatz anstelle von 3. Außerdem scheint es mir, dass Sie außer der Dekodierung von Entitäten einen einzelnen regulären Ausdruck haben können, etwa so :/<[a-z].*?\/?>/
.Dies ist eine Regex-Version, die gegenüber fehlerhaftem HTML widerstandsfähiger ist, wie z.
Nicht geschlossene Tags
Some text <img
"<", ">" innerhalb von Tag-Attributen
Some text <img alt="x > y">
Zeilenumbrüche
Some <a href="http://google.com">
Der Code
quelle
Eine andere, zugegebenermaßen weniger elegante Lösung als die von Nickf oder Shog9 wäre, das DOM rekursiv beginnend mit dem <body> -Tag zu durchlaufen und jeden Textknoten anzuhängen.
quelle
Wenn Sie die Links und die Struktur des Inhalts (h1, h2 usw.) beibehalten möchten , sollten Sie TextVersionJS ausprobieren. Sie können es mit jedem HTML- Code verwenden, obwohl es erstellt wurde, um eine HTML-E-Mail in einfachen Text zu konvertieren.
Die Bedienung ist sehr einfach. Zum Beispiel in node.js:
Oder im Browser mit reinem js:
Es funktioniert auch mit require.js:
quelle
Nachdem ich alle Antworten ausprobiert hatte, hatten die meisten, wenn nicht alle Randfälle und konnten meine Bedürfnisse nicht vollständig erfüllen.
Ich begann zu untersuchen, wie PHP es macht und stieß auf die lib von php.js, die die strip_tags-Methode hier repliziert: http://phpjs.org/functions/strip_tags/
quelle
allowed == ''
was ich denke, das ist, was das OP verlangt hat, was fast das ist, was Byron unten geantwortet hat (Byron hat nur das[^>]
Falsche verstanden.)allowed
Parameter verwenden, sind Sie anfällig für XSS: gibtstripTags('<p onclick="alert(1)">mytext</p>', '<p>')
zurück<p onclick="alert(1)">mytext</p>
Berücksichtigt> innerhalb von Attributen und
<img onerror="javascript">
in neu erstellten dom-Elementen.Verwendungszweck:
Demo:
https://jsfiddle.net/gaby_de_wilde/pqayphzd/
Demo der Top-Antwort für die schrecklichen Dinge:
https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/
quelle
string with <a malicious="attribute \">this text should be removed, but is not">example</a>
. B. ).Viele Leute haben dies bereits beantwortet, aber ich dachte, es könnte nützlich sein, die von mir geschriebene Funktion zu teilen, mit der HTML-Tags aus einer Zeichenfolge entfernt werden, aber Sie können ein Array von Tags einfügen, die nicht entfernt werden sollen. Es ist ziemlich kurz und hat gut für mich funktioniert.
quelle
Ich denke, der einfachste Weg ist, reguläre Ausdrücke wie oben erwähnt zu verwenden. Obwohl es keinen Grund gibt, ein paar davon zu verwenden. Versuchen:
quelle
[^<>]
mit ändern,[^>]
da ein gültiges Tag kein<
Zeichen enthalten kann. Dann verschwindet die XSS-Sicherheitsanfälligkeit.Ich habe einige Änderungen am ursprünglichen Jibberboy2000-Skript vorgenommen. Ich hoffe, es ist für jemanden nützlich
quelle
Hier ist eine Version, die sich mit den Sicherheitsbedenken von @ MikeSamuel befasst:
Beachten Sie, dass eine leere Zeichenfolge zurückgegeben wird, wenn das HTML-Markup kein gültiges XML ist (auch bekannt als Tags müssen geschlossen und Attribute in Anführungszeichen gesetzt werden). Dies ist nicht ideal, vermeidet jedoch das Problem, dass die Sicherheit ausgenutzt werden kann.
Wenn Sie kein gültiges XML-Markup benötigen, können Sie Folgendes verwenden:
Aber das ist auch aus anderen Gründen keine perfekte Lösung.
quelle
Sie können HTML-Tags mithilfe des iframe-Sandbox-Attributs sicher entfernen .
Die Idee hier ist, dass wir, anstatt zu versuchen, unsere Zeichenfolge neu zu formulieren, den nativen Parser des Browsers nutzen, indem wir den Text in ein DOM-Element einfügen und dann die
textContent
/ -Eigenschaft dieses Elements abfrageninnerText
.Das am besten geeignete Element zum Einfügen unseres Textes ist ein Sandbox-Iframe. Auf diese Weise können wir jede Ausführung von willkürlichem Code verhindern (auch als XSS bezeichnet ).
Der Nachteil dieses Ansatzes ist, dass er nur in Browsern funktioniert.
Folgendes habe ich mir ausgedacht (nicht kampferprobt):
Verwendung ( Demo ):
quelle
let
und ordnungsgemäß auf den Block festgelegt sindconst
. Außerdem habe ich mit Ihrer Lösung viele Referenzen erhalten, dieiframes
nicht im Dokument verwendet wurden. Erwägen Sie das Hinzufügen einesdocument.body.removeChild(sandbox)
Codes im Code für zukünftige Leser, die auf Copy-Pasta basieren.Mit jQuery können Sie es einfach mit abrufen
quelle
Mit dem folgenden Code können Sie einige HTML-Tags beibehalten, während Sie alle anderen entfernen
quelle
phpjs
) zitieren . Wenn Sie denallowed
Parameter verwenden, sind Sie anfällig für XSS: gibtstripTags('<p onclick="alert(1)">mytext</p>', '<p>')
zurück<p onclick="alert(1)">mytext</p>
Es ist auch möglich, den fantastischen reinen JS-HTML-Parser htmlparser2 zu verwenden . Hier ist eine funktionierende Demo:
Die Ausgabe wird sein
This is a simple example.
Sehen Sie es hier in Aktion: https://tonicdev.com/jfahrenkrug/extract-text-from-html
Dies funktioniert sowohl im Knoten als auch im Browser, wenn Sie Ihre Webanwendung mit einem Tool wie Webpack packen.
quelle
Ich musste nur die
<a>
Tags entfernen und sie durch den Text des Links ersetzen.Das scheint großartig zu funktionieren.
quelle
title="..."
.Versuchen Sie dies zur einfacheren Lösung => https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
quelle
Ich habe selbst einen funktionierenden regulären Ausdruck erstellt:
quelle
einfache 2-zeilige Abfrage zum Entfernen des HTML-Codes.
quelle
Die akzeptierte Antwort funktioniert meistens einwandfrei, jedoch im IE, wenn die
html
Zeichenfolge lautet, erhaltennull
Sie die"null"
(anstelle von ''). Fest:quelle
Verwenden von Jquery:
quelle
input
Element unterstützt nur einen Zeilentext :Update: Dies funktioniert wie erwartet
quelle
Definieren Sie dies als jquery-Plugin und verwenden Sie es wie folgt:
quelle