Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Latte: Incorrect context-aware escaping for <script> #705

Closed
Majkl578 opened this issue Jul 22, 2012 · 8 comments

Comments

Projects
None yet
4 participants
@Majkl578
Copy link
Contributor

commented Jul 22, 2012

If someone wants to use <script> for non-javascript things, its content will be escaped incorrectly. Consider an example, where script content is used as a template for latter javascript processing (e.g. replacing some placeholders and then inserting into DOM):

<script id="foo" type="text/x-something">
    {$foo}
</script>

$foo will now be incorrectly escaped as a Javascript code (output will be quoted and escaped), not as a regular HTML code.

I suggest fixing this behavior by treating <script> tag's contents as a Javascript code only if the type parameter is either text/javascript or nothing.

@hrach

This comment has been minimized.

Copy link
Contributor

commented Jul 22, 2012

Agreed.

@fprochazka

This comment has been minimized.

Copy link
Contributor

commented Jul 22, 2012

There are more alternatives http://annevankesteren.nl/2006/05/javascript-mime-type but agreed.

@dg

This comment has been minimized.

Copy link
Member

commented Jul 25, 2012

Obsah elementu SCRIPT se nikdy neescapuje jako HTML, ať už je typ jakýkoliv. Nescapovat jako prosty text taky není vhodné, protože se uvnitř nesmí objevit </script>. Což JavaScriptové escapování řeší.

@Majkl578

This comment has been minimized.

Copy link
Contributor Author

commented Jul 25, 2012

Proč by se uvnitř nesměl objevit prostý text, když se nejedná o Javascriptový kód? To, jak se SCRIPT vyhodnotí, přeci určuje jeho atribut type, pokud jako type bude text/html, neprovede se jako Javascript, přeskočí se.
Existuje hned několik knihoven podporující templaty v Javascriptu touto cestou, namátkou (odkaz přímo na example) jquery-tmpl, KiTE, ICanHaz.js, Luquid.js, Knockout.
Pokud tedy SCRIPT použijeme jako HTML template (a ne jako inline zápis Javascriptu), pak by se i vkládaný obsah měl escapovat dle pravidel aktuálního kontextu (jímž je HTML), ne dle pravidel Javascriptu, který se zde vůbec nepoužívá.

Nebo to snad všechny výše zmíněné knihovny dělají špatně a nebezpečně?

@dg

This comment has been minimized.

Copy link
Member

commented Jul 26, 2012

Uvnitř elementu SCRIPT se znaky <, > nebo & píší normálně, ne jako entity. Jen se tam nesmí se objevit </script. Tudíž kontext není HTML, ale ani prostý text.

@Majkl578

This comment has been minimized.

Copy link
Contributor Author

commented Aug 5, 2012

Tvůj poslední komentář mi docela vrtá hlavou. Proč by se tam nesměl objevit </script? Pokud je původní kontext HTML a i script má kontext HTML, po jeho ukončení bude opět jen HTML. Kontext se tedy nemění a celý SCRIPT se dá považovat za obyčejný HTML tag. Jediný potenciální problém, který mě napadl, je možné vyhodnocení normálního <script> uvnitř template verze, ten se ale nevykoná:

<script type="text/x-template">
    <script>alert(1);</script>
</script>
@dg

This comment has been minimized.

Copy link
Member

commented Aug 6, 2012

Zkus si schválně vypsat textový obsah toho vnějšího elementu SCRIPT. Bude tam chybět koncová značka vnitřního SCRIPT.

@dg

This comment has been minimized.

@dg dg closed this Mar 30, 2013

dg added a commit to nette/latte that referenced this issue Jun 13, 2014

dg added a commit to nette/latte that referenced this issue Jun 13, 2014

dg added a commit to nette/latte that referenced this issue Jun 13, 2014

dg added a commit to nette/latte that referenced this issue Jun 13, 2014

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.