捕获内容安全策略(CSP)错误

6

我正在使用此方法来检测含有eval的CSP(也在AngularJS中使用):

  function noUnsafeEval() {
    try {
      new Function('');
      return false;
    } catch (err) {
      return true;
    }
  }

但我手头没有装有CSP的服务器来彻底测试它。

它可靠吗?代码中是否存在new Function('')行会导致无法捕获的错误?

err是什么?那里捕获的是哪种类型的错误(ErrorTypeError等)?CSP错误消息是什么?

我找不到关于CSP运行时错误的文档。

1个回答

7
关于如何检测CSP,有另一个stackoverflow问题:如何检测内容安全策略(CSP),并且它还展示了您的函数。
可以放心使用它,因为只要代码到达函数构造器(即在其他限制之前未被阻止),您将无论如何从noUnsafeEval获取返回值。
据我所知,如果CSP不允许不安全的eval,则会抛出EvalError(mozilla)。但是这可能因浏览器而异。
最好的方法是测试一下。您可以使用http://mockbin.org创建一个带有正确CSP标头和您的函数的HTTP端点。我在这里创建了这样一个bin:http://mockbin.org/bin/cc6029e5-8aac-4a54-8fd1-abf41e17042a。如果您打开它,打开开发人员控制台并调试代码,您将看到异常: CSP Test

后续编辑

您还可以在W3C推荐/草案中找到此信息:CSP 1.1CSP 2CSP 3。在1.1中,您将获得SecurityError而不是EvalError。

非常感谢,EvalError正是我在寻找的。感谢您对SecurityError的评论。您有关于如何使其构造函数执行err instanceof SecurityError的线索吗?看起来似乎没有SecurityError全局对象。 - Estus Flask
1
是的,显然SecurityError确实是与浏览器相关的事情。它在几个MDN主题中出现。唯一记录的一个可能是DOMException,它可以是一个SecurityError。 - Serban Petrescu
在我的测试中,如果CSP完全启用,则此方法效果很好。然而,我发现在仅报告模式下运行时不会引发“EvalError”/“SecurityError”。这在评估新的CSP时会产生很多噪音...有没有关于在仅报告模式下进行测试的建议? - jcasner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接