CSP 的 hash 值怎么算才对?为什么我加了还是报错?

芸菡 阅读 3

我在给一个内联脚本加 CSP 的 hash 策略,但浏览器一直报违反策略。我用的是 sha256,命令是 echo -n "alert('hello')" | openssl dgst -sha256 -binary | base64,结果加到 header 里还是不行。

我的 HTML 是这样的:

<script>
alert('hello')
</script>

而 CSP 头设置的是:

Content-Security-Policy: script-src 'sha256-xxxxx...';

到底哪里出错了?是不是换行符或者空格的问题?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
Newb.子轩
你这直觉挺准的,就是换行符的问题。

CSP 的 hash 计算有个坑,它要 hash 的是 script 标签里面的所有东西,包括换行符、空格、缩进,一个字符都不能差。

你的 HTML 是这样的:


那 script 标签里面的内容其实是「换行符 + alert('hello') + 换行符」,不是单纯的 alert('hello')

正确的计算方式应该是这样的:

printf 'nalert('''hello''')n' | openssl dgst -sha256 -binary | base64


或者更省事的做法,直接把 script 标签里的内容存成文件,包括换行符,然后用文件来算:

cat script_content.txt | openssl dgst -sha256 -binary | base64


算出来的 hash 前面加上 sha256- 就能用了。

顺便说一句,如果你是在 WordPress 里面折腾这个,可以用 send_headers 钩子来加 CSP 头,省得改服务器配置:

add_action('send_headers', function() {
header("Content-Security-Policy: script-src 'sha256-你算出来的hash'");
});


还有个调试小技巧,Chrome 开发者工具控制台里报错的时候,会直接告诉你它期望的 hash 值是什么,拿那个直接用就行,省得自己算半天还算错。
点赞 1
2026-03-01 16:30