gpt4 book ai didi

google-chrome - Chrome 版本 18+ : How to allow inline scripting with a Content Security Policy?

转载 作者:行者123 更新时间:2023-12-03 09:08:10 26 4
gpt4 key购买 nike

Chrome 18 Dev/Canary 刚刚发布, content_security_policy 对于某些扩展, list 中将需要。

我正在尝试让 CSP 用于内联脚本,但我不知道我是否做错了什么,或者这是否是 Chrome 18 的错误。

manifest.json:

{
"name": "CSP Test",
"version": "1.0",
"manifest_version": 2,
"options_page": "test.html",
"content_security_policy": "default-src 'unsafe-inline'"
}

测试.html:
<html><head>
<script type="text/javascript">
alert("hello");
</script>
</head></html>

在 Chrome 18 中,这个解压后的扩展加载失败,显示错误:

Could not load extension from '[extension directory]'. Invalid value for 'content_security_policy'.

如果我改变 'unsafe-inline''self' ,扩展加载正常,但 alert()不起作用,并且选项页面的控制台包含错误:

Refused to execute inline script because of Content-Security-Policy.



在 Chrome 16 中,使用 'unsafe-inline'让扩展加载正常, alert()也有效。但是,在 Chrome 16 中,替换 'unsafe-inline''foo'让扩展加载,但当然不会让 alert()工作,所以也许 Chrome 18 比 16 更严格,但是......

default-src 'unsafe-inline'实际上无效,还是这是一个错误?我可以使用什么 CSP 值来制作 alert()在 Chrome 18 中工作?

根据下面接受的答案,内联脚本不再适用于 Chrome 18 的扩展。 alert()将需要放在它自己的 JavaScript 文件中。

最佳答案

对于最新版本的 Chrome (46+),之前接受的答案不再正确。 unsafe-inline仍然没有影响(在 list 和 meta header 标签中),但根据 documentation ,您可以使用描述的技术 here放宽限制。

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'
例子
考虑以下:
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>
结果 :
alert dialog from inline script
进一步的调查
我还测试将适用的指令放入 meta标签而不是 list 。虽然控制台消息中指示的 CSP 确实包含标签的内容,但它不会执行内联脚本(在 Chrome 53 中)。
新品 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>
结果 :
console error messages about content security policy
附录:生成哈希
这里有两种生成哈希的方法:
  • Python(将 JS 传递给 stdin,通过管道将其传送到其他地方):

  • import hashlib
    import base64
    import sys

    def hash(s):
    hash = hashlib.sha256(s.encode()).digest()
    encoded = base64.b64encode(hash)
    return encoded

    contents = sys.stdin.read()
    print(hash(contents))
  • 在 JS 中,使用 Stanford Javascript Crypto Library :

  • var sjcl = require('sjcl');
    // Generate base64-encoded SHA256 for given string.
    function hash(s) {
    var hashed = sjcl.hash.sha256.hash(s);
    return sjcl.codec.base64.fromBits(hashed);
    }
    确保在对 的内联脚本进行哈希处理时整体包含脚本标记的内容(包括所有前导/尾随空格)。如果你想把它合并到你的构建中,你可以使用类似 cheerio 的东西。获取相关部分。一般来说,对于任何 html , 你可以做:
    var $ = cheerio.load(html);
    var csp_hashes = $('script')
    .map((i, el) => hash($(el).text())
    .toArray()
    .map(h => `'sha256-${h}'`)
    .join(' ');
    var content_security_policy = `script-src 'self' 'unsafe-eval' ${csp_hashes}; object-src 'self'`;
    这是 hash-csp中使用的方法,一个用于生成哈希的 gulp 插件。

    关于google-chrome - Chrome 版本 18+ : How to allow inline scripting with a Content Security Policy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8502307/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com