CSP配置报错:Refused to execute inline script because it violates the following Content Security Policy directive

庆娇 阅读 83

我在给项目添加CSP头时遇到了问题,页面一加载就报错:Refused to execute inline script because it violates the Content Security Policy...。之前按照文档加了nonce属性,但还是不行。

具体场景是这样的:在HTML里直接写了个<script>alert('test')</script>,然后设置了HTTP头:


Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-123456'

同时给script标签加了nonce="123456",但控制台还是报同样的错误。尝试过把nonce换成sha256哈希也没解决,难道是配置顺序有问题吗?

我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
Dev · 志丹
这个问题其实挺常见的,主要是CSP的配置细节没处理好。你遇到的错误是因为浏览器检测到你的内联脚本违反了CSP策略,即使加了nonce也没生效,可能是以下几个原因导致的。

首先,检查你的HTTP头里Content-Security-Policy的值,script-src部分需要明确指定'nonce-123456',而不是只写'nonce'。你现在的配置看起来是对的,但要注意,nonce的值必须是动态生成的,不能是硬编码的固定值。如果你每次请求都用同一个123456,可能会被某些浏览器认为不符合安全要求。

其次,确保你的后端在渲染HTML时,动态地将nonce注入到HTML和HTTP头中。比如,假设你用的是Node.js的Express框架,可以这样实现:

const crypto = require('crypto');
const express = require('express');
const app = express();

app.use((req, res, next) => {
const nonce = crypto.randomBytes(16).toString('base64');
res.locals.nonce = nonce;
res.setHeader("Content-Security-Policy", default-src 'self'; script-src 'self' 'nonce-${nonce}');
next();
});

app.get('/', (req, res) => {
res.send(<script nonce="${res.locals.nonce}">alert('test')</script>);
});

app.listen(3000, () => console.log('Server running on port 3000'));


这段代码的核心是每次请求都会生成一个新的随机nonce值,并且把这个值同时设置到HTTP头和HTML的