Ich habe Saiten wie
var str = 'One & two & three';
vom Webserver in HTML gerendert. Ich muss diese Saiten in verwandeln
'One & two & three'
Derzeit mache ich das (mit Hilfe von jQuery):
$(document.createElement('div')).html('{{ driver.person.name }}').text()
Ich habe jedoch ein beunruhigendes Gefühl, dass ich es falsch mache. Ich habe versucht
unescape("&")
aber es scheint nicht zu funktionieren, decodeURI / decodeURIComponent auch nicht.
Gibt es andere, einheimischere und elegantere Möglichkeiten?
javascript
html
text
decode
Kunst
quelle
quelle
escape
d- oder URI-codierte Zeichenfolgen , funktionieren diese Funktionen nicht.𝕫
. Dies ist ein Problem mit einer sich entwickelnden Spezifikation. Als solches sollten Sie ein Werkzeug auswählen, das tatsächlich gewartet wird, um es zu lösen.Antworten:
Eine modernere Option zum Interpretieren von HTML (Text und andere) aus JavaScript ist die HTML-Unterstützung in der
DOMParser
API ( siehe hier in MDN ). Auf diese Weise können Sie den nativen HTML-Parser des Browsers verwenden, um eine Zeichenfolge in ein HTML-Dokument zu konvertieren. Es wird seit Ende 2014 in neuen Versionen aller gängigen Browser unterstützt.Wenn wir nur Textinhalte dekodieren möchten, können wir ihn als einzigen Inhalt in einen Dokumentkörper einfügen, das Dokument analysieren und den Inhalt herausziehen
.body.textContent
.Wir können im Entwurf der Spezifikation sehen,
DOMParser
dass JavaScript für das analysierte Dokument nicht aktiviert ist, sodass wir diese Textkonvertierung ohne Sicherheitsbedenken durchführen können.Es würde den Rahmen dieser Frage sprengen , aber bitte beachten Sie, dass, wenn Sie die analysierten DOM-Knoten selbst (nicht nur ihren Textinhalt) nehmen und sie in das Live-Dokument-DOM verschieben, es möglich ist, dass ihre Skripterstellung wieder aktiviert wird, und dies könnte der Fall sein Sicherheitsbedenken sein. Ich habe es nicht recherchiert, also seien Sie bitte vorsichtig.
quelle
Müssen Sie alle codierten HTML-Entitäten oder nur sich
&
selbst dekodieren ?Wenn Sie nur damit umgehen müssen,
&
können Sie dies tun:Wenn Sie alle HTML-Entitäten dekodieren müssen, können Sie dies ohne jQuery tun:
Bitte beachten Sie die folgenden Kommentare von Mark, die Sicherheitslücken in einer früheren Version dieser Antwort hervorheben, und empfehlen, potenzielle XSS-Schwachstellen zu verwenden,
textarea
anstatt siediv
zu mindern. Diese Sicherheitsanfälligkeiten bestehen unabhängig davon, ob Sie jQuery oder einfaches JavaScript verwenden.quelle
encoded='<img src="bla" onerror="alert(1)">'
diesem Fall wird im obigen Snippet eine Warnung angezeigt. Dies bedeutet, wenn Ihr codierter Text von Benutzereingaben stammt, kann das Decodieren mit diesem Snippet eine XSS-Sicherheitsanfälligkeit darstellen.null
nach dem Abrufenalert(1)
wird für mich unter Chrome unter OS X immer noch ausgelöst. Wenn du eine sichere Variante dieses Hacks willst, versuche es mit einemtextarea
.Matthias Bynens hat dafür eine Bibliothek: https://github.com/mathiasbynens/he
Beispiel:
Ich schlage vor, es Hacks vorzuziehen, bei denen der HTML-Inhalt eines Elements festgelegt und dann dessen Textinhalt zurückgelesen wird. Solche Ansätze können funktionieren, sind jedoch täuschend gefährlich und bieten XSS-Möglichkeiten, wenn sie für nicht vertrauenswürdige Benutzereingaben verwendet werden.
Wenn Sie es wirklich nicht ertragen können, in eine Bibliothek zu laden, können Sie den
textarea
in dieser Antwort beschriebenen Hack auf eine nahezu doppelte Frage anwenden, die im Gegensatz zu verschiedenen ähnlichen Ansätzen, die vorgeschlagen wurden, keine mir bekannten Sicherheitslücken aufweist:Beachten Sie jedoch die Sicherheitsprobleme, die ähnliche Ansätze betreffen, die ich in der verknüpften Antwort aufführe! Dieser Ansatz ist ein Hack, und zukünftige Änderungen am zulässigen Inhalt eines
textarea
(oder an Fehlern in bestimmten Browsern) können dazu führen, dass Code eines Tages plötzlich ein XSS-Loch aufweist.quelle
he
ist absolut großartig! Vielen Dank für die Empfehlung!Dies ist aus ExtJS-Quellcode.
quelle
htmlEnDecode.htmlDecode('€')
sollte zurückkehren'€'
, aber stattdessen zurückgeben'€'
.element.innerText
macht auch den Trick.quelle
Sie können die Lodash Unescape / Escape-Funktion https://lodash.com/docs/4.17.5#unescape verwenden
str wird werden
'fred, barney, & pebbles'
quelle
Für den Fall, dass Sie danach suchen, wie ich - mittlerweile gibt es eine nette und sichere JQuery-Methode.
https://api.jquery.com/jquery.parsehtml/
Sie können f.ex. Geben Sie dies in Ihre Konsole ein:
$ .ParseHTML (x) gibt also ein Array zurück. Wenn Sie HTML-Markup in Ihrem Text haben, ist die array.length größer als 1.
quelle
x
ein Wert<script>alert('hello');</script>
der oben genannten hat, stürzt ab. In der aktuellen jQuery wird nicht versucht, das Skript auszuführen, sondern es[0]
wird nachgegeben,undefined
sodass der Aufruf vontextContent
fehlschlägt und Ihr Skript dort stoppt.$('<div />').html(x).text();
sieht sicherer aus - via gist.github.com/jmblog/3222899jQuery wird für Sie codieren und decodieren. Sie müssen jedoch ein Textarea-Tag verwenden, kein div.
quelle
.html()
. Dahertextarea
reicht es nicht aus, a zu verwenden, um hier die Sicherheit zu gewährleisten. Ich empfehle , jQuery für diese Aufgabe nicht zu verwenden und äquivalenten Code mit der einfachen DOM-API zu schreiben . (Ja, dieses alte Verhalten von jQuery ist verrückt und schrecklich.)Erstellen Sie zuerst eine
<span id="decodeIt" style="display:none;"></span>
irgendwo im KörperWeisen Sie als Nächstes die Zeichenfolge zu, die als innerHTML dekodiert werden soll:
Schließlich,
Hier ist der Gesamtcode:
quelle
stringtodecode
etwas enthält<script>alert(1)</script>
.eine Javascript-Lösung, die die gängigen fängt:
Dies ist die Umkehrung von https://stackoverflow.com/a/4835406/2738039
quelle
map[c] || ''
nicht erkannte verwenden, werden diese nicht alsundefined
unescapeHtml(str){ var map = {amp: '&', lt: '<', le: '≤', gt: '>', ge: '≥', quot: '"', '#039': "'"} return str.replace(/&([^;]+);/g, (m, c) => map[c]|| '') }
Für einzeilige Leute:
quelle
Die Frage gibt nicht den Ursprung von an,
x
aber es ist sinnvoll, wenn möglich gegen böswillige (oder nur unerwartete) Eingaben aus unserer eigenen Anwendung zu verteidigen. Angenommen,x
hat einen Wert von& <script>alert('hello');</script>
. Eine sichere und einfache Möglichkeit, dies in jQuery zu handhaben, ist:Gefunden über https://gist.github.com/jmblog/3222899 . Ich sehe nicht viele Gründe, diese Lösung zu vermeiden, da sie mindestens so kurz ist, wenn nicht sogar kürzer als einige Alternativen und Schutz gegen XSS bietet.
(Ich habe dies ursprünglich als Kommentar gepostet, füge es aber als Antwort hinzu, da ein nachfolgender Kommentar im selben Thread mich dazu aufgefordert hat.)
quelle
Ich habe alles versucht, um & aus einem JSON-Array zu entfernen. Keines der oben genannten Beispiele, aber https://stackoverflow.com/users/2030321/chris ergab eine großartige Lösung, die mich dazu brachte, mein Problem zu beheben.
Ich habe es nicht verwendet, weil ich nicht verstanden habe, wie man es in ein modales Fenster einfügt, das JSON-Daten in ein Array zieht, aber ich habe dies anhand des Beispiels versucht, und es hat funktioniert:
Ich mag es, weil es einfach war und funktioniert, aber nicht sicher, warum es nicht weit verbreitet ist. Hi & Low gesucht, um eine einfache Lösung zu finden. Ich bemühe mich weiterhin um ein Verständnis der Syntax und ob ein Risiko besteht, diese zu verwenden. Habe noch nichts gefunden.
quelle