Escape v javascriptu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
JakubKohout
Člen | 92
+
0
-

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
+
0
-

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
+
0
-

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

redhead
Člen | 1313
+
0
-

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..

JakubKohout
Člen | 92
+
0
-

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

Ola
Člen | 385
+
0
-

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)

JakubKohout
Člen | 92
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

David Grudl
Nette Core | 8108
+
0
-

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

PaBi3
Bronze Partner | 62
+
0
-

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)

sin
Člen | 82
+
0
-

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});
v6ak
Člen | 206
+
0
-

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
+
0
-

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