在firefox

时间:2017-03-30 04:59:21

标签: javascript firefox content-security-policy

我无法通过校验和进行白名单在firefox(52.0.2,windows)中工作。 Firefox根据caniuse支持内容安全策略版本2,因此应支持校验和。

当chrome阻止内联脚本时,它会将所需的sha-256打印到控制台。 将其添加到csp规则会成功将脚本列入白名单。 校验和也与计算的校验和相同 https://report-uri.io/home/hash

但是firefox拒绝接受它。

我注意到MDN文档中的示例使用base-16而不是base-64编码用于校验和。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src

但即使使用MDN示例,我也能得到相同的结果。 (还有使用base-16编码的chrome拒绝)。我尝试了以下几种变体:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy"
          content="script-src 'sha256-076c8f1ca6979ef156b510a121b69b6265011597557ca2971db5ad5a2743545f'">
    <title>Hello CSP</title>
</head>
<body>
    <script type="text/javascript">var inline = 1;</script>
</body>
</html>
  

内容安全策略:页面的设置阻止了在自己加载资源(“script-src&#39; sha256-076c8f1ca6979ef156b510a121b69b6265011597557ca2971db5ad5a2743545f&#39;”)。来源:var inline = 1;。

2 个答案:

答案 0 :(得分:4)

我无法完全放下这个,因为显然有些奇怪而令人困惑的事情发生了。我发现了一些有趣的东西:

  • 使用适用于Chrome和Firefox的有效sha-256。
  • 将每个+替换为-,将每个/替换为_

瞧!您的校验和适用于Chrome但不适用于Firefox。从Base64 variants来看,这种格式并非不合理。

事实证明,基于Chrome 45的Dartium browser会以“替代格式”发出校验和,这可能是它进入我的剪贴板的方式。

这仅适用于Chrome:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-LqkgOOr2rKDFd7Yl4hZ4H8nB0Stbc-RDo573pA7E/XU='">

    <title>Hello CSP</title>

    <script type="text/javascript">alert("running");</script>
</head>
</html>

答案 1 :(得分:3)

如果您更改哈希值,它将起作用,如下所示:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="Content-Security-Policy"
        content="script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8='">
  <title>Hello CSP</title>
</head>
<body>
  <script type="text/javascript">var inline = 1;</script>
</body>
</html>

不确定您为什么会看到您描述的Chrome中的行为;当我在Chrome中测试问题中的示例时,它会阻止脚本并发出错误消息,说明使用哈希值sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8=

并且https://report-uri.io/home/hash在给定var inline = 1;时也会输出相同的值。