Wie verwende ich jQuery, um HTML-Entitäten in einer Zeichenfolge zu dekodieren?
javascript
jquery
html
EddyR
quelle
quelle
Antworten:
Versuchen Sie es tatsächlich
quelle
$("<div/>").html('<img src="http://www.google.com/images/logos/ps_logo2.png" onload=alert(1337)>')
. In Firefox oder Safari wird die Warnung ausgelöst.str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/g, "")
oder etwas ähnliches.Ohne jQuery:
Dies funktioniert ähnlich wie die akzeptierte Antwort , kann jedoch sicher mit nicht vertrauenswürdigen Benutzereingaben verwendet werden.
Sicherheitsprobleme bei ähnlichen Ansätzen
Wie von Mike Samuel bemerkt , ist dies eine XSS-Sicherheitsanfälligkeit, wenn dies nicht mit einer nicht vertrauenswürdigen Benutzereingabe,
<div>
sondern mit einer<textarea>
nicht vertrauenswürdigen Benutzereingabe erfolgt, selbst wenn die<div>
niemals zum DOM hinzugefügt wird:Dieser Angriff ist jedoch gegen a nicht möglich,
<textarea>
da keine HTML-Elemente vorhanden sind, deren Inhalt zulässig ist<textarea>
. Folglich werden alle HTML-Tags, die noch in der 'codierten' Zeichenfolge vorhanden sind, vom Browser automatisch entitätscodiert.* Vielen Dank an Eru Penkman , der diese Sicherheitsanfälligkeit entdeckt hat.
quelle
decodedString = textArea.value;
textArea.remove();
return decodedString;
if ('remove' in Element.prototype) textArea.remove();
$("<div />").html(string).text()
führt jedes Javascript in der angegebenen Zeichenfolge aus , was vermutlich Ihr Problem verursacht hat. Die akzeptierte Antwort sollte auf diese aktualisiert werden.Wie Mike Samuel sagte, verwenden Sie jQuery.html (). Text () nicht, um HTML-Entitäten zu dekodieren, da dies unsicher ist.
Verwenden Sie stattdessen einen Vorlagenrenderer wie Moustache.js oder decodeEntities aus dem Kommentar von @ VyvIT.
Die Underscore.js Utility-Belt-Bibliothek enthält
escape
undunescape
Methoden, die jedoch für Benutzereingaben nicht sicher sind:_.escape (Zeichenfolge)
_.unescape (Zeichenfolge)
quelle
unescape
sind übrigens inzwischen in den Dokumenten enthalten._.unescape("'")
ergibt nur "& # 39;" anstelle eines einfachen Anführungszeichens. Fehltescape
undunescape
Methoden ... für Benutzereingaben nicht sicher sind" . Was meinst du damit? Es klingt für mich nach Unsinn, aber vielleicht fehlt mir etwas - können Sie das klarstellen?_.unescape("<img src=fake onerror=alert('boo!')>")
(in Chrome / FF / IE). Aber es zeigte sich keine Warnung. Versuchte es in der Konsole und legte es auch in meine JS-Datei. Gleiches Ergebnis.Ich denke, Sie verwechseln die Text- und HTML-Methoden. In diesem Beispiel erhalten Sie dekodierte HTML-Tags (zweite Schaltfläche), wenn Sie den inneren HTML-Code eines Elements als Text verwenden. Wenn Sie sie jedoch als HTML verwenden, erhalten Sie die HTML-formatierte Ansicht (erste Schaltfläche).
Erste Schaltfläche schreibt: Hier ist ein HTML- Inhalt.
Zweite Schaltfläche schreibt: Hier ist ein <B> HTML </ B> -Inhalt.
Übrigens können Sie ein Plug-In sehen, das ich im jQuery-Plugin gefunden habe - HTML-Dekodierung und -Codierung , die HTML-Zeichenfolgen codiert und decodiert.
quelle
Die Frage ist durch 'mit jQuery' begrenzt, aber es kann einigen helfen zu wissen, dass der in der besten Antwort hier angegebene jQuery-Code Folgendes bewirkt ... dies funktioniert mit oder ohne jQuery:
quelle
Sie können die Verwendung er Bibliothek von https://github.com/mathiasbynens/he
Beispiel:
Ich habe den Autor der Bibliothek in der Frage herausgefordert, ob es einen Grund gibt, diese Bibliothek im clientseitigen Code zu verwenden, und zwar zugunsten des
<textarea>
Hacks, der in anderen Antworten hier und anderswo angegeben ist. Er lieferte einige mögliche Begründungen:Wenn Sie die serverseitige Datei node.js verwenden, erhalten Sie durch die Verwendung einer Bibliothek für die HTML-Codierung / -Decodierung eine einzige Lösung, die sowohl clientseitig als auch serverseitig funktioniert.
Die Entitätsdecodierungsalgorithmen einiger Browser weisen Fehler auf oder es fehlt die Unterstützung für einige benannte Zeichenreferenzen . Beispielsweise dekodiert und rendert Internet Explorer nicht unterbrechende Leerzeichen (
) korrekt, meldet sie jedoch als normale Leerzeichen anstelle von nicht unterbrechenden Leerzeichen über dieinnerText
Eigenschaft eines DOM-Elements und unterbricht den<textarea>
Hack (wenn auch nur in geringem Umfang). Zusätzlich IE 8 und 9 einfach nicht unterstützen , eine der neuen benannten Zeichenreferenzen hinzugefügt in HTML 5. Der Autor er auch einen Test der benannten Zeichenreferenz Unterstützung findet bei http://mathias.html5.org/tests/html / Named-Character-Referenzen / . In IE 8 werden über tausend Fehler gemeldet.Wenn Sie vor Browserfehlern im Zusammenhang mit der Entschlüsselung von Entitäten isoliert werden möchten und / oder in der Lage sein möchten, die gesamte Bandbreite der benannten Zeichenreferenzen zu verarbeiten, können Sie mit dem
<textarea>
Hack nicht durchkommen . Du brauchst eine Bibliothek wie er .Er hat einfach das verdammte Gefühl, dass es weniger hackig ist, Dinge auf diese Weise zu tun.
quelle
kodieren:
dekodieren:
quelle
Verwenden
Es ist am einfachsten, dies auf der Serverseite zu tun, da JavaScript anscheinend keine native Bibliothek für die Verarbeitung von Entitäten hat und ich auch keine in den Suchergebnissen für die verschiedenen Frameworks gefunden habe, die JavaScript erweitern.
Suchen Sie nach "JavaScript-HTML-Entitäten", und Sie finden möglicherweise einige Bibliotheken für diesen Zweck, aber sie werden wahrscheinlich alle auf der obigen Logik basieren - ersetzen Sie Entität durch Entität.
quelle
Ich musste nur einen HTML-Entity-Charater (⇓) als Wert für eine HTML-Schaltfläche haben. Der HTML-Code sieht im Browser von Anfang an gut aus:
Jetzt habe ich einen Schalter hinzugefügt, der auch den Charakter anzeigen soll. Das ist meine Lösung
Dies zeigt ⇓ erneut in der Schaltfläche an. Ich hoffe das könnte jemandem helfen.
quelle
"Embed & Share \u21d1"
) zu verwenden, oder noch besser,"Embed & Share ⇑"
wenn Sie Ihr Skript in UTF-8 (oder UTF-16 oder einer anderen Codierung, die das Zeichen ⇑ unterstützt) bereitstellen können. Die Verwendung eines DOM-Elements zum Parsen einer HTML-Entität, nur um ein beliebiges Unicode-Zeichen in eine JavaScript-Zeichenfolge zu backen, ist ein gerissener und kreativer Ansatz, der Rube Goldberg stolz machen würde, aber keine gute Praxis ist. Unicode-Escapezeichen sind in der Sprache speziell für diesen Anwendungsfall.Sie müssen benutzerdefinierte Funktionen für HTML-Entitäten erstellen:
quelle
Angenommen, Sie haben unten String.
Unsere Deluxe-Kabinen sind warm, gemütlich & amp; komfortabel
str und zurück zuweisen
Etikett.
das ist es.
quelle
Wenn Sie für ExtJS-Benutzer bereits über die codierte Zeichenfolge verfügen, z. B. wenn der zurückgegebene Wert einer Bibliotheksfunktion der innerHTML-Inhalt ist, sollten Sie diese ExtJS-Funktion berücksichtigen:
quelle
Erweitern Sie eine String-Klasse:
und als Methode verwenden:
quelle
Versuche dies :
parseHTML ist eine Funktion in der Jquery-Bibliothek und gibt ein Array zurück, das einige Details zum angegebenen String enthält.
In einigen Fällen ist der String groß, sodass die Funktion den Inhalt in viele Indizes aufteilt.
und um alle Indexdaten zu erhalten, sollten Sie zu einem beliebigen Index gehen und dann auf den Index mit dem Namen "WholeText" zugreifen.
Ich habe Index 0 gewählt, weil er in allen Fällen funktioniert (kleiner oder großer String).
quelle
Hier ist noch ein Problem: Escaped String sieht nicht lesbar aus, wenn es dem Eingabewert zugewiesen wird
Beispiel: https://jsfiddle.net/kjpdwmqa/3/
quelle
escape
Methode Underscore.js. Es gibt auch keine Erklärung, wie Ihr Codebeispiel das Problem von OP lösen sollte.Alternativ gibt es auch eine Bibliothek dafür ..
hier https://cdnjs.com/libraries/he
Die Verwendung ist wie folgt ...
Prost.
quelle
Verwenden Sie zum Dekodieren von HTML-Entitäten mit jQuery einfach die folgende Funktion:
Wie benutzt man:
Javascript:
HTML:
quelle
Am einfachsten ist es, eine Klassenauswahl für Ihre Elemente festzulegen und dann den folgenden Code zu verwenden:
Nichts mehr nötig!
Ich hatte dieses Problem und fand diese klare Lösung und es funktioniert gut.
quelle
Ich denke, das ist das genaue Gegenteil der gewählten Lösung.
quelle