Unfortunately, you can't implement CSP that way.  Consider the case of
two same-origin iframes A and B.  Suppose A has a restrictive CSP
policy (say that bans everything) and B doesn't.  If B uses the DOM to
insert a script element into A, then CSP should block that script
element from executing.  Stripping script tags at parse time won't.

Adam


On Sun, Mar 17, 2013 at 8:26 PM, Geoffrey Garen <gga...@apple.com> wrote:
> Hi folks.
>
> Currently, we have two different ways to disable JavaScript execution:
>
> (1) Paste / Drag n Drop / editing: Remove script elements and script 
> attributes from untrusted source markup at parse time.
>
> (2) JavaScript disabled setting / Content Security Policy: Check settings 
> and/or CSP at runtime.
>
> There are problems with mode (2):
>
> * It breaks features that are implemented in JavaScript.
>
> The Web Inspector, bookmarklets, extensions, Safari Reader, and Safari 
> autofill all run JavaScript. This means that they break when users disable 
> JavaScript.
>
> As a defense against phishing attacks, mail clients and other web content 
> readers disable JavaScript. This means that they can't implement pieces of 
> their UI in JavaScript.
>
> (FWIW, WebKit violates the CSP specification in this regard: "Enforcing a CSP 
> policy should not interfere with the operation of user-supplied scripts such 
> as third-party user-agent add-ons and JavaScript bookmarklets.")
>
> * It subjects users to XSS attacks.
>
> Runtime checking mode leaves inert JavaScript in the untrusted document. This 
> is a risky proposition. Operations that clone or adopt nodes from the 
> untrusted document unwittingly re-vivify that inert JavaScript, subjecting 
> the user to attack. Experience shows that this is a difficult programming 
> model to get right.
>
> * It's hard to verify.
>
> We have 18 different call sites to canExecuteScripts() in WebKit, not 
> counting the call sites that pertain to plug-ins. Are you confident we've 
> caught all the right places? Do you know if the feature you just added needs 
> to call canExecuteScripts()?
>
> * It's two different ways to do the same thing.
>
> Simplicity is a goal of the WebKit project.
>
>
> Proposal:
>
> If -- for any reason -- JavaScript is disabled in a given document, the 
> document parser will elide all JavaScript. This means that runtime checks can 
> be removed.
>
> One potential downside to this proposal is that it changes the document's 
> internal structure. Since the changes are not generally observable, since 
> they only take place when we're already making much bigger changes by 
> preventing whole scripts from running, and since we haven't seen any 
> compatibility problems from our paste / drag n drop / editing behavior in 
> this regard, I think this downside is acceptable.
>
> Another potential downside is that CSP errors will be reported at parse time 
> instead of runtime. FWIW, some authors might see this as an upside.
>
> Any objections?
>
> Thanks,
> Geoff
> _______________________________________________
> webkit-dev mailing list
> webkit-dev@lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-dev
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to