没有 src 的 iframe 的内容安全策略 (CSP) 框架祖先

时间:2021-03-03 15:07:58

标签: google-chrome internet-explorer iframe content-security-policy websecurity

我想阻止在 iframe 中托管我的网站(即 www.my.com),但域的允许列表(即 www.test.comwww.bla.com、...、{ {3}}) 以防止点击劫持。

要为普通浏览器实现它,我使用 Content-Security-Policy 并使用 http 和 https 架构发送所有域。对于 IE,我使用引用主机名并根据域的允许列表进行检查;如果域存在,我将其添加到 X-Frame-Options;否则,我发送 SAMEORIGIN。 例如,假设引用域为 www.n.com

X-Frame-Options: ALLOW-FROM https://www.n.com

Content-Security-Policy: frame-ancestors 'self' https://www.test.com https://www.bla.com ... https://www.n.com; http://www.test.com http://www.bla.com ... http://www.n.com;

但是,我想将我的网站托管在另一个网站(在本例中为 salesforce)中,并且该网站不直接在首页托管 iframe,而是创建另一个没有 URL 的 iframe(即,没有 src 属性) 并在其中托管我的 iframe:

-> top window: www.n.com
-> -> iframe without src <iframe name="some_name">
-> -> -> iframe with my website <iframe src="https://www.my.com">

浏览器 (chrome) 阻止我的网站加载,因为:“拒绝框架 'https://www.my.com/' 因为祖先违反了以下内容安全政策指令...”。

我认为它在 CSP 检查中包含中间 iframe(没有 src),这就是问题所在。

如何在支持这种情况的同时使用 Content-Security-Policy / X-Frame-Options 保护我的网站免遭点击劫持?

更新 如果您正在阅读这个问题 - 我发现 chrome 会忽略空的 src 并按预期工作。我错了,错过了另一个域:

-> top window: www.n.com
-> -> iframe with some src <iframe src="https://www.opppsss.com">
-> -> -> iframe without src <iframe name="some_name">
-> -> -> -> iframe with my website <iframe src="https://www.my.com">

您需要将链中的所有域添加到 CSP 标头中。

2 个答案:

答案 0 :(得分:1)

frame-ancestors 指令适用于起源元组。

  • <iframe src=http://... 的情况下,事情很简单,原始元组取自 src=

  • <iframe src=data:-Url 的情况下,原点将是不透明的,因此 frame-ancestors skips it 并检查父项。

  • <iframe name="some_name"> 的情况下,其内容是由父页面 javascript 使用 .contentDocument 属性创建的。因此 iframe 的来源将与父页面相同。

因此,您必须在 frame-ancestors 中指定 DOM 中整个父级升序链的起源。
不幸的是,X-Frame-Options:... 标头不适用于多个主机源。

<块引用>

浏览器 (chrome) 似乎在 CSPv 检查中包含中间 iframe 并阻止我的网站加载。

很有趣,你怎么知道...
恕我直言,问题是您的 CSP 基于 referrer。您希望在以下情况下获得哪个 referrer

-> top window: www.n.com
-> -> iframe without src <iframe name="some_name">
-> -> -> iframe with my website <iframe src="https://www.my.com">

我认为您从最近的父母那里得到了空的 referrer,因此发布了 Content-Security-Policy: frame-ancestors 'self' -> 禁止嵌入到 salesforce 中。

答案 1 :(得分:-1)

Content-Security-Policy 框架祖先可以包含多个来源,因此您可以包含整个允许列表。由于所有祖先都需要通过 frame-ancestors 检查,因此您必须包含多个来源才能使 Salesforce 示例正常工作,请参阅 DataFrame.add_suffix

X-Frame-Options ALLOW-FROM 只能包含一个源,由浏览器决定是否所有祖先,顶部或底部都必须匹配,参见 https://www.w3.org/TR/CSP3/#frame-ancestors-navigation-response