Escapování javascriptu v šablonách

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

Chtěl bych navázat na předchozí téma a podělit se o pár myšlenek. Latte prostě neumí Javascript a ani by ho umět nemělo, to je fakt. Je třeba tedy rozhodnout, na jaké úrovni by se tohle mělo řešit. Vyprovokoval mě k tomu tenhle článek.

Můžeme to více zdůraznit v dokumentaci

V sekci o šablonách není nikde dostatečně vysvětleno, že by se měl používat unobstructive javascript. Jedna cesta tedy, je pořádně to vysvětlit :)

Co takhle vyhodit notice s upozornením pro programátora, že „Latte neumí javascript?“

<script>
var someHtml = {$someHtml};
// notice: Latte neumí javascript, zvol prosím ručně, jak chceš proměnnou escapovat

Byl by to nenásilný způsob, jak donutit programátora se rozhodnout, co s daty v proměnné chce udělat. Tedy jednou – při kompilaci, by se vyhodila notice (na produkci by to prošlo) a doplnilo by se výchozí escapeJs.

Účelem je, donutit programátora, aby napsal buď

var someHtml = {$someHtml|escapeJs};

nebo

var someHtml = {$someHtml|escapeHtml|escapeJs};

Tohle je opravdu jenom nápad o který jsem se chtěl podělit a když si to teď po sobě čtu, tak už se mi to ani moc nelíbí, ale myslím si, že alespoň něco by se s tím udělat mělo.

Editoval HosipLan (18. 6. 2012 14:43)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Spíš bych vyhodil „Javascript není HTML, pozor! Latte tudíž nemůže odhadnout, co chceš s proměnnou udělat. Pokud je v ní HTML, musíš si ho už oescapovat ručně.“, a to bych dal spíš jako tu zmínku do dokumentace, než jako notice.

Honza Marek
Člen | 1664
+
0
-

HosipLan napsal(a):

Byl by to nenásilný způsob, jak donutit programátora se rozhodnout, co s daty v proměnné chce udělat.

Až na ten BC break jak prase.

David Grudl
Nette Core | 8136
+
0
-

Nechal ses jen zmást demagogií Bradyho, který nedokáže rozdýchat Latte.

Latte pochopitelně umí JavaScript. var someHtml = {$someHtml} funguje naprosto korektně, pokud someHtml obsahuje skutečně „some HTML“.

Pokud budu chtít escapovat var someHtml = '<b>' + {$someText} + '</b>', tak to je samozřejmě špatně, nicméně to nelze automaticky řešit. Tohle totiž vůbec není o kontextu a nesouvisí to s kontextově senzitivním escapováním.

V takovém případě prostě napíšu var someHtml = '<b>' + {$someText|escapeHtml} + '</b>'.

V dokumentaci by tento příklad určitě chybět neměl. Latte se ale chová korektně.

Filip Procházka
Moderator | 4668
+
0
-

To že javascript umí vím, ale kvalitně mě zmátl s tím html :)

Tedy výborně, díky za uklidnění, jdeme doplnit dokumentaci! :)

Editoval HosipLan (18. 6. 2012 15:36)