我注意到GitHub和Facebook现在都在实施此政策,这限制了第三方脚本在其体验/网站中运行。
有没有办法使用 JavaScript 检测文档是否针对CSP运行? 我正在编写一个书签,如果他们在不支持嵌入脚本标记的网站上,则想要给用户一条消息。
答案 0 :(得分:6)
这个怎么样?对于慢速连接,可能应该提高超时。 Onload是我用来检测它的东西,它似乎工作。如果加载,则CSP显然未启用或配置不正确。
var CSP = 0;
frame = document.createElement('script');
frame.setAttribute('id', 'theiframe');
frame.setAttribute('src', location.protocol+'//example.com/');
frame.setAttribute('onload', 'CSP=1;');
document.body.appendChild(frame);
setTimeout(function(){if (0 == CSP){alert("CSP IS ENABLED");}}, 250);
答案 1 :(得分:4)
您可以尝试使用事件"securitypolicyviolation"
来自:https://developer.mozilla.org/en-US/docs/Web/API/SecurityPolicyViolationEvent
示例:
document.addEventListener("securitypolicyviolation", (e) => {
console.log(e.blockedURI);
console.log(e.violatedDirective);
console.log(e.originalPolicy);
});
答案 2 :(得分:3)
来自https://github.com/angular/angular.js/blob/master/src/Angular.js#L1091,功能noUnsafeEval
function noUnsafeEval() {
try {
/* jshint -W031, -W054 */
new Function('');
/* jshint +W031, +W054 */
return false;
} catch (e) {
return true;
}
}
答案 3 :(得分:2)
目前,在发布浏览器时无法这样做。
但是,根据规范,以下内容应该可以使用,并且在chrome://flags/
中启用实验性网络平台功能的Chrome中也可以使用
function detectCSPInUse() {
return "securityPolicy" in document ? document.securityPolicy.isActive : false;
}
SecurityPolicy
接口(如果已实现,则从document.securityPolicy
获得的接口)具有一些属性,可提供有关当前允许的更多详细信息。
答案 4 :(得分:2)
检测CSP支持的一种简单方法就是检查JavaScript的eval()方法是否可以在不抛出错误的情况下运行,如下所示:
try {
eval("return false;");
} catch (e) {
return true;
}
但是,这仅适用于CSP实际上已打开(显然),并且在页面加载的响应标头中设置了Content-Security-Policy,并且没有' unsafe-eval'在script-src。
我来到这里寻找一种方法来检测没有实际打开CSP的浏览器中的CSP支持。看来这是不可能的。
另外,IE不支持CSP,只支持IE 10+中的沙箱指令,通过查看CSP标准,它不会使其成为符合标准的Web浏览器。
答案 5 :(得分:2)
fetch(document.location.href)
.then(resp => {
const csp = resp.headers.get('Content-Security-Policy');
// does this exist? Is is any good?
});
然而,connect-src='none'
会失败并报告。