在设置 Content Security Policy(内容安全策略) 时,经常会遇到这种错误:
content_security_policy_script_src: 值必须是 'unsafe-eval' 或 'wasm-unsafe-eval',或者是 '<hash algorithm>-<base64 value>' 形式…
也就是说,当你想允许内联 <script> 或动态脚本时:
必须使用 CSP Hash 格式
不能随便写 unsafe-inline 或 unsafe-eval(不安全且被浏览器拒绝)
典型格式如下:
Content-Security-Policy: script-src 'self' 'sha256-AbCdEfGhIjKlMnOpQrStUvWxYz1234567890abcd=';
那这个 hash 从哪来?当然用工具来帮你算!
两个极好用的在线工具
1) report-uri.com — CSP Hash 生成 + 安全检测
https://report-uri.com/home/hash
这是业内最常用的 CSP Hash 工具之一,也兼具 CSP 安全检查功能。
使用方式(一步搞定)
-
打开网站
-
在 textarea 粘贴你要允许的 JS 代码
-
下拉选择算法(推荐:SHA-256 或 SHA-384)
-
点击 “Generate”
它会输出类似这样:
sha256-AbCdEfGhIjKlMnOpQrStUvWxYz1234567890abcd=
你只需在 CSP 里这么写:
Content-Security-Policy: script-src 'self' 'sha256-AbCdEfGhIjKlMnOpQrStUvWxYz1234567890abcd=';
优点:
-
自动处理 base64
-
支持多种 hash(sha256/384/512)
-
UI 简洁、速度快
-
生成的 hash 与浏览器规则一致
2) srihash.org — 专注 SRI / CSP Hash 生成
这个网站专门用于生成 Subresource Integrity (SRI) + CSP Hashes,同时支持:
SHA-256
SHA-384
SHA-512
它的输出格式是类似:
sha384-Base64HashValue==
同样可以直接用于 CSP script-src:
Content-Security-Policy: script-src 'self' 'sha384-Base64HashValue==';
优点:
-
专注 hash,简洁快速
-
支持更高安全级别(sha384 / sha512)
-
可用于 script / style /资源完整性
什么时候需要用 Hash?
你可能会碰到这些情况:
页面里直接写了 <script> 内联代码
第三方 SDK 需要动态脚本但 CSP 严格
有 CSP 但不想全局放开 ‘unsafe-inline’
此时最安全的方式是:
用 hash 白名单允许这段内联脚本
避免使用 unsafe-inline 或 unsafe-eval
实用示例
HTML 示例
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy"
content="script-src 'self' 'sha256-AbCdEfGhIjK123...='">
</head>
<body>
<script>
console.log('Hello CSP!');
</script>
</body>
</html>
小技巧
如果脚本内容变了,hash 必须重新生成
支持多个 hash,用空格隔开
推荐用 SHA-384 或 SHA-512(更安全)
示例:
script-src 'self' 'sha256-...' 'sha384-...' 'sha512-...';
结语
使用 CSP hash 白名单,不仅能:
让策略更安全
防止 XSS 攻击
避免乱用 unsafe-inline
还能最大限度满足现代浏览器的 CSP 要求。