【问题标题】:Microsoft Edge not accepting hashes for Content-Security PolicyMicrosoft Edge 不接受内容安全策略的哈希值
【发布时间】:2015-07-30 09:30:29
【问题描述】:

问题

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

演示原始源代码

<!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 不应引发错误。控制台显示没有问题。
  • 实际行为: Body 卡在“Hashes loading...”上。哈希被拒绝,外部 Javascript 被接受。控制台显示错误:

CSP14304: Unknown source ‘'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='’ for directive ‘style-src’ in - source will be ignored.

CSP14306: No sources given for directive ‘style-src’ for - this is equivalent to using ‘none’ and will prevent the downloading of all resources of this type.

CSP14304: Unknown source ‘'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc='’ for directive ‘script-src’ in - source will be ignored.

CSP14312: Resource violated directive ‘style-src 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='’ in : inline style. Resource will be blocked.

CSP14312: Resource violated directive ‘script-src LINK-REMOVED-INSUFFICIENT-REPUTATION-ON-STACKOVERFLOW-SHOULD-BE-THE-GOOGLE-API-URL 'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc='’ in : inline script. Resource will be blocked.

尝试修复

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

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

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

【问题讨论】:

  • Internet Explorer 支持这个吗?
  • 您应该使用实际的 http 标头。
  • 你试过style-src self 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='style-src URL_OF_YOUR_PAGE 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='吗?
  • @Daniel A. White - IE11 中不会出现该问题。页面是动态创建的,然后在服务器端缓存,因此无法使用 http-headers。但是,如果它们也曾经从客户端缓存中加载,您可能会希望页面中的标题。应该没什么区别,浏览器显然可以很好地处理它。
  • @ben 是的,域而不是 self 没有帮助。我确定这应该只应用于单独的请求。

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


【解决方案1】:

编辑:这可能不正确。见上面的 cmets。

IE 11 不支持Content-Security-Policy(仅X-Content-Security-Policy),打开失败。 IE 12 支持 CSP,但不了解随机数/哈希,它无法关闭...除非您还在 Content-Security-Policy 标头中提供 'unsafe-inline'

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

【讨论】:

  • 解释可能不太靠谱,但添加 'unsafe-inline' 是解决方案。我不知道它会优雅地降级,至少该站点可以再次运行。我不认为有任何解释,我猜是无意的特征回归。我已将其报告为错误,感谢您的参与。
【解决方案2】:

http://caniuse.com/#feat=contentsecuritypolicy

http://caniuse.com/#feat=contentsecuritypolicy2

IE Edge 不支持 2 级内容安全策略,hash-source 属于 2 级。

【讨论】:

  • 这可能是解释,但该示例在 IE11 中正常工作,因此信息过于宽泛或部分缺失。我不知道 Edge 是如何产生的,它是否可能从 IE11 分支而来实施了 CSP 哈希?
  • @StackOverflowAcc 我从第一个链接读到的是 IE 支持 X-Content-Security-Policy 标头,你可以试一试。
  • 这只是 IE10-11。不过好点,我已经同时使用了这两种方法,但忘记将其包含在我的提交中! X-Content-Security-Policy 对 Edge 没有影响,对于 Windows 10 上的 IE11 似乎也没有必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多