Ich gebe Werte aus einer Datenbank aus (sie ist nicht wirklich öffentlich zugänglich, aber für Benutzer eines Unternehmens offen - das heißt, ich mache mir keine Sorgen um XSS ).
Ich versuche, ein Tag wie folgt auszugeben:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
BESCHREIBUNG ist eigentlich ein Wert aus der Datenbank, der ungefähr so aussieht:
Prelim Assess "Mini" Report
Ich habe versucht, "durch \" zu ersetzen, aber egal was ich versuche, Firefox unterbricht meinen JavaScript-Aufruf nach dem Leerzeichen nach dem Wort " Assess" immer wieder und verursacht alle möglichen Probleme.
Ich muss die offensichtliche Antwort verfehlen, aber für mein Leben kann ich es nicht herausfinden.
Möchte jemand auf meine Idiotie hinweisen?
Hier ist die gesamte HTML-Seite (es wird irgendwann eine ASP.NET- Seite sein, aber um dies zu lösen, habe ich alles andere als den Problemcode herausgenommen).
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
quelle
onclick
Ereignisanhang unauffällig zu machen und alle Ihre Datenbankinformationen auf eine Dateninsel zu verschieben. Die Dinge werden sauberer und Sie erhalten tatsächlich eine Art Syntaxfehler, wenn Ihre Zeichenfolgen falsch maskiert werden.Antworten:
Sie müssen die Zeichenfolge, in die Sie schreiben,
DoEdit
maskieren, um die Zeichen in doppelten Anführungszeichen zu entfernen. Sie führen dazu, dass dasonclick
HTML-Attribut vorzeitig geschlossen wird.Die Verwendung des JavaScript-Escapezeichens
\
ist im HTML-Kontext nicht ausreichend. Sie müssen das doppelte Anführungszeichen durch die richtige XML-Entitätsdarstellung ersetzen"
.quelle
'mystring'.replace(/"/g, '"');
"
würde in diesem speziellen Fall, wie vor mir vorgeschlagen, aufgrund des HTML-Kontexts funktionieren.Wenn Sie jedoch möchten, dass Ihr JavaScript-Code für jeden Kontext unabhängig maskiert wird, können Sie sich für die native JavaScript-Codierung entscheiden:
'
wird\x27
"
wird\x22
Ihr Onclick würde also werden:
DoEdit('Preliminary Assessment \x22Mini\x22');
Dies würde beispielsweise auch funktionieren, wenn eine JavaScript-Zeichenfolge als Parameter an eine andere JavaScript-Methode übergeben wird (dies
alert()
ist eine einfache Testmethode).Ich verweise Sie auf die doppelte Frage zum Stapelüberlauf : Wie kann ich eine Zeichenfolge in JavaScript-Code in einem onClick-Handler umgehen? .
quelle
"
natürlich funktioniert."
dies in Eingabewerten erforderlich ist, dh<input value="\x22quoted string\x22">
nicht funktioniert.onclick="..."
). Der Wert einesvalue
Attributs wird nicht in einem JavaScript-Kontext verarbeitet, sondern nur in einem HTML-Kontext.'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
Sollte den Trick machen.
quelle
Leute, es gibt bereits die
unescape
Funktion in JavaScript, die das Unescaping für Folgendes ausführt\"
:quelle
Das Problem ist, dass HTML das Escape-Zeichen nicht erkennt. Sie können dies umgehen, indem Sie die einfachen Anführungszeichen für das HTML-Attribut und die doppelten Anführungszeichen für den Onclick verwenden.
quelle
So mache ich es im Grunde
str.replace(/[\""]/g, '\\"')
.quelle
Wenn Sie den HTML-Code in Java zusammenstellen, können Sie diese nette Dienstprogrammklasse von Apache commons-lang verwenden, um alle Escapezeichen korrekt auszuführen:
quelle
Ich habe ein Beispiel mit jQuery erstellt
Und das funktioniert in Internet Explorer und Firefox.
quelle
Sie können diese beiden Funktionen (siehe unten) kopieren und sie verwenden, um alle Anführungszeichen und Sonderzeichen zu umgehen / zu entfernen. Sie müssen dafür weder jQuery noch eine andere Bibliothek verwenden.
quelle
Im folgenden Code finden Sie die einfachen Anführungszeichen als Teil der eingegebenen Zeichenfolge mit einem regulären Ausdruck. Es wird überprüft, ob die vom Benutzer eingegebene Zeichenfolge durch Kommas getrennt ist, und gleichzeitig werden sogar einzelne Anführungszeichen, die als Teil der Zeichenfolge eingegeben wurden, ausgeblendet.
Um einfache Anführungszeichen zu umgehen, geben Sie einfach einen Schrägstrich gefolgt von einem einfachen Anführungszeichen wie: \ ' als Teil der Zeichenfolge ein. Ich habe für dieses Beispiel den jQuery-Validator verwendet, und Sie können ihn nach Belieben verwenden.
Gültige String-Beispiele:
'Hallo'
'Hallo Welt'
'Hallo Welt'
'Hallo Welt',' '
"Es ist meine Welt", "Kann das nicht ohne mich genießen.", "Willkommen, Gast"
HTML:
JavaScript:
quelle
Entkomme auch dem Leerzeichen. Es klingt für mich so, als würde Firefox drei Argumente anstelle von einem annehmen.
ist das nicht brechende Leerzeichen. Auch wenn es nicht das ganze Problem ist, kann es dennoch eine gute Idee sein.quelle
Sie müssen Anführungszeichen mit doppelten Backslashes umgehen.
Dies schlägt fehl (erzeugt durch PHPs json_encode ):
Das funktioniert:
quelle
Sie können die jQuery-Methoden Escape () und Unescape () verwenden. Wie unten,
Verwenden Sie
escape(str);
diese Option , um die Zeichenfolge zu umgehen und mit wiederherzustellenunescape(str_esc);
.quelle