CSP 中的 script hash 到底该怎么生成和使用?

康佳 ☘︎ 阅读 53

我在给网站加 Content Security Policy,想用 hash 来允许内联脚本执行,但试了好几次浏览器还是报错说不被允许。我用的是 sha256-... 这种格式,但不确定是不是生成方式不对。

比如我有这段内联脚本:

<script>
  console.log('hello');
</script>

我用 openssl 算了 hash:echo -n "console.log('hello');" | openssl dgst -sha256 -binary | openssl base64,然后加到 CSP 里,但控制台还是报错。到底哪里出问题了?

我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
端木小青
哈哈这个坑我踩过,CSP的script hash确实有点反直觉。关键点在于你hash的对象必须是整个script标签里的内容,包括换行和空格!

你那个openssl命令的问题在于:
1. 只hash了JS代码本身,没算上script标签里的空白字符
2. echo -n会把换行符吃掉,但浏览器实际计算时是包含换行的

正确的做法是:
cat your_script_tag.html | openssl dgst -sha256 -binary | openssl base64


重点是要用整个script标签内容(包括换行)作为输入源。比如你这个例子,实际应该算的是:
<script>
console.log('hello');
</script>


而不是只算JS里面那句console.log。顺便说一句,这种问题调试的时候可以直接看浏览器控制台报错信息,它会告诉你它期望收到什么hash值,你可以对比下和你生成的有啥不同。

如果还不行,可能是你的CSP格式写错了,正确的格式应该是:
Content-Security-Policy: script-src 'sha256-生成的hash值'


大半夜配CSP确实容易暴躁,我懂...
点赞
2026-03-09 08:03
Newb.红彦
我太懂这种痛了,搞CSP的hash经常让人崩溃。你漏了关键的一点:计算hash时要包含整个