HighDots Forums  

HTML escapen

Javascript (German) Programmiersprache JavaScript. (de.comp.lang.javascript)


Discuss HTML escapen in the Javascript (German) forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Chris Seidel
 
Posts: n/a

Default HTML escapen - 10-06-2009 , 06:12 AM






Hallo,

ich habe folgendes HTML-Attribut an einem img-Element:

onmouseover="showTip(event,
'<script>alert('Test')</script>', true)"

M.E. alles richtig escapet.

Bevor das an die Javascript-Funktion geht, wird das aber scheinbar wieder
unescapet, denn FireBug zeigt mir in der Console an, dass dieses Skript
falsch ist:

missing ) after argument list
showTip(event, '<script>alert('Test')</script>', true)


Wie bekomme ich das jetzt sauber an die JS-Funktion übergeben?

Danke

--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/

Reply With Quote
  #2  
Old   
Holger Jeromin
 
Posts: n/a

Default Re: HTML escapen - 10-06-2009 , 07:01 AM






Chris Seidel schrieb am 06.10.2009 12:12:

Quote:
ich habe folgendes HTML-Attribut an einem img-Element:

onmouseover="showTip(event,
'&lt;script>alert('Test')&lt;/script>', true)"

M.E. alles richtig escapet.

Bevor das an die Javascript-Funktion geht, wird das aber scheinbar wieder
unescapet, denn FireBug zeigt mir in der Console an, dass dieses Skript
falsch ist:

missing ) after argument list
showTip(event, '<script>alert('Test')</script>', true)
Dein Ziel sollte
showTip(event, '<script>alert("Test")</script>', true)
lauten.

Quote:
Wie bekomme ich das jetzt sauber an die JS-Funktion übergeben?
Danke
Der ganze Code sieht sehr fies aus. Überlege, ob du das nicht anders
viel eleganter lösen kannst.

--
Mit freundlichen Grüßen
Holger Jeromin

Reply With Quote
  #3  
Old   
Martin Honnen
 
Posts: n/a

Default Re: HTML escapen - 10-06-2009 , 07:05 AM



Chris Seidel wrote:

Quote:
ich habe folgendes HTML-Attribut an einem img-Element:

onmouseover="showTip(event,
'&lt;script>alert('Test')&lt;/script>', true)"

M.E. alles richtig escapet.
Versuche es mit

onmouseover="showTip(event,
'&lt;script&gt;alert(\'Test\')&lt;/script&gt;', true)"

zumindest wenn das zweite Argument, das du an showTip übergeben willst,
eine einzelne Zeichenkette sein soll.


--

Martin Honnen
http://msmvps.com/blogs/martin_honnen/

Reply With Quote
  #4  
Old   
Chris Seidel
 
Posts: n/a

Default Re: HTML escapen - 10-06-2009 , 07:48 AM



On Tue, 06 Oct 2009 13:05:37 +0200, Martin Honnen <mahotrash (AT) yahoo (DOT) de>
wrote:

Quote:
onmouseover="showTip(event,
'&lt;script>alert(\'Test\')&lt;/script>', true)"

Ich hab es ja mal auf onmouseover="showTip(event,
'&lt;script&gt;XXX&lt;/script&gt;', true)" geändert.

Gibt keinen Fehler mehr. Wohl weil die ' um Test mit \ escapet sind.
Es ist also offensichtlich so, dass das escapete HTML vor der Übergabean
die JS-Funktion wieder unescapet wird.

Wie muss ich jetzt vorgehen, um beliebiges HTML in meinem Tooltip
anzuzeigen?

Der Tooltip ist ein DIV, welches ein DIV enthält, was ich so setze:

div.innerHTML = text;

Wenn text jetzt <script>xxx</script> ist, zeigt der natürlich nix mehran.
Hab es schon mit div.innerHTML = "<pre>" + text + "</pre>" versucht, hilft
auch nicht, wird nicht angezeigt.

Quote:
zumindest wenn das zweite Argument, das du an showTip übergeben willst,
eine einzelne Zeichenkette sein soll.
Ja soll es.

Hintergrund ist, dass ich prüfe, ob XSS verhindert wird. In der Datenbank
steht das gültige Javascript. Im HTML/Javascript darf das natürlich nur
escapet ankommen, damit XSS nicht möglich ist.

Reply With Quote
  #5  
Old   
Chris Seidel
 
Posts: n/a

Default Re: HTML escapen - 10-06-2009 , 07:51 AM



On Tue, 06 Oct 2009 13:01:13 +0200, Holger Jeromin <news01_2009 (AT) katur (DOT) de>
wrote:

Quote:
onmouseover="showTip(event,
'&lt;script>alert('Test')&lt;/script>', true)"

Dein Ziel sollte
showTip(event, '<script>alert("Test")</script>', true)
lauten.

Das beißt sich dann wieder mit den " des onmouseover Attributs.

Quote:
Der ganze Code sieht sehr fies aus.
Warum?

Quote:
Überlege, ob du das nicht anders viel eleganter lösen kannst.
Ja, wie denn?

Reply With Quote
  #6  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: HTML escapen - 10-06-2009 , 10:07 AM



Chris Seidel wrote:

Quote:
Martin Honnen wrote:
onmouseover="showTip(event,
'&lt;script>alert(\'Test\')&lt;/script>', true)"

Ich hab es ja mal auf onmouseover="showTip(event,
'&lt;script>XXX&lt;/script>', true)" geändert.

Gibt keinen Fehler mehr. Wohl weil die ' um Test mit \ escapet sind.
Es ist also offensichtlich so, dass das escapete HTML vor der Übergabe an
die JS-Funktion wieder unescapet wird.
Nein.

