yalabot / angular-foundation

http://pineconellc.github.io/angular-foundation/
Other
1.05k stars 266 forks source link

fix(modal): Fix use of inline styles for Content Security Policy #310

Open farrago opened 7 years ago

farrago commented 7 years ago

Summary

Inline styles are not allowed under CSP, so this replaces the inline styles used by $modalStack with calls to angular.element.css()

Details

$modalStack.open creates two divs directly with angular.element, and both divs have inline style elements (i.e. '<div style="...">').

If Content Security Policy (CSP) is enabled, these inline styles cannot be applied and cause errors. e.g. in chrome:

[Report Only] Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-xHgdoELGuMXNdMeJ4PQkbzZpH1rlmZwpY3b56d2ZvpI='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.

This is fixed by replacing the inline styles with calls to angular.element.css() (which boils down to HTMLElement.style.foo = bar;) as this does not trigger the inline styles violation.

Browser: Chrome 52.0.2743.116 m (up to date), plus same result in Firefox, Edge, etc. OS: Windows 10 Server: NodeJS 4.4.3 CSP Headers: content-security-policy-report-only: default-src 'self'; report-uri /api/v0/csp-report (This reports but doesn't prevent violations of the policy while debugging rules).

Notes

As per the error reported by Chrome, this could theoretically be worked around by using 'unsafe-inline' but this is, as named, unsafe. It could also be worked around with a hash for each case but that isn't well supported by browsers yet, and there are a lot of different cases that would need a hash for each one. Nonces are even harder to use with library code.

Test Plan:

farrago commented 7 years ago

I should mention that the default templates also use inline styles which will cause CSP violations.

For a fully CSP-compliant result you will also have to use your own replacement templates that don't use inline styles and instead set the styling through your application's own CSS.