CSP策略配置后为什么内联脚本报错? 东宁 Dev 提问于 2026-03-23 12:20:20 阅读 3 安全 我在项目里加了 Content-Security-Policy,结果页面上所有内联的 <script> 都被拦截了,控制台报错说违反了 script-src 策略。 我试过加上 'unsafe-inline',但听说这不安全。有没有更安全的办法?比如用 nonce 或 hash?我的 CSP 头现在是这样配的: Content-Security-Policy: default-src 'self'; script-src 'self' 我来解答 赞 0 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 司空智慧 Lv1 遇到内联脚本被拦截的问题,确实是因为 CSP 策略的限制。你提到的 'unsafe-inline' 虽然能解决问题,但确实不安全,容易导致 XSS 攻击。 可以使用 nonce 或 hash 来替代 'unsafe-inline',这两种方法都比 'unsafe-inline' 更安全。这里简单介绍下怎么用 nonce 和 hash。 使用 nonce 首先在你的服务器端生成一个随机值作为 nonce,然后把这个 nonce 值加到 CSP 头中,同时在内联脚本标签里也引用这个 nonce 值。这样浏览器就能识别出哪些内联脚本是允许执行的。 CSP 头配置: Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-randomNonceValue' 内联脚本标签: <script nonce="randomNonceValue"> // 内联脚本内容 </script> 使用 hash 如果你的内联脚本内容不会频繁变化,可以使用 hash 方法。你需要计算出内联脚本的 SHA-256 哈希值,然后把这个哈希值加到 CSP 头中。 假设内联脚本内容是 alert('Hello, world!');,计算出其 SHA-256 哈希值为 sha256-oqdpNBMkh2eXHfD7wEz6DwYkR2/XJ8uobRlNpsrwybE=。 CSP 头配置: Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-oqdpNBMkh2eXHfD7wEz6DwYkR2/XJ8uobRlNpsrwybE=' 内联脚本标签保持不变: <script> alert('Hello, world!'); </script> 以上两种方法都可以避免使用 'unsafe-inline',选择哪种方法取决于你的具体需求和使用场景。标准写法推荐使用 nonce,因为它更灵活,适用于动态生成的内联脚本。 回复 点赞 2026-03-23 12:37 加载更多 相关推荐 2 回答 40 浏览 CSP策略配置后为什么还是被绕过执行了内联脚本? 在做渗透测试时,给网站加了CSP策略禁止内联脚本,但测试人员用base64编码的dataURI依然能执行恶意脚本,这是怎么回事? 我的CSP配置是这样的:Content-Security-Policy... 俊娜的笔记 安全 2026-01-28 15:13:28 2 回答 24 浏览 CSP 的 hash 值怎么算才对?为什么我加了还是报错? 我在给一个内联脚本加 CSP 的 hash 策略,但浏览器一直报违反策略。我用的是 sha256,命令是 echo -n "alert('hello')" | openssl dgst -sha256... 芸菡 安全 2026-03-01 16:22:22 2 回答 71 浏览 为什么我的CSP头配置总是报错?路径和语法都没问题 我在给项目加CSP头的时候遇到奇怪的问题,明明按照文档写了meta标签,但浏览器还是提示违反CSP策略。检查过路径和语法都没问题,这是为什么啊? 代码是这样写的,设置了script-src只允许sel... Mr-春彦 安全 2026-02-14 12:59:27 2 回答 29 浏览 为什么我的CSP策略阻止了eval函数,但移除unsafe-eval又报错? 我在开发动态表单组件时用到了eval执行表达式,CSP报错提示缺少unsafe-eval。尝试在header里加了script-src 'self' 'unsafe-eval',但控制台还是显示: C... 司徒心虹 安全 2026-02-11 01:24:45 1 回答 16 浏览 CSP 的 script-src 用 hash 为啥不生效? 我在本地开发时给内联脚本加了 CSP hash,但浏览器还是报违反策略,明明 hash 是对的啊? 我用的是 Chrome,控制台显示:Refused to execute inline script... 欧阳馨翼 安全 2026-03-04 05:45:18 2 回答 83 浏览 为什么设置了CSP后图片和字体资源还是被阻止了? 我在开发博客项目时配置了CSP头,但图片和字体资源还是被浏览器拦截了。我明明设置了和,控制台报错显示: Refused to load the image 'https://images.exampl... 子源 安全 2026-02-14 08:42:51 2 回答 49 浏览 CSP中的strict-dynamic有什么用?为什么我的动态脚本还是被阻止了? 我在给项目配置CSP时用了'strict-dynamic',但页面加载时动态创建的script标签还是报blocked错误。比如这样: const script = document.createEl... 付楠 安全 2026-02-06 20:32:25 2 回答 92 浏览 CSP配置报错:Refused to execute inline script because it violates the following Content Security Policy directive 我在给项目添加CSP头时遇到了问题,页面一加载就报错:Refused to execute inline script because it violates the Content Security... 庆娇 安全 2026-01-31 21:54:23 1 回答 19 浏览 CSP 的 script-src 用 hash 为什么还是报错? 我在页面里加了个简单的点击事件,然后根据 Chrome 控制台提示生成了 sha256 hash,但加上 CSP 后还是被拦截,完全搞不懂哪里错了。 我试过用在线工具和 openssl 手动生成 ha... 设计师树衡 安全 2026-03-13 15:36:18 1 回答 40 浏览 CSP 的 font-src 限制导致自定义字体加载失败怎么办? 我在 React 项目里用了 Google Fonts,但部署后控制台报错说被 CSP 的 font-src 策略拦截了,明明已经在 meta 标签里加了 'self' 和 fonts.gstatic... a'ゞ爱红 安全 2026-02-26 15:52:24
可以使用 nonce 或 hash 来替代 'unsafe-inline',这两种方法都比 'unsafe-inline' 更安全。这里简单介绍下怎么用 nonce 和 hash。
使用 nonce
首先在你的服务器端生成一个随机值作为 nonce,然后把这个 nonce 值加到 CSP 头中,同时在内联脚本标签里也引用这个 nonce 值。这样浏览器就能识别出哪些内联脚本是允许执行的。
CSP 头配置:
内联脚本标签:
使用 hash
如果你的内联脚本内容不会频繁变化,可以使用 hash 方法。你需要计算出内联脚本的 SHA-256 哈希值,然后把这个哈希值加到 CSP 头中。
假设内联脚本内容是
alert('Hello, world!');,计算出其 SHA-256 哈希值为sha256-oqdpNBMkh2eXHfD7wEz6DwYkR2/XJ8uobRlNpsrwybE=。CSP 头配置:
内联脚本标签保持不变:
以上两种方法都可以避免使用 'unsafe-inline',选择哪种方法取决于你的具体需求和使用场景。标准写法推荐使用 nonce,因为它更灵活,适用于动态生成的内联脚本。