我试图在我的 html 文件中包含 script-nonce,但似乎当前的浏览器都不支持它。
有人知道支持此功能的任何浏览器版本吗?我目前正在使用 Chrome 版本 26.0.1410.63 并且也尝试过版本 28,但它似乎不起作用
我所看到的只是 javascript 控制台上的错误,它暗示浏览器尚不支持 script-nonce:
Unrecognized Content-Security-Policy directive 'script-nonce'
我试图在我的 html 文件中包含 script-nonce,但似乎当前的浏览器都不支持它。
有人知道支持此功能的任何浏览器版本吗?我目前正在使用 Chrome 版本 26.0.1410.63 并且也尝试过版本 28,但它似乎不起作用
我所看到的只是 javascript 控制台上的错误,它暗示浏览器尚不支持 script-nonce:
Unrecognized Content-Security-Policy directive 'script-nonce'
它也适用于 Chrome,但到目前为止(版本 26.0.1410.64 m)仅使用临时X-Content-Security-Policy而不是Content-Security-Policy标题,如已更新的代码示例中所定义。W3C Web 应用程序安全工作组刚刚于 2013 年 4 月 28 日将内容安全策略 1.1从之前的工作组草案移至W3C 编辑草案状态。那有什么机会,嗯?
我猜谷歌代码在几天前就已经更新了代码示例,我希望下一次 Chrome 更新会相应地改变这一点。
无论如何,该解决方案隐藏在Google 的 CSP 1.1 先前草稿版本的缓存副本的细则中:
本文档描述了一项已被更广泛的社区讨论了大约两年的提案。在 Firefox 和 Chrome 中有实验性的实现,分别使用标头名称
X-Content-Security-Policy和X-WebKit-CSP。Internet Explorer 10 平台预览版还包含部分实现,使用标题名称X-Content-Security-Policy。
如果我们再次检查Google 代码示例,这些标头值的差异变得非常明显:
<meta http-equiv="Content-Security-Policy" content="script-nonce noncynonce;">
因此,看起来您所要做的(暂时,直到 Chrome 更新以反映 CSP 1.1 提案的状态更改)是将标头名称更改回X-Content-Security-Policy.
我还在最新的 Firefox 和 Opera 浏览器上测试了这些示例,它们已经接受Content-Security-Policy并且没有抱怨控制台错误。
是的。
看起来script-nonce已从规范中删除,而script-src 'nonce-ABCD4321';应该是新语法。据我所知,Chrome 32 不支持新语法,但 Chrome 33 Beta 支持。
参见http://jsbin.com/iyukAwA/3示例测试页面。
EDIT1:看起来像 Blink 补丁https://chromium.googlesource.com/chromium/blink/+/adbf3bb0338931076b7c7bd002b043def760cc61
删除script-nonce支持并添加script-src 'nonce-xxx';支持。
EDIT3:最新规格。
EDIT2:我绝对需要内联脚本和 css,因为我的 web 应用程序有页面内代码来检测包含的脚本或 css 源文件是否无法加载(例如,由于移动连接不可靠)。在 Chrome 中,动态创建元元素:
<script>
var meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
meta.content = "default-src 'none'; connect-src 'self'; img-src 'self'; style-src 'self';";
document.getElementsByTagName('head')[0].appendChild(meta);
</script>
</head>
来自内容安全政策 1.1 - W3C 工作草案 2013 年 6 月 4 日:
示例 4:依赖内联脚本元素的网站希望确保脚本仅从其自身来源执行,并且它有意插入内联的那些元素:
Content-Security-Policy: script-src 'self' 'nonce-$RANDOM';
内联脚本元素只有在它们包含匹配的 nonce 属性时才会执行:
<script nonce="$RANDOM">...</script>
EDIT5: http: //jsbin.com/ArusOCu/1有 document.onsecuritypolicyviolation(event) 日志记录的示例。例如
document.onsecuritypolicyviolation = function (evt) {
console.log('Bzzp! Security violation on', evt.documentURI);
}
EDIT5 - 更多:Chrome 33 Beta 生成了以下事件详细信息:
blockedURI: ""
columnNumber: 0
currentTarget: document
documentURI: "http://jsbin.com/ArusOCu/1"
effectiveDirective: "script-src"
lineNumber: 0
originalPolicy: "default-src 'none'; script-src http://static.jsbin.com 'unsafe-eval' 'nonce-12345678'; connect-src 'self'; style-src http: 'unsafe-inline';"
referrer: ""
sourceFile: ""
statusCode: 200
target: document
timeStamp: 1390192192606
type: "securitypolicyviolation"
violatedDirective: "script-src http://static.jsbin.com 'unsafe-eval' 'nonce-12345678'"
__proto__: SecurityPolicyViolationEvent
[removed base Event parameters]
并且文档说需要以下属性:
readonly attribute DOMString documentURI;
readonly attribute DOMString referrer;
readonly attribute DOMString blockedURI;
readonly attribute DOMString violatedDirective;
readonly attribute DOMString effectiveDirective;
readonly attribute DOMString originalPolicy;
readonly attribute DOMString sourceFile;
readonly attribute long lineNumber;
readonly attribute long columnNumber;
Tidalwave 给出了一个很好的答案。
但是,在 chrome://flags 上启用“Experimental Webkit Features”后,您可以在 Chrome 版本 28.0.1490.2 dev 上运行它。这样,您无需任何修改即可使用此语法。
我从 Chromium 上此功能的开发人员那里得到了这个答案,他警告说将来语法可能会改变。