I am using an external JavaScript lib in my chrome extension.
I has inline execution, so I get following kind of error
(The error I get on console)
Refused to execute JavaScript URL because it violates the following
Content Security Policy directive: "script-src 'self'
chrome-extension://". Either the 'unsafe-inline' keyword, a hash
('sha256-...'), or a nonce ('nonce-...') is required to enable inline
execution.
The error message clearly says there is a work-around possible.
Chrome-Content Security Policy says not possible. Many related question cited this link.
Blog This blogger says it is possible, but probably this is applicable to only older chrome extension.
Any work around possible?
PS: don't wanna/can't change the entire library I am using.
EDIT: how to use hash or nonce to enable inline execution.
No, this is not possible to relax this policy. unsafe-inline
is specifically ignored by Chrome Extensions since manifest version 2.
Documentation (emphasis mine):
There is no mechanism for relaxing the restriction against executing inline JavaScript. In particular, setting a script policy that includes 'unsafe-inline' will have no effect.
The error message mentions several possible ways, but the docs are clear that no CSP will allow inline scripting, and ignoring unsafe-inline
is but one of the measures.
Update
As of Chrome 46, inline scripts can be whitelisted by specifying the base64-encoded hash of the source code in the policy. This hash must be prefixed by the used hash algorithm (sha256, sha384 or sha512). See Hash usage for elements for an example.
See this answer for more in-depth look at whitelisting.
Copied from my answer to a similar question here. For recent versions of Chrome (46+) the current answer is no longer true. unsafe-inline
still has no effect (in both the manifest and in meta
header tags), but per the documentation, you can use the technique described here to relax the restriction.
Hash usage for <script>
elements
The script-src
directive lets developers whitelist a particular inline script by specifying its hash as an allowed source of script.
Usage is straightforward. The server computes the hash of a particular script block’s contents, and includes the base64 encoding of that value in the Content-Security-Policy
header:
Content-Security-Policy: default-src 'self';
script-src 'self' https://example.com 'sha256-base64 encoded hash'
As an example, consider:
manifest.json:
{
"manifest_version": 2,
"name": "csp test",
"version": "1.0.0",
"minimum_chrome_version": "46",
"content_security_policy": "script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='",
"background": {
"page": "background.html"
}
}
background.html:
<!DOCTYPE html>
<html>
<head></head>
<body>
<script>alert('foo');</script>
</body>
</html>
Result:
I also tested putting the applicable directive in a meta
tag instead of the manifest. While the CSP indicated in the console message did include the content of the tag, it would not execute the inline script (in Chrome 53).
new background.html:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='">
</head>
<body>
<script>alert('foo');</script>
</body>
</html>
Result: