Ich habe einen Javascript-Code, der mit einem XML-RPC-Backend kommuniziert. Der XML-RPC gibt Zeichenfolgen der folgenden Form zurück:
<img src='myimage.jpg'>
Wenn ich jedoch das Javascript verwende, um die Zeichenfolgen in HTML einzufügen, werden sie buchstäblich gerendert. Ich sehe kein Bild, ich sehe buchstäblich die Zeichenfolge:
<img src='myimage.jpg'>
Ich vermute, dass der HTML-Code über den XML-RPC-Kanal maskiert wird.
Wie kann ich die Zeichenfolge in Javascript entfernen? Ich habe die Techniken auf dieser Seite erfolglos ausprobiert: http://paulschreiber.com/blog/2008/09/20/javascript-how-to-unescape-html-entities/
Was sind andere Möglichkeiten, um das Problem zu diagnostizieren?
javascript
html
escaping
xml-rpc
Joseph Turian
quelle
quelle
Antworten:
BEARBEITEN: Sie sollten die DOMParser-API verwenden, wie Wladimir vorschlägt . Ich habe meine vorherige Antwort bearbeitet, da die veröffentlichte Funktion eine Sicherheitslücke eingeführt hat.
Das folgende Snippet ist der Code der alten Antwort mit einer kleinen Änderung: Die Verwendung von a
textarea
anstelle von adiv
verringert die XSS-Sicherheitsanfälligkeit, ist jedoch in IE9 und Firefox immer noch problematisch.Grundsätzlich erstelle ich programmgesteuert ein DOM-Element, ordne den codierten HTML-Code seinem innerHTML zu und rufe den nodeValue von dem Textknoten ab, der beim Einfügen von innerHTML erstellt wurde. Da nur ein Element erstellt, aber nie hinzugefügt wird, wird kein Site-HTML geändert.
Es funktioniert browserübergreifend (einschließlich älterer Browser) und akzeptiert alle HTML-Zeichenentitäten .
BEARBEITEN: Die alte Version dieses Codes funktionierte nicht im IE mit leeren Eingaben, wie hier auf jsFiddle (Ansicht im IE) gezeigt. Die obige Version funktioniert mit allen Eingaben.
UPDATE: Dies funktioniert anscheinend nicht mit großen Zeichenfolgen und führt auch zu einer Sicherheitslücke , siehe Kommentare.
quelle
'
gehört nicht zu den HTML 4 Entities, deshalb! w3.org/TR/html4/sgml/entities.html fishbowl.pastiche.org/2003/07/01/the_curse_of_aposDie meisten hier gegebenen Antworten haben einen großen Nachteil: Wenn die Zeichenfolge, die Sie konvertieren möchten, nicht vertrauenswürdig ist, besteht eine XSS-Sicherheitsanfälligkeit (Cross-Site Scripting) . Beachten Sie für die Funktion in der akzeptierten Antwort Folgendes:
Die Zeichenfolge hier enthält ein nicht entkoppeltes HTML-Tag. Anstatt etwas zu dekodieren, führt die
htmlDecode
Funktion tatsächlich den in der Zeichenfolge angegebenen JavaScript-Code aus.Dies kann durch die Verwendung von DOMParser vermieden werden, der in allen modernen Browsern unterstützt wird :
Diese Funktion führt garantiert keinen JavaScript-Code als Nebeneffekt aus. Alle HTML-Tags werden ignoriert, nur Textinhalte werden zurückgegeben.
Kompatibilitätshinweis : Für das Parsen von HTML
DOMParser
sind mindestens Chrome 30, Firefox 12, Opera 17, Internet Explorer 10, Safari 7.1 oder Microsoft Edge erforderlich. Alle Browser ohne Unterstützung sind also weit über ihre EOL hinaus und ab 2017 sind die einzigen, die gelegentlich noch in freier Wildbahn zu sehen sind, ältere Internet Explorer- und Safari-Versionen (normalerweise sind diese noch nicht zahlreich genug, um sich darum zu kümmern).quelle
DOMParser
nicht unterstützt"text/html"
wurde und es immer noch einige neueste Versionen von Browsern gibt, die dies nicht einmal unterstützenDOMParser.prototype.parseFromString()
. Ihrer Referenz zufolgeDOMParser
handelt es sich immer noch um eine experimentelle Technologie, und die Stellvertreter verwenden dieinnerHTML
Eigenschaft, die, wie Sie auch als Reaktion auf meinen Ansatz hervorgehoben haben , diese XSS-Sicherheitsanfälligkeit aufweist (die von Browser-Anbietern behoben werden sollte).<script>
Tags, die nicht ausgeführt werden, sind kein Sicherheitsmechanismus. Diese Regel vermeidet lediglich die schwierigen Timing-Probleme, wenn durch die EinstellunginnerHTML
synchrone Skripts als Nebeneffekt ausgeführt werden könnten. Das Bereinigen von HTML-Code ist eine schwierige Angelegenheit undinnerHTML
versucht es nicht einmal - bereits, weil die Webseite möglicherweise tatsächlich beabsichtigt, Inline-Ereignishandler festzulegen. Dies ist einfach kein Mechanismus für unsichere Daten, Punkt.Wenn Sie jQuery verwenden:
Verwenden Sie andernfalls das Encoder-Objekt von Strictly Software , das eine hervorragende
htmlDecode()
Funktion hat.quelle
Der Trick besteht darin, die Leistung des Browsers zum Dekodieren der speziellen HTML-Zeichen zu verwenden, dem Browser jedoch nicht zu erlauben, die Ergebnisse so auszuführen, als wäre es tatsächlich HTML ... Diese Funktion verwendet einen regulären Ausdruck, um codierte HTML-Zeichen, ein Zeichen, zu identifizieren und zu ersetzen zu einer Zeit.
quelle
/\&#?[0-9a-z]+;/gi
da # nur als 2. Zeichen angezeigt werden sollte, wenn überhaupt.Die Antwort von CMS funktioniert einwandfrei, es sei denn, der HTML-Code, den Sie entfernen möchten, ist sehr lang und länger als 65536 Zeichen. Denn dann wird in Chrome der innere HTML-Code in viele untergeordnete Knoten aufgeteilt, von denen jeder höchstens 65536 lang ist, und Sie müssen sie verketten. Diese Funktion funktioniert auch für sehr lange Zeichenfolgen:
innerHTML
Weitere Informationen finden Sie in dieser Antwort zur maximalen Länge: https://stackoverflow.com/a/27545633/694469quelle
Keine direkte Antwort auf Ihre Frage, aber wäre es nicht besser für Ihren RPC, eine Struktur (sei es XML oder JSON oder was auch immer) mit diesen Bilddaten (URLs in Ihrem Beispiel) innerhalb dieser Struktur zurückzugeben?
Dann könnten Sie es einfach in Ihrem Javascript analysieren und das
<img>
mit Javascript selbst erstellen .Die Struktur, die Sie von RPC erhalten, könnte folgendermaßen aussehen:
Ich denke, es ist besser so, da das Einfügen eines Codes, der von einer externen Quelle stammt, in Ihre Seite nicht sehr sicher aussieht. Stellen Sie sich vor, jemand entführt Ihr XML-RPC-Skript und fügt etwas ein, das Sie nicht möchten (sogar etwas Javascript ...).
quelle
htmlDecode("<img src='myimage.jpg'><script>alert('xxxxx');</script>")
und nichts ist passiert. Ich habe den dekodierten HTML-String wie erwartet zurückbekommen.Chris Antwort ist schön und elegant aber es funktioniert nicht , wenn der Wert ist nicht definiert . Nur eine einfache Verbesserung macht es solide:
quelle
return (typeof value !== 'string') ? '' : $('<div/>').html(value).text();
Gern geschehen ... nur ein Messenger ... das volle Guthaben geht an ourcodeworld.com, Link unten.
Vollständige Gutschrift: https://ourcodeworld.com/articles/read/188/encode-and-decode-html-entities-using-pure-javascript
quelle
Dies ist die umfassendste Lösung, die ich bisher ausprobiert habe:
quelle
Ich war verrückt genug, diese Funktion zu durchlaufen, die hübsch, wenn nicht vollständig, erschöpfend sein sollte:
So verwendet:
Drucke:
Ich Heiße David
PS: Das hat ungefähr anderthalb Stunden gedauert.
quelle
Um HTML-Entitäten * in JavaScript zu entfernen, können Sie die kleine Bibliothek html-escaper verwenden :
npm install html-escaper
Oder
unescape
funktionieren Sie mit Lodash oder Underscore , wenn Sie es verwenden.*) Bitte beachten Sie, dass diese Funktionen decken nicht alle HTML - Entitäten, sondern nur die häufigsten, das heißt
&
,<
,>
,'
,"
. Um unescape alle HTML - Entities können Sie verwenden , er - Bibliothek.quelle
Ich verwende dies in meinem Projekt: Inspiriert von anderen Antworten, aber mit einem besonders sicheren Parameter, kann es nützlich sein, wenn Sie sich mit dekorierten Zeichen befassen
Und es ist verwendbar wie:
quelle
Alle anderen Antworten hier haben Probleme.
Die document.createElement ('div') -Methoden (einschließlich der Methoden, die jQuery verwenden) führen jedes übergebene Javascript aus (ein Sicherheitsproblem), und die DOMParser.parseFromString () -Methode schneidet Leerzeichen ab. Hier ist eine reine Javascript-Lösung, die kein Problem hat:
TextArea wird speziell verwendet, um die Ausführung von js-Code zu vermeiden. Es besteht diese:
quelle
htmlDecode("</textarea><img src=x onerror=alert(1)>")
. Sie haben dies gepostet, nachdem ich bereits auf dieses Problem in der Antwort von Sergio Belevskij hingewiesen habe.quelle
Es gibt eine Variante, die zu 80% so produktiv ist wie die Antworten ganz oben.
Siehe den Benchmark: https://jsperf.com/decode-html12345678/1
Wenn Sie Tags hinterlassen müssen, entfernen Sie die beiden
.replace(...)
Aufrufe (Sie können den ersten verlassen, wenn Sie keine Skripte benötigen).quelle
decodeEntities("</textarea '><img src=x onerror=alert(1) \">")
Firefox an. Bitte hören Sie auf, zu versuchen, HTML-Code mit regulären Ausdrücken zu bereinigen.