CSP 的 script-src 用 hash 为啥不生效?
我在本地开发时给内联脚本加了 CSP hash,但浏览器还是报违反策略,明明 hash 是对的啊?
我用的是 Chrome,控制台显示:Refused to execute inline script because it violates the following Content Security Policy directive...。我用 openssl 算的 sha256,也去掉了 base64 填充的等号,格式应该没问题。
<meta http-equiv="Content-Security-Policy" content="script-src 'sha256-xxxxxx'">
<script>
console.log('hello');
</script>
你用 openssl 算的时候,大概率没匹配上 HTML 文件里的实际内容。比如你的 script 标签里如果写了缩进,那你 openssl 的时候也得带上同样的缩进。还有个经典坑,echo 命令默认会在末尾加换行符,如果你没用 -n 参数,算出来的 hash 肯定跟浏览器对不上。
其实有个最简单粗暴的办法,不用自己算。你打开 Chrome 的控制台,仔细看那个 CSP 报错信息,里面其实已经告诉你它期望的 hash 是多少了,直接复制那个填到 meta 标签里,绝对好使。
如果你非要用命令行算,记得用 echo -n 并且把内容里的空格完全还原。比如像这样:
不过说实话,开发环境为了省事,直接加个 'unsafe-inline' 也就完事了,上线再改成 hash 或者 nonce。别在本地调 CSP 调到头秃,不值当。