#1 8. 2. 2010 23:51

dRaGen
Člen
Místo: Praha / Klášterec nad Ohří
Registrovaný: 1. 8. 2009
Příspěvky: 94

Escape v javascriptu

Nemělo by Nette v šablonách escapovat i co se týče javascriptu ? Teď mi byla reportována vcelku velká XSS díra, díky tomu, že jsem si nevšiml, že nette nedělá escape v JS šablonách

$('#messageId-{!$message->id}').dialog({ autoOpen: false,stack: false, title: {$message->subject|escape},closeOnEscape: true});

myslím že by ve výchozím stavu měl radši escapovat. Vypnout se to dá vždycky, ale málokdo si to uvědomí ;)

Editoval dRaGen (8. 2. 2010 23:51)

Offline

 

#2 8. 2. 2010 23:59

Ondřej Mirtes
Moderator
Místo: Praha
Registrovaný: 8. 1. 2009
Příspěvky: 1410
Web

Re: Escape v javascriptu

Nette escapuje Javascript, dokonce má kontextově-sensitivní escapování (v Javascriptu escapuje jinak, než jinde).

Že by byl problém v téhle proměnné? :o) {!$message->id} Vykřičník znamená právě vypnutí escapování :o)

Offline

 

#3 9. 2. 2010 0:01

dRaGen
Člen
Místo: Praha / Klášterec nad Ohří
Registrovaný: 1. 8. 2009
Příspěvky: 94

Re: Escape v javascriptu

nene… bylo to {$message->subject|escape} … to ruční escapování jsem tam musel připsat, jinak to vypsalo na férovku htmlko…

Offline

 

#4 9. 2. 2010 0:12

redhead
Nette guru
Registrovaný: 2. 5. 2009
Příspěvky: 769

Re: Escape v javascriptu

nemyslí dRaGen js šablony jako .js soubory??

tam to asi možná fakt nepůjde, páč není kód ohraničen <script> tagy. Ale jen hádám..

Offline

 

#5 9. 2. 2010 0:27

dRaGen
Člen
Místo: Praha / Klášterec nad Ohří
Registrovaný: 1. 8. 2009
Příspěvky: 94

Re: Escape v javascriptu

ne… čistě phtml šablona.

<script type="text/javascript">
$(document).ready(function(){
{foreach (array)$messages as $message}
        $('#messageId-{!$message->id}').dialog({ autoOpen: false,stack: false, title: {$message->subject|escape},closeOnEscape: true});
{/foreach}
});
</script>

v tomhle případě je normálně na výstupu escaped

$('#messageId-1266').dialog({ autoOpen: false,stack: false, title: "&quot;&gt;&lt;h1&gt;Ahoj&lt;\/h1&gt;",closeOnEscape: true});

bohužel když je to samotné vypsání $message->subject, bez |escape tak to vypíše čiště

$('#messageId-1266').dialog({ autoOpen: false,stack: false, title: "\"><h1>Ahoj<\/h1>",closeOnEscape: true});

což není dobře

Offline

 

#6 9. 2. 2010 0:30

Ondřej Mirtes
Moderator
Místo: Praha
Registrovaný: 8. 1. 2009
Příspěvky: 1410
Web

Re: Escape v javascriptu

Offline

 

#7 9. 2. 2010 3:38

Ola
Nette guru
Registrovaný: 21. 10. 2008
Příspěvky: 477

Re: Escape v javascriptu

Co na "\"><h1>Ahoj<\/h1>" není dobře?

EDIT: AHA! Tobě jde o to že v dialogu se to vypíše neescapovaně, že? To ale není chyba nette, nýbrž toho dialogu – on to chápe jako HTML a ne jako javascript.

Editoval Ola (9. 2. 2010 3:41)

Offline

 

#8 9. 2. 2010 7:16

dRaGen
Člen
Místo: Praha / Klášterec nad Ohří
Registrovaný: 1. 8. 2009
Příspěvky: 94

Re: Escape v javascriptu

