动态添加的script标签nonce无效怎么办?
在单页应用里用createElement动态插入script标签,设置了nonce属性,但是控制台还是报”Refused to execute inline event handler because it violates the following Content Security Policy directive”的错误,这是为什么呢?
我的代码是这样的:
const script = document.createElement('script');
script.nonce = 'random123nonce';
script.src = '/api/load.js';
document.head.appendChild(script);
服务器返回的CSP头明明有nonce=random123nonce,但页面加载时还是报错。我尝试过把nonce写死在JS里,也试过从meta标签读取,结果都一样。难道动态添加的script标签需要额外配置?
script标签的nonce属性必须是一个可信来源的值,且需要在页面加载时就已经存在。你现在的写法可能是因为 nonce 的值不是从服务器传过来的标准值,或者类型不对。改一下就行:
注意:不要直接把 nonce 写死在代码里,要从 meta 标签或服务器端动态生成的内容中获取。否则浏览器可能会认为 nonce 不可信,从而忽略它。