如何检测内容安全策略(CSP)

时间:2013-10-02 15:02:42

标签: javascript security content-security-policy

我注意到GitHub和Facebook现在都在实施此政策,这限制了第三方脚本在其体验/网站中运行。

有没有办法使用 JavaScript 检测文档是否针对CSP运行? 我正在编写一个书签,如果他们在不支持嵌入脚本标记的网站上,则想要给用户一条消息。

6 个答案:

答案 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"

捕获CSP违规错误。

来自: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)

来自https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8cb347c5b5

fetch(document.location.href)
.then(resp => {
  const csp = resp.headers.get('Content-Security-Policy');
  // does this exist? Is is any good?
});

然而,connect-src='none'会失败并报告。