【发布时间】:2017-02-22 20:47:24
【问题描述】:
我在我的 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 的控制台中报告了这个错误:
[仅报告] 拒绝应用样式表,因为它的哈希、随机数或“不安全内联”既没有出现在内容安全策略的 style-src 指令中,也没有出现在 default-src 指令中。
test.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;
附录
对不起,我对此不够清楚:
我确实不想要更改 CSP-Header。有一个很好的理由,为什么必须禁止内联样式。请参阅XSS attacks and style attributes 和类似问题。
我想要:
- 了解为什么我的 JavaScript 代码会产生内联样式错误。
- 不会产生此类错误的脚本。
【问题讨论】:
标签: javascript content-security-policy