#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: ""><h1>Ahoj<\/h1>",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
#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


