Unterminated String Literal, Apostrophe und Maskierungen
rapid
- javascript
Hallo
ich habe ein Problem beim Aufrufen von JavaScript-Funktionen mit Parametern. Genauer gesagt sind es die Stringbegrenzungszeichen, die mir Kopfzerbrechen bereiten.
Ein Parameter kommt aus einer Datenbank, d.h. dort sind u.U. Apostrophe drin (sprich " und ').
Mein Aufruf hat folgende Struktur:
<a href="javascript:funktion('parameter1','parameter2','Parameter\"3\"')">
Wie ihr seht, habe ich die entsprechenden Zeichen schon mit addslashes maskiert. Und wie ihr auch seht, bringt die Maskierung nichts. Immer, wenn ich die Funktion so aufrufe, bekomme ich ein "Unterminated string literal" in FireBug und Fehlerkonsole.
Der Parameter an sich darf nicht verändert werden.
Wie kann ich das lösen?
Lg
rapid
@@rapid:
nuqneH
Wie ihr seht, habe ich die entsprechenden Zeichen schon mit addslashes maskiert. Und wie ihr auch seht, bringt die Maskierung nichts.
Natürlich nicht. HTML intersessiert sich nicht für JavaScript-Escapes.
<a href="javascript:funktion('parameter1','parameter2','Parameter\"3\"')">
▲Beginn des Attributwerts von @href ▲Ende des Attributwerts von @href
Escape die " durch ihren Zeichencode (" U+0022 bzw. ' U+0027):
<a href="javascript:[code lang=javascript]funktion('parameter1','parameter2','Parameter\u00223\u0022')
">[/code]
Sinnvoller wäre allerdings IMHO, " und ' würden gar nicht im Text auftauchen, sondern die typographisch richtigen Zeichen „ “ ” ’. Das sieht 1. besser aus und 2. ergeben sich solche Probleme mit Escapes gar nicht erst.
Qapla'
Hallo!
Vielleicht könntest du auch z.B. in PHP das " durch + ersetzen und das ' durch * und in der aufgerufenen Javascriptfunktion mit replace() wieder zurück in " und ' ?
Also dein PHP-Script erzeugt nicht
<a href="javascript:funktion('parameter1','parameter2','Parameter\"3\"')">
sondern
<a href="javascript:funktion('parameter1','parameter2','Parameter+3+')">
Es kann ja ein beliebiger String sein.
Grüße.
Hi,
Vielleicht könntest du auch z.B. in PHP das " durch + ersetzen und das ' durch * und in der aufgerufenen Javascriptfunktion mit replace() wieder zurück in " und ' ?
Dann bekommst du ein Problem mit "echten" Plus- und Stern-Zeichen, die ggf. im Inhalt vorkommen.
MfG ChrisB
Dann bekommst du ein Problem mit "echten" Plus- und Stern-Zeichen, die ggf. im Inhalt vorkommen.
MfG ChrisB
Ja, da hast du natürlich recht, es war ja auch nur ein Beispiel. Da es ja irgendein String sein kann könnte man ja auch z.B. ##??## nehmen oder *+#? oder was weiß ich. Auf jeden Fall eine "unnatürliche" Zeichenfolge.
Grüße.
Hi,
Ja, da hast du natürlich recht, es war ja auch nur ein Beispiel. Da es ja irgendein String sein kann könnte man ja auch z.B. ##??## nehmen oder *+#? oder was weiß ich. Auf jeden Fall eine "unnatürliche" Zeichenfolge.
Auch die kann irgendwann in den Daten auftauchen.
Dass diese dann an der Stelle *keine* Sonderbedeutung hat, sondern für sich selber steht, muss also auch wieder irgendwie kenntlich gemacht werden.
Gängige Escaping-Mechanismen berücksichtigen das bereits - z.B. die, in denen der Backslash Sonderbedeutung hat, nehmen ihm diese wieder, in dem sie ihm einen zweiten voranstellen.
Das Verhalten selber nachbasteln zu wollen, ist i.a.R. keine gute Idee.
Zumal du damit eine zweite Schicht einziehst, auf der der Inhalt erneut "geparst" werden muss - was das ganze langsamer und unperformanter macht.
MfG ChrisB
Auch die kann irgendwann in den Daten auftauchen.
Dass diese dann an der Stelle *keine* Sonderbedeutung hat, sondern für sich selber steht, muss also auch wieder irgendwie kenntlich gemacht werden.
Da hast du natürlich wieder recht, zumal wir im Moment nicht wissen, um was für Daten es sich bei rapid handelt.
Das Verhalten selber nachbasteln zu wollen, ist i.a.R. keine gute Idee.
Zumal du damit eine zweite Schicht einziehst, auf der der Inhalt erneut "geparst" werden muss - was das ganze langsamer und unperformanter macht.
Auch hier gebe ich dir natürlich recht, vor allem wenn es sich um viele Datensätze handelt.
Mir fällt aber gerade noch ein andere Ansatz ein, der vielleicht auch funktionieren könnte. Man könnte durch PHP ein "Javascript Array" erzeugen und nur den Index als Parameter im href an die Funktion übergeben, z.B. so:
PHP:
// $anzahl wird z.B. mit mysql_num_rows() erzeugt
$js="parameter3 = new Array(";
for($a=0;$a<$anzahl;$a++) {
if($a<($anzahl-1) && $anzahl<1)
$js.="'".$datensatz_aus_der_datenbank."',";
else
$js.="'".$datensatz_aus_der_datenbank."'";
}
$js.=");";
Die Variable $js wird dann z.B. im HEAD-Teil so ausgegeben und dient in diesem Falle als globale Variable:
<script type="text/javascript">
<? echo $js; ?>
</script>
($js kann natürlich auch in der Funktion untergebracht werden)
somit könnte man dann bei der href Ausgabe das z.B. so machen:
<a href="javascript:funktion('parameter1','parameter2',parameter3[0])">
Man könnte auch gleich die hrefs in der selben Schleife erzeugen, in einem Array speichern und später ausgeben, somit wäre das Problem des richtigen Index im passenden href auch erledigt.
Ist jetzt natürlich ungetestet und soll nur als Denkanstoss dienen.
Grüße.
@Gunnar:
rut ylHmey ghom Hoch!
Hallo,
Dann bekommst du ein Problem mit "echten" Plus- und Stern-Zeichen, die ggf. im Inhalt vorkommen.
Ja, da hast du natürlich recht, es war ja auch nur ein Beispiel. Da es ja irgendein String sein kann könnte man ja auch z.B. ##??## nehmen oder *+#? oder was weiß ich. Auf jeden Fall eine "unnatürliche" Zeichenfolge.
nein. Genau aus diesem Grund muss man Zeichen kontextgerecht kodieren. Dabei muss man auf die Reihenfolge der Verschachtelung achten:
Befindet sich Javascript in einem HTML-Kontext, so muss man die Daten zunächst für Javascript aufbereiten und anschließend die für Javascript aufbereiteten Daten für HTML aufbereiten.
Freundliche Grüße
Vinzenz