javascript - Microsoft Edge 不接受内容安全策略的哈希

标签 javascript css security content-security-policy microsoft-edge

问题

Content-Security-Policy 应该默认将脚本和样式解析列入黑名单,并允许它基于各种指令来验证预期输出的哈希值。浏览器必须无法实现任何未预先提供匹配哈希的 Javascript 或 CSS。具有匹配散列的代码应正常执行。 Microsoft Edge 拒绝所有 JS/CSS 页内 block 。

演示原始源码

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='; script-src https://ajax.googleapis.com 'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc=';" />
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; style-src 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='; script-src https://ajax.googleapis.com 'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc=';" />
<style>#loading{color:transparent}#loading:after{color:green;content:"Style loaded."}</style>
</head>
<body>
<span id="loading">Hashes loading...</span>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>alert("Script loaded.")</script>
  • 预期行为:正文应更改为“样式已加载”,警告框应显示“脚本已加载”,外部 Javascript 不应抛出错误。控制台显示没有问题。
  • 实际行为:正文停留在“哈希加载...”。哈希值被拒绝,外部 Javascript 被接受。控制台显示错误:

CSP14304:对于指令“style-src”的未知来源“sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA=”将被忽略。

CSP14306:没有为指令“style-src”提供源 - 这等同于使用“none”并将阻止下载该类型的所有资源。

CSP14304:对于指令“script-src”的未知来源“sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc=”将被忽略。

CSP14312:内联样式中的资源违反指令‘style-src‘sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA=’’。资源将被阻止。

CSP14312:资源违反指令 'script-src LINK-REMOVED-INSUFFICIENT-REPUTATION-ON-STACKOVERFLOW-SHOULD-BE-THE-GOOGLE-API-URL 'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc='' : 内联脚本。资源将被阻止。

尝试修复

  • 验证哈希值是否正确:双重检查计算是二进制的,仅此而已。没什么可做的,其他浏览器正在接受它们。
  • 更改值 default-srcconnect-srcself 而不是 none

我想不出还有什么可以尝试的。

24 小时后更新:为完整性添加了 X-Content-Security-Policy 并更新了 JSBin URL,尽管它对这种特殊情况没有影响。

最佳答案

编辑:这可能不正确。请参阅上面的评论。

IE 11 不支持Content-Security-Policy(仅支持X-Content-Security-Policy),打开失败。 IE 12 支持 CSP,但不支持 nonces/hashes,它无法关闭...除非您还在 Content-Security-Policy header 中提供 'unsafe-inline' .

CSP 级别 2 表示“如果提供了哈希或随机数,请忽略 'unsafe-inline'。”这是为了向后兼容,因为旧版浏览器会理解 'unsafe-inline' 但不会理解 nonces/hashes。参见 http://www.w3.org/TR/CSP2/#directive-script-src

关于javascript - Microsoft Edge 不接受内容安全策略的哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31720023/

相关文章:

javascript - Angular 嵌套指令未编译

css - 使 CSS3 微调器大小匹配元素一

php - 进入时打开的 HTML 5 灯箱

javascript - 使用 .NET 在 SPA 中保护 HTML 和 JS 文件

javascript - 如何修复 Node 中的 'parsing error: Unexpected token =>'?

javascript - 在javascript中隐藏表格页面

javascript - 对话框和自动高度

c - 抑制警告 : the use of `mktemp' is dangerous

symfony - "form_login"下无法识别的选项 "security.firewalls.main"

javascript - 从数组中获取随机元素返回相同的元素