Der jQuery-Trick kodiert keine Anführungszeichen, und im IE werden die Leerzeichen entfernt.
Auf der Grundlage der Flucht templatetag in Django, die ich vermute, ist stark genutzt/getestet bereits, ich machte diese Funktion, die tut, was benötigt wird.
Es ist wohl einfacher (und möglicherweise schneller) als alle Workarounds für das Whitespace-Stripping-Problem - und es kodiert Anführungszeichen, was unerlässlich ist, wenn Sie das Ergebnis beispielsweise innerhalb eines Attributwerts verwenden möchten.
function htmlEscape(str) {
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
// I needed the opposite function today, so adding here too:
function htmlUnescape(str){
return str
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&');
}
Update 2013-06-17:
Auf der Suche nach dem schnellsten Escaping habe ich diese Implementierung eines replaceAll
método:
http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(Auch hier wird darauf verwiesen: Schnellste Methode zum Ersetzen aller Instanzen eines Zeichens in einer Zeichenkette )
Hier einige Leistungsergebnisse:
http://jsperf.com/htmlencoderegex/25
Sie liefert die gleiche Ergebniszeichenkette wie die eingebaute replace
Ketten oben. Ich würde mich sehr freuen, wenn mir jemand erklären könnte, warum das schneller geht!?
Update 2015-03-04:
Mir ist gerade aufgefallen, dass AngularJS genau die obige Methode verwendet:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Sie fügen eine Reihe von Verfeinerungen hinzu - sie scheinen mit einem obskures Unicode-Problem sowie die Umwandlung aller nicht alphanumerischen Zeichen in Entitäten. Ich hatte den Eindruck, dass letzteres nicht notwendig ist, solange Sie einen UTF8-Zeichensatz für Ihr Dokument festgelegt haben.
Ich möchte anmerken, dass (4 Jahre später) Django immer noch keines dieser Dinge tut, also bin ich nicht sicher, wie wichtig sie sind:
https://github.com/django/django/blob/1.8b1/django/utils/html.py#L44
Update 2016-04-06:
Möglicherweise möchten Sie auch den Schrägstrich /
. Dies ist für eine korrekte HTML-Kodierung nicht erforderlich, aber es ist empfohlen von OWASP als Sicherheitsmaßnahme gegen XSS. (Dank an @JNF für diesen Vorschlag in den Kommentaren)
.replace(/\//g, '/');
0 Stimmen
Können Sie das von Ihnen verwendete Javascript zeigen?
1 Stimmen
Ich habe hinzugefügt, wie ich einen Wert aus einem versteckten Feld erhalte
0 Stimmen
debuggable.com/posts/
5 Stimmen
Verwenden Sie NICHT die innerHTML-Methode (die jQuery-Methode .html() verwendet innerHTML), da diese bei einigen Browsern (ich habe nur Chrome getestet) keine Anführungszeichen ausspart, so dass, wenn Sie Ihren Wert in einen Attributwert einfügen würden, eine XSS-Schwachstelle entstehen würde.
23 Stimmen
In welchem Zusammenhang ist
chalk
ycheese
jemals zusammen verwendet 0_o2 Stimmen
@d-_-b wenn man zwei Dinge vergleicht. z.B. sind sie so unterschiedlich wie Kreide und Käse ;)