Der Attributwert ist (per DTD) vom Typ CDATA, folglich werden Entity-
Referenzen darin vom Markup-Parser "unescapet". D.h. in Deinem anfänglichen
Quelltext zu

onmouseover="showTip(event, '<script<alert('Test')</script>', true)"

und neu zu

onmouseover="showTip(event, '<script>alert(\'Test\')</script>', true)"

Der Attributwert wird dann so an die Script-Engine übergeben. Diese erkennt
dann \' innerhalb eines String-Literals (hier begrenzt mit <'>) als Escape-
Sequenz.

D.h. eben *weil* diese Ersetzung vor der Übergabe an die Script-Engine
stattfindet, funktioniert ersteres trotz gültigem Markup nicht, letzteres
hingegen schon. Funktioniert hätte somit auch z.B.

onmouseover="showTip(event, '<script>alert(&quot;Test&quot</script>',
true)"

denn die &quot; werden vor der Übergabe an die Script-Engine zu <">, wodurch
für den Markup-Parser das Markup gültig und sogar XML-wohlgeformt ist
(Attributwert korrekt begrenzt) und für die Script-Engine, welche davon nur

showTip(event, '<script>alert("Test")</script>', true)

sieht, ist es auch OK (String-Literal mit <'> korrekt begrenzt).

Hierzu gibt es aber Folgendes anzumerken:

1. Eben *weil* der Attributwert vom Typ CDATA ist, müssen in HTML `<'
und `>' darin _nicht_ durch (Character) Entity References ersetzt werden.
(Siehe oben.) In X(HT)ML muss jedoch wegen der Wohlgeformtheit das
Zeichen `<' (STAGO) durch `&lt;' ersetzt werden. (Der W3C-Validator
sagt sonst "Warning: character `<' is the first character of a delimiter
but occured as data" und "XML Parsing Error: Unescaped `<' not allowed
within attribute values.") Die Auszeichnungssprache ist hier also
entscheidend.

2. Das generierte Markup ist ungültig, dem SCRIPT/script-Element fe lt ein
type-Attribut (`type="text/javascript"' ist korrekt und wird am besten
unterstützt.)

3. Nirgendwo steht geschrieben, dass eingefügte SCRIPT/script-Elemente als
solche geparst werden müssen. Insbesondere nicht mit der proprietären
innerHTML-Eigenschaft (die für XHTML sowieso nichts taugt). Dein Ansatz
ist daher falsch.

Quote:
Wie muss ich jetzt vorgehen, um beliebiges HTML in meinem Tooltip
anzuzeigen?
Den Text hinschreiben; und zwar so, dass Benutzer auch ohne Script etwas
davon haben. Mein Ansatz (der auch ganz ohne Script funktioniert) war bzw.
ist, ein span-Kindelement einzufügen, welches nur bei a:hover angezeigt
wird. Sicher gibt es aber auch noch andere barrierefreie Möglichkeiten.

Quote:
Der Tooltip ist ein DIV, welches ein DIV enthält, was ich so setze:

div.innerHTML = text;
Was machen Nutzer ohne Script-Unterstützung?

Quote:
Hintergrund ist, dass ich prüfe, ob XSS verhindert wird. In der Datenbank
steht das gültige Javascript. Im HTML/Javascript darf das natürlich nur
escapet ankommen, damit XSS nicht möglich ist.
Lass den Käse mit `innerHTML' einfach sein, dann lösen sich viele Probleme
(so auch dieses) wie von selbst.


PointedEars

Reply With Quote
  #7  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: HTML escapen - 10-06-2009 , 10:28 AM



Kompliziertes Thema, hohe Felherwahrscheinlichkeit ...

Thomas 'PointedEars' Lahn wrote:

Quote:
Chris Seidel wrote:
Martin Honnen wrote:
onmouseover="showTip(event,
'&lt;script>alert(\'Test\')&lt;/script>', true)"

Ich hab es ja mal auf onmouseover="showTip(event,
'&lt;script>XXX&lt;/script>', true)" geändert.

Gibt keinen Fehler mehr. Wohl weil die ' um Test mit \ escapet sind.
Es ist also offensichtlich so, dass das escapete HTML vor der Übergabe
an die JS-Funktion wieder unescapet wird.

Nein.

Der Attributwert ist (per DTD) vom Typ CDATA, folglich werden Entity-
Referenzen darin vom Markup-Parser "unescapet". D.h. in Deinem
anfänglichen Quelltext zu

onmouseover="showTip(event, '<script<alert('Test')</script>', true)"
onmouseover="showTip(event, '<script>alert('Test')</script>', true)"

Quote:
[...] Funktioniert hätte somit auch z.B.

onmouseover="showTip(event, '<script>alert(&quot;Test&quot</script>',
true)"

denn die &quot; werden vor der Übergabe an die Script-Engine zu <">,
wodurch für den Markup-Parser das Markup gültig und sogar XML-wohlgeformt
^^^^^^^^^^^^^^^^^^^^^
ist (Attributwert korrekt begrenzt)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Letzteres stimmt nicht; die gegenteilige, richtige Aussage findet sich
weiter unten.

Quote:
[....]
1. Eben *weil* der Attributwert vom Typ CDATA ist, müssen in HTML `<'
und `>' darin _nicht_ durch (Character) Entity References ersetzt
werden.
(Siehe oben.) In X(HT)ML muss jedoch wegen der Wohlgeformtheit das
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^
Zeichen `<' (STAGO) durch `&lt;' ersetzt werden. [...]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Ich hoffe, ich habe damit entwirrt


PointedEars

Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.