CSP 中的 script hash 到底该怎么生成和使用?
我在给网站加 Content Security Policy,想用 hash 来允许内联脚本执行,但试了好几次浏览器还是报错说不被允许。我用的是 sha256-... 这种格式,但不确定是不是生成方式不对。
比如我有这段内联脚本:
<script>
console.log('hello');
</script>
我用 openssl 算了 hash:echo -n "console.log('hello');" | openssl dgst -sha256 -binary | openssl base64,然后加到 CSP 里,但控制台还是报错。到底哪里出问题了?
标签里的完整内容,包括换行符和缩进。对于你的例子,正确的做法应该是计算这个字符串的hash:
注意最后的换行符!这才是浏览器实际解析的内容。你可以用这个命令重新计算:
MDN文档里其实有说明这点,但很多人都忽略了。推荐的做法是先用浏览器控制台的报错信息,它会告诉你它期望的hash值是什么,你可以先复制这个值来验证。
还有个小坑要注意:如果脚本里有unicode字符,不同平台的处理可能不一致。遇到这种情况建议直接用node的crypto模块来算更可靠。