内容安全策略:使用框架祖先“自我”获取奇怪的报告

信息安全 内容安全策略 点击劫持
2021-08-30 23:27:09

现在,我维护https://www.lidl.de的 Content-Security-Policy ,即:

Content-Security-Policy: frame-ancestors 'self'; block-all-mixed-content; report-uri https://lidlcsp.report-uri.io/r/default/csp/enforce;

带有框架祖先的部分是为了防止点击劫持。

在查看发送到 report-uri.io 的违规报告时,排名第一的是:

{
    "csp-report": {
        "blocked-uri": "",
        "document-uri": "https://www.lidl.de/",
        "original-policy": "frame-ancestors https://www.lidl.de; block-all-mixed-content; report-uri https://lidlcsp.report-uri.io/r/default/csp/enforce",
        "violated-directive": "frame-ancestors https://www.lidl.de"
    }
}

这是从 Firefox 发送的(如 report-uri.io 所示)。我在这里对两件事感到困惑:

  1. 为什么要发送此报告?我无法重现它。
  2. 为什么改变“原始政策”('self' vs. https://www.lidl.de)?这有什么区别吗?
  3. 编辑)为什么https://www.lidl.de/在以下报告中阻止?csp 明确允许 iframe 在同一站点上通过'self'.

编辑: 为了使第三个问题更清楚,我添加了另一个csp-report

{
    "csp-report": {
        "document-uri": "https://www.lidl.de/",
        "effective-directive": "frame-ancestors",
        "original-policy": "frame-ancestors 'self'; block-all-mixed-content; report-uri https://lidlcsp.report-uri.io/r/default/csp/enforce;",
        "blocked-uri": "https://www.lidl.de/"
    }
}

如果您可以重现 CSP 违规或触发其他违规,我将很乐意了解它们。

1个回答

为什么改变“原始政策”('self' vs. https://www.lidl.de)?这有什么区别吗?

'self'在 CSP 中实际上代表“相同域”。它只是一个占位符,因此浏览器会将其评估为https://www.lidl.de. 这正是您所说的指令应该做的,它只是以另一种方式编写的。所以不,它没有任何区别

为什么要发送此报告?我无法重现它。

我几乎可以肯定,在 90% 的情况下,答案是:浏览器插件。如果您真的无法使用干净的配置文件和相同的浏览器/相同的站点来重现它,那么很可能只是一个浏览器扩展分别注入了一些东西,试图注入一些东西。这是 CSP 报告的一个非常常见的来源/触发器。

但是,由于它是frame-ancestors指令,您可以轻松地复制它。只需创建一个 iframe 尝试嵌入您的网站:

<iframe height="500" width="500" src="https://www.lidl.de"></iframe>

这应该会失败,并触发 CSP 报告。因为这就是点击劫持的内容:您的网站被嵌入到另一个网站中,这样用户就看不到它并点击了一些东西,用户不想点击。

我知道 Report-URI 有一些过滤器可以防止由浏览器加载项引起的此类报告,但它们仍然无法捕获所有这些报告。


顺便提一句:

带有框架祖先的部分是为了防止点击劫持。

确实如此,但您实际上可能(更好,或者甚至更好:另外)X-Frame-Options为此目的使用标题。此标头是为此而设计的,并且也适用于不支持 CSP 的浏览器(无论如何它都较旧)。有关更多详细信息,请参阅与Report-URI 来自同一作者的安全标头扫描当您使用它时,您还可以查看其他安全标头。