我在 Apache2 配置中使用以下命令在服务器上打开了内容安全策略:
Header set Content-Security-Policy-Report-Only "default-src 'self'"
(我将其设置为...-Report-Only
仅报告错误,而不会在开发过程中真正阻止某些内容。)
此设置会产生一个我不明白的错误。但我可以重现它:
这是简化的 html 代码:
<!DOCTYPE HTML>
<html lang="en">
<head>
<script src="/js/test.js"></script>
<title>test</title>
</head>
<body></body>
</html>
如您所见,没有内联脚本,没有内联样式(根本没有样式)和完全空的正文。
这是 Javascript 文件 test.js:
window.onload = function () {
//create a paragraph with a red text to have some content
//in my "real" problem, this part is very much code (more than 1000 lines)
document.body.innerHTML = '<div id="original"></div><div id="copy"></div>';
var p1 = document.createElement('p');
var t1 = document.createTextNode('some text');
p1.appendChild(t1);
document.getElementById('original').appendChild(p1);
//set some style within this content
p1.style.color = "red";
//-----------------------------------
//make a copy of this content
document.getElementById('copy').innerHTML = document.getElementById('original').innerHTML;
};
此脚本将两个 div 添加到正文,并将带有文本的段落插入其中一个 div 中。然后它将文本的颜色更改为红色。最后,它会复制该 div 的内容,并将该副本插入到另一个 div 中。
我认为我已经做得很好,但是当我在浏览器中打开此文档时,Safari 控制台中报告了以下错误:
[仅限报告] 拒绝应用样式表,因为其哈希值、随机数或“unsafe-inline”既未出现在内容安全策略的 style-src 指令中,也未出现在 default-src 指令中。
测试.js:0
(报告的行号“0”显然不正确)
这是 Opera 和 Chrome 写入控制台的内容:
[仅限报告] 拒绝应用内联样式,因为它违反了以下内容安全策略指令:“default-src 'self'”。启用内联执行需要“unsafe-inline”关键字、哈希值(“sha256-ZBTj5RHLnrF+IxdRZM2RuLfjTJQXNSi7fLQHr09onfY=”)或随机数(“nonce-...”)。另请注意,“style-src”未明确设置,因此“default-src”用作后备。
window.onload @ test.js:15
(第15行是innerHTML的操作)
仅当我将任何样式设置为文档的一部分时(p1.style.color = "red";
),然后制作包含样式零件的零件的副本(copy.innerHTML = original.innerHTML
).
我的问题:
- 为什么会出现这个错误呢? (我想了解为什么它报告“内联样式”,尽管没有内联样式)
- 我怎样才能避免这个错误?
我没有现实的机会去改变原作被操纵的部分。我能改变的就是这一行:
document.getElementById('copy').innerHTML = document.getElementById('original').innerHTML;
Addendum
抱歉,我对此还不够清楚:
I do NOT想要更改 CSP 标头。必须禁止内联样式是有充分理由的。看XSS 攻击和风格属性和类似的问题。
I want:
- 了解为什么我的 JavaScript 代码会产生内联样式错误。
- 不会产生此类错误的脚本。