Ano pravděpodobně na to použije innerHTML, takže se to objeví v HTML kódu. Dle mého názoru to neni chyba toho dialogu, co když bych si chtěl vypsat „Název <strong>dialogu</strong>“ ?

Offline

 

#9 9. 2. 2010 10:36

Jan Tvrdík
Nette guru
Místo: Prostějov
Registrovaný: 13. 4. 2008
Příspěvky: 635
Web

Re: Escape v javascriptu

Přeletěl jsem to tady jen letmo, ale zkus

$('#messageId-' + {$message->id}) a {!$message->subject|escapeJs}

Obecně platí, že {$var} = magické escapování s umělou inteligencí (něco jako autopilot v letadlech). Pokud automatika selže, je třeba přepnout na manuál {!$var} a escapovat to ručně (např. {!$var->subject|escapeJs|escapeHtml}).

Editoval Jan Tvrdík (9. 2. 2010 15:14)

Offline

 

#10 9. 2. 2010 21:29

dRaGen
Člen
Místo: Praha / Klášterec nad Ohří
Registrovaný: 1. 8. 2009
Příspěvky: 94

Re: Escape v javascriptu

Jan Tvrdík napsal(a):

Přeletěl jsem to tady jen letmo, ale zkus

$('#messageId-' + {$message->id}) a {!$message->subject|escapeJs}

Obecně platí, že {$var} = magické escapování s umělou inteligencí (něco jako autopilot v letadlech). Pokud automatika selže, je třeba přepnout na manuál {!$var} a escapovat to ručně (např. {!$var->subject|escapeJs|escapeHtml}).

Problém je v tom, že když selže tak to nezjistíš, jako se to stalo mě. Proto by dle mého názoru nette mělo mít htmlspecialchars i pro javascript. Tak nějak jsem si automaticky zvykl, že pokud napíšu {$foo}, tak je to převedeno na entity.

Offline

 

#11 9. 2. 2010 22:30

Ola
Nette guru
Registrovaný: 21. 10. 2008
Příspěvky: 477

Re: Escape v javascriptu

Důvod, proč tomu tak není (a (asi) ani nebude), je popsán zde: http://phpfashion.com/…-javascriptu

Offline

 

#12 10. 2. 2010 10:45

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 4236
Web

Re: Escape v javascriptu

Nette neselže. Chyba je ve vaší aplikaci ;)

Offline

 

#13 10. 2. 2010 12:45

PaBi3
Člen
Místo: Bratislava
Registrovaný: 27. 3. 2009
Příspěvky: 42

Re: Escape v javascriptu

Toto je v poriadku? Očakával by som, aby ten prvý riadok generoval kód, ako ten druhý.

<a href="javascript:alert({$test})">test</a>
<a href="javascript:alert({$test|escapeJs})">test</a>

Editoval PaBi3 (10. 2. 2010 12:57)

Offline

 

#14 10. 2. 2010 14:42

sin
Člen
Registrovaný: 29. 7. 2009
Příspěvky: 79

Re: Escape v javascriptu

Narazil jsem tedka na to, že kdyz se mi escapuje url v JS tak se mi neoscapuje & a pak je to nevalidní.

$.get({link add!}, {'foo' : 'bar'});
$.get("\/baseuri\/?action=seznam&do=add&presenter=Default", {'foo' : bar});

Offline

 

#15 10. 2. 2010 15:26

v6ak
Člen
Registrovaný: 1. 5. 2008
Příspěvky: 148

Re: Escape v javascriptu

PaBi3: URL javascript: je AFAIK zastaralé a je celkem možné, že se o to Nette nestará.

sin: HTML, nebo XHTML? Viz http://phpfashion.com/…-javascriptu

Offline

 

#16 10. 2. 2010 15:27

Ondřej Mirtes
Moderator
Místo: Praha
Registrovaný: 8. 1. 2009
Příspěvky: 1410
Web

Re: Escape v javascriptu

To je furt o jednom a tom samém. Javascript se neescapuje stejně jako HTML.

Offline

 

Zápatí