Escape v javascriptu
- JakubKohout
- Člen | 92
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)
- Ondřej Mirtes
- Člen | 1536
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)
- JakubKohout
- Člen | 92
nene… bylo to {$message->subject|escape} … to ruční escapování jsem tam musel připsat, jinak to vypsalo na férovku htmlko…
- JakubKohout
- Člen | 92
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
- JakubKohout
- Člen | 92
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>“ ?
- Jan Tvrdík
- Nette guru | 2595
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)
- JakubKohout
- Člen | 92
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.
- Ola
- Člen | 385
Důvod, proč tomu tak není (a (asi) ani nebude), je popsán zde: https://phpfashion.com/…-javascriptu
- v6ak
- Člen | 206
PaBi3: URL javascript: je AFAIK zastaralé a je celkem možné, že se o to Nette nestará.
sin: HTML, nebo XHTML? Viz https://phpfashion.com/…-javascriptu
- Ondřej Mirtes
- Člen | 1536
To je furt o jednom a tom samém. Javascript se neescapuje stejně jako HTML.