The HTTP Content-Security-Policy
(CSP) style
-src
directive specifies valid sources for stylesheets.
CSP version | 1 |
---|---|
Directive type | Fetch directive |
default-src fallback | Yes. If this directive is absent, the user agent will look for the default-src directive. |
One or more sources can be allowed for the style-src
policy:
Content-Security-Policy: style-src <source>; Content-Security-Policy: style-src <source> <source>;
<source> can be one of the following:
'*'
), and you may use a wildcard (again, '*'
) as the port number, indicating that all legal ports are valid for the source.http://*.example.com
: Matches all attempts to load from any subdomain of example.com using the http:
URL scheme.mail.example.com:443
: Matches all attempts to access port 443 on mail.example.com.https://store.example.com
: Matches all attempts to access store.example.com using https:
.data:
Allows data:
URIs to be used as a content source. This is insecure; an attacker can also inject arbitrary data: URIs. Use this sparingly and definitely not for scripts.
mediastream:
Allows mediastream:
URIs to be used as a content source.blob:
Allows blob:
URIs to be used as a content source.filesystem:
Allows filesystem:
URIs to be used as a content source.'self'
blob
and filesystem
from source directives. Sites needing to allow these content types can specify them using the Data attribute.'unsafe-inline'
<script>
elements, javascript:
URLs, inline event handlers, and inline <style>
elements. You must include the single quotes.'unsafe-eval'
eval()
and similar methods for creating code from strings. You must include the single quotes.'none'
'unsafe-inline'
which could still be set for older browsers without nonce support.script-src
for external scripts.strict-dynamic
source expression specifies that the trust explicitly given to a script present in the markup, by accompanying it with a nonce or a hash, shall be propagated to all the scripts loaded by that root script. At the same time, any whitelist or source expressions such as 'self'
or 'unsafe-inline'
will be ignored. See script-src for an example.Given this CSP header:
Content-Security-Policy: style-src https://example.com/
the following stylesheets are blocked and won't load:
<link href="https://not-example.com/styles/main.css" rel="stylesheet" type="text/css" /> <style> #inline-style { background: red; } </style> <style> @import url("https://not-example.com/styles/print.css") print; </style>
as well as styles loaded using the Link
header:
Link: <https://not-example.com/styles/stylesheet.css>;rel=stylesheet
Inline style attributes are also blocked:
<div style="display:none">Foo</div>
As well as styles that are applied in Javascript by setting the style
attribute directly, or by setting cssText
:
document.querySelector('div').setAttribute('style', 'display:none;'); document.querySelector('div').style.cssText = 'display:none;';
However, styles properties that are set directly on the element's style
property will not be blocked, allowing users to safely manipulate styles via Javascript:
document.querySelector('div').style.display = 'none';
These types of manipulations can be prevented by disallowing Javascript via the script-src
CSP directive.
Note: Disallowing inline styles and inline scripts is one of the biggest security wins CSP provides. However, if you absolutely have to use it, there are a few mechanisms that will allow them.
To allow inline styles, 'unsafe-inline'
, a nonce-source or a hash-source that matches the inline block can be specified.
Content-Security-Policy: style-src 'unsafe-inline';
The above Content Security Policy will allow inline styles like the <style>
element, and the style
attribute on any element:
<style> #inline-style { background: red; } </style> <div style="display:none">Foo</div>
You can use a nonce-source to only allow specific inline style blocks:
Content-Security-Policy: style-src 'nonce-2726c7f26c'
You will have to set the same nonce on the <style>
element:
<style nonce="2726c7f26c"> #inline-style { background: red; } </style>
Alternatively, you can create hashes from your inline styles. CSP supports sha256, sha384 and sha512.
Content-Security-Policy: style-src 'sha256-a330698cbe9dc4ef1fb12e2ee9fc06d5d14300262fa4dc5878103ab7347e158f'
When generating the hash, don't include the <style>
tags and note that capitalization and whitespace matter, including leading or trailing whitespace.
<style>#inline-style { background: red; }</style>
The 'unsafe-eval'
source expression controls several style methods that create style declarations from strings. If 'unsafe-eval'
isn't specified with the style-src
directive, the following methods are blocked and won't have any effect:
Specification | Status | Comment |
---|---|---|
Content Security Policy Level 3 The definition of 'style-src' in that specification. | Working Draft | No changes. |
Content Security Policy Level 2 The definition of 'style-src' in that specification. | Recommendation | Initial definition. |
Desktop | ||||||
---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | |
Basic support | 25 | 14 | 23 | No | 15 | 7 |
Mobile | |||||||
---|---|---|---|---|---|---|---|
Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | iOS Safari | Samsung Internet | |
Basic support | Yes | Yes | ? | 23 | ? | 7.1 | Yes |
Content-Security-Policy
Link
header<style>
, <link>
@import
CSSStyleSheet.insertRule()
CSSGroupingRule.insertRule()
CSSStyleDeclaration.cssText
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src