- From: Ian Hickson <ian@hixie.ch>
- Date: Mon, 11 Mar 2013 19:38:01 +0000 (UTC)
- To: Mike Samuel <mikesamuel@gmail.com>
- cc: "public-script-coord@w3.org" <public-script-coord@w3.org>
On Mon, 11 Mar 2013, Mike Samuel wrote:
> >
> > E4H is much simpler than E4X, actually:
> >
> > http://www.hixie.ch/specs/e4h/strawman
> >
> > It's just a small syntax extension to JS. (It doesn't involve an HTML
> > parser, in fact it doesn't involve any parser at all other than the JS
> > parser, which is why it gives compile-time syntax checking.)
>
> How does it deal with XSS via CSS, URIs, VBScript, etc. without
> involving parsers for those languages?
>
> What happens with
>
> <><a href="{data}">Hello, World!</a></>
>
> when data is "javascript:doEvil()"?
Exactly what you expect, you get a JS link.
> What happens with
>
> <><style>color: {data}</style></>
>
> when data is "expression(doEvil())"?
You get some invalid CSS.
> What happens with injection into a script?
>
> <><script>var s = "{data}", re = /{data}/, x = {data};</script></>
>
> ?
Same as with an eval and string concatenation.
It's not magic. Magic is bad, especially around security features. Authors
need to be able to understand the model precisely, and therefore it needs
to be a simple model that they can easily reason about.
Autoescaping mechanisms are a disaster. Simple changes to the source code
that look like no-ops end up introducing security vulnerabilities or
breaking the logic because suddenly the autoescaper has different context.
Authors end up not thinking about exactly what it is they're doing,
leading to overconfidence and injection vulnerabilities where the
autoescaper has no idea what's going on. Backwards-compatibility means
that mistakes in the first release of the autoescaper can't be fixed
without opt-in, which leads to a series of "yes I really want this to be
secure" boilerplate after a few revisions. It's just way safer to be
explicit and have a simple model.
If you want to inject a string into a regular expression, you know you
have to escape the string for regexps and then insert it. If you want to
insert a string A into a regular expression and then insert the regular
expression into a CSS string and then insert the CSS string into a the
query part of a URL, you know you have to escape the string A for regular
expressions, then escape the regular expression for CSS strings, then
escape the CSS string for the query part of URLs. No autoescaping
mechanism can magically know what you're doing in cases like this.
--
Ian Hickson U+1047E )\._.,--....,'``. fL
http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
Received on Monday, 11 March 2013 19:38:24 UTC