【问题标题】:Catching Content Security Policy (CSP) errors捕获内容安全策略 (CSP) 错误
【发布时间】:2017-02-25 15:55:38
【问题描述】:

我正在使用这种方法来检测带有eval 的 CSP(也用于 AngularJS):

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

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

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

err 是什么?那里捕获了哪种错误(ErrorTypeError 等)? CSP 错误消息说明了什么?

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

【问题讨论】:

    标签: javascript content-security-policy


    【解决方案1】:

    关于如何检测CSP,还有另一个stackoverflow问题:How to detect Content Security Policy (CSP),它也显示了你的函数。

    使用它应该是安全的,因为只要代码到达函数构造函数(即之前没有被其他限制阻塞),你总是会从 noUnsafeEval 获得返回值。

    据我所知,如果 CSP 不允许不安全的 eval,它将引发 EvalError (mozilla)。但这可能因浏览器而异。

    确定的最佳方法是对此进行测试。您可以使用http://mockbin.org 创建一个 HTTP 端点,该端点返回一个带有正确 CSP 标头和您的函数的页面。我在这里做了一个这样的垃圾箱:http://mockbin.org/bin/cc6029e5-8aac-4a54-8fd1-abf41e17042a。如果你打开它,打开开发控制台并调试代码,你会看到异常:


    稍后编辑

    您还可以在 W3C 建议/草案中找到此信息:CSP 1.1CSP 2CSP 3。在 1.1 中,你会得到一个 SecurityError 而不是 EvalError。

    【讨论】:

    • 非常感谢,EvalError 正是我想要的。感谢您对 SecurityError 的评论。您对如何让其构造函数执行err instanceof SecurityError 有一些线索吗?好像没有SecurityError global。
    • 是的,显然 SecurityError 确实是一个依赖于浏览器的东西。它出现在几个MDN topics 中。唯一记录在案的将是 DOMException,它可能是 SecurityError。
    • 在我的测试中,如果 CSP 完全启用,这会很好。但是,我发现在仅报告模式下运行时不会引发 EvalError/SecurityError。在评估新的 CSP 时,这会产生很多噪音......在仅报告模式下进行测试有什么建议吗?
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2023-01-07
    • 2016-03-25
    • 2013-10-09
    • 2015-07-28
    • 1970-01-01
    • 2023-04-03
    • 2016-09-12
    相关资源
    最近更新 更多