Anscheinend ist dies schwieriger zu finden, als ich gedacht hatte. Und es ist sogar so einfach ...
Gibt es eine Funktion, die den in Javascript integrierten htmlspecialchars von PHP entspricht? Ich weiß, dass es ziemlich einfach ist, dies selbst zu implementieren, aber die Verwendung einer integrierten Funktion, falls verfügbar, ist einfach besser.
Für diejenigen, die mit PHP nicht vertraut sind, übersetzt htmlspecialchars Dinge wie <htmltag/>
in<htmltag/>
Ich weiß das escape()
und encodeURI()
arbeite nicht so.
javascript
html
escaping
html-encode
Bart van Heukelom
quelle
quelle
Antworten:
Es gibt ein Problem mit Ihrem Lösungscode - er wird nur dem ersten Auftreten jedes Sonderzeichens entgehen. Beispielsweise:
Hier ist Code, der richtig funktioniert:
Aktualisieren
Der folgende Code führt zu identischen Ergebnissen wie der oben beschriebene, bietet jedoch eine bessere Leistung, insbesondere bei großen Textblöcken (danke jbo5112 ).
quelle
Das ist HTML-Codierung. Es gibt keine native Javascript-Funktion, um dies zu tun, aber Sie können googeln und einige gut gemachte erledigen.
ZB http://sanzon.wordpress.com/2008/05/01/neat-little-html-encoding-trick-in-javascript/
EDIT:
Das habe ich getestet:
Ausgabe:
<htmltag/>
quelle
encodeURIComponent
tut, was das OP verlangt und überhaupt nicht. Kannst du das bitte bearbeiten? Ich kann meine -1 nicht rückgängig machen.div
Element und ein Textknoten . Wenn Sie einen Textknoten mit dem Text "<img src = bogus onerror = alert (1337)>" erstellen, wird nur ein Textknoten erstellt, keinimg
Element.Eine Lektüre wert: http://bigdingus.com/2007/12/29/html-escaping-in-javascript/
Hinweis : Führen Sie dies nur einmal aus. Und führen Sie es nicht auf bereits kodierten Strings zB
&
wird&amp;
quelle
Mit jQuery kann es so sein:
Aus verwandter Frage HTML-Zeichenfolgen mit jQuery entkommen
Wie im Kommentar erwähnt, bleiben doppelte Anführungszeichen und einfache Anführungszeichen für diese Implementierung unverändert. Das bedeutet, dass diese Lösung nicht verwendet werden sollte, wenn Sie ein Elementattribut als rohen HTML-String erstellen müssen.
quelle
<!-- Caps rage begin -->
Diese Antwort sollte eine NEGATIVE Bewertung haben, da sie nicht einmal der Beantwortung der Frage "HtmlSpecialChars-Äquivalent" nahe kommt.<!-- Caps rage end -->
es-entkommt-nicht-zitiert-jesus-christus-und-andere-gottheiten. OMG du fragst Leute.Hier ist eine Funktion, um HTML zu entkommen:
Und zu entschlüsseln:
quelle
Underscore.js bietet hierfür eine Funktion:
http://underscorejs.org/#escape
Es ist keine integrierte Javascript-Funktion, aber wenn Sie bereits Unterstrich verwenden, ist dies eine bessere Alternative als das Schreiben einer eigenen Funktion, wenn die zu konvertierenden Zeichenfolgen nicht zu groß sind.
quelle
Eine weitere Möglichkeit besteht darin, auf die gesamte Zeichenzuordnung insgesamt zu verzichten und stattdessen alle unerwünschten Zeichen in ihre jeweiligen numerischen Zeichenreferenzen umzuwandeln, z.
Beachten Sie, dass der angegebene RegEx nur die spezifischen Zeichen verarbeitet, denen das OP entkommen wollte. Abhängig vom Kontext, in dem der maskierte HTML-Code verwendet werden soll, sind diese Zeichen möglicherweise nicht ausreichend. Der Artikel von Ryan Grove Es gibt mehr zu HTML als &, <,> und " ist eine gute Lektüre zu diesem Thema. Abhängig von Ihrem Kontext ist möglicherweise die folgende RegEx erforderlich, um eine XSS-Injektion zu vermeiden:
quelle
Stichprobe :
quelle
Möglicherweise benötigen Sie eine solche Funktion nicht. Da sich Ihr Code bereits im Browser * befindet, können Sie direkt auf das DOM zugreifen, anstatt HTML zu generieren und zu codieren, das vom Browser rückwärts decodiert werden muss, um tatsächlich verwendet zu werden.
Verwenden Sie die
innerText
Eigenschaft, um einfachen Text sicher und viel schneller in das DOM einzufügen als mit einer der vorgestellten Escape-Funktionen. Noch schneller als das Zuweisen einer statischen vorcodierten ZeichenfolgeinnerHTML
.Verwenden Sie
classList
zum Bearbeiten Klassen,dataset
um Satzdata-
Attribute undsetAttribute
für andere.All dies erledigt die Flucht für Sie. Genauer gesagt ist kein Escapezeichen erforderlich und es wird keine Codierung unter ** durchgeführt, da Sie HTML, die Textdarstellung von DOM, umgehen.
* Diese Antwort ist nicht für serverseitige JavaScript-Benutzer (Node.js usw. ) gedacht .
** Es sei denn, Sie konvertieren es anschließend explizit in tatsächliches HTML. ZB durch Zugriff
innerHTML
- dies passiert, wenn Sie$('<div/>').text(value).html();
in anderen Antworten vorgeschlagen ausführen . Wenn Ihr letztes Ziel darin besteht, einige Daten in das Dokument einzufügen, erledigen Sie die Arbeit auf diese Weise zweimal. Sie können auch sehen, dass im resultierenden HTML-Code nicht alles codiert ist, sondern nur das Minimum, das erforderlich ist, damit es gültig ist. Dies erfolgt kontextabhängig. Aus diesem Grund codiert diese jQuery-Methode keine Anführungszeichen und sollte daher nicht als Allzweck-Escaper verwendet werden. Das Enthalten von Anführungszeichen ist erforderlich, wenn Sie HTML als Zeichenfolge mit nicht vertrauenswürdigen oder in Anführungszeichen enthaltenden Daten an der Stelle des Attributwerts erstellen. Wenn Sie die DOM-API verwenden, müssen Sie sich überhaupt nicht darum kümmern, zu entkommen.quelle
el.textContent = str; el.innerHTML = el.innerHTML.replace(/\n/g, '<br>')
) ersetzen oder die CSS-white-space
Eigenschaft aufpre
oderpre-wrap
innerText
statttextContent
. Es ist zwar etwas langsamer und weist beim Lesen der Eigenschaft einige andere Unterschiede auf , ist jedoch intuitiver, da das<br>
Ersetzen beim Zuweisen automatisch erfolgt.Für Node.JS-Benutzer (oder Benutzer, die die Jade-Laufzeit im Browser verwenden) können Sie die Escape-Funktion von Jade verwenden.
Es macht keinen Sinn, es selbst zu schreiben, wenn jemand anderes es pflegt. :) :)
quelle
Ich arbeite ein wenig an der Antwort von okw.
Sie können dafür die DOM-Funktionen des Browsers verwenden.
Dies kehrt zurück
<escapeThis>&
Es verwendet die Standardfunktion
createElement
, um ein unsichtbares Element zu erstellen, verwendet dann die FunktiontextContent
, um eine beliebige Zeichenfolge als Inhalt festzulegen undinnerHTML
den Inhalt dann in seiner HTML-Darstellung abzurufen.quelle
quelle
Hoffe, dass dies das Rennen aufgrund seiner Leistung gewinnt und vor allem keine verkettete Logik mit .replace ('&', '&'). Replace ('<', '<') ...
quelle
Umgekehrt:
quelle
<
und&gr;
in einer Zeichenfolge.To write a greater than sign in HTML type &gt;
:, wird er>
anstelle von>
OWASP empfiehlt, dass "[e] außer für alphanumerische Zeichen [Sie sollten] alle Zeichen mit ASCII-Werten unter 256 mit dem
&#xHH;
Format (oder einer benannten Entität, falls verfügbar) maskieren , um ein Ausschalten des Attributs [an] zu verhindern."Hier ist eine Funktion, die dies anhand eines Verwendungsbeispiels tut:
quelle
Diese Lösung verwendet den numerischen Code der Zeichen, der beispielsweise
<
durch ersetzt wird<
.Obwohl seine Leistung etwas schlechter ist als die Lösung mit einer Karte , hat es die Vorteile:
quelle