Escapování javascriptu v šablonách
- Filip Procházka
- Moderator | 4668
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
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
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 | 8227
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
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)