脚本的 Content-Security-Policy 哈希

信息安全 哈希 xss http html 内容安全策略
2021-09-06 12:29:26
<?php
header("Content-Security-Policy: default-src 'sha256-".base64_encode(hash('sha256', 'console.log("Hello world");', true))."'");
?>
<script>console.log("Hello world");</script>

但是我仍然在 Chrome 中收到:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“default-src 'sha256-1DCfk1NYWuHM8DgTqlkOta97gzK+oBDDv4s7woGaPIY='”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-...”)或随机数(“nonce-...”)。另请注意,'script-src' 未明确设置,因此 'default-src' 用作后备。

我已经玩了一个多小时,但仍然无法生成与示例匹配的哈希,例如。

http://software-security.sans.org/downloads/appsec-2014-files/building-a-content-security-policy-csp-eric-johnson.pdf 声明<script>alert('Allowed to execute');</script>(难以确定原始间距)的哈希值为sha256-MmM3YjgyNzI5MDc5NTA0ZTdiCWViZGExZDkxMDhlZWIw NDIwNzU2YWE5N2E4YWRjNWQ0ZmEyMDUyYjVkNjE0NTk=

这没有多大意义:最后一部分不是以 开头sha256-,但至少第一个哈希是正确的长度。我得到sha256-nbFv/38jW7zf8mQirwFemFjDwp5CwIaorxe4Z3yycn0=了哈希alert('Allowed to execute');

http://nmatatal.blogspot.com/2013/09/how-my-script-hash-poc-works.html 声明: <script>console.log("Hello world");</script>应该有一个 csp 的 script-src 'sha256-y/mJvKQC/3H1UwsYAtTR7Q=='眼球,看起来太短了。


我究竟做错了什么?

3个回答

这仍然令人难以置信的混乱。我正在运行 Chrome 40,和你一样,我花了比我想弄清楚发生了什么要长得多的时间。

CSP 2 规范说明了散列 <script> 元素

例如, SHA-256 摘要alert('Hello, world.');YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo=.

我已经设法通过运行生成该哈希:

$ echo -n "alert('Hello, world.');" | openssl dgst -sha256 | base64
YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo=

但这在 Chrome 40 中不起作用

CSP 的编辑草稿是这样说的

例如, SHA-256 摘要alert('Hello, world.');qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng=.

他们给出的示例是通过以下方式生成的:

$ echo -n "alert('Hello, world.');" | openssl dgst -sha256 -binary | base64
qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng=

在加入的-binary标志openssl是两个命令间的差别。

这在 Chrome 40(稳定版)和 Chrome Canary 中确实有效,但我相信它在 Firefox 36 中仍然存在问题。

更新:Chrome 发行版似乎不支持脚本哈希。我的测试仅适用于 Chrome Canary(使用时script-src不是 default-src

——

您应该尝试使用“script-src”而不是“default-src”(基于我对工作草案的快速阅读)

https://security.stackexchange.com/a/34998/41628

因此,看起来您所要做的(暂时,直到 Chrome 更新以反映 CSP 1.1 提案的状态更改)是将标头名称更改回 X-Content-Security-Policy。