没有 src 的 iframe 的 Content-Security-Policy (CSP) 框架祖先

Posted

技术标签:

【中文标题】没有 src 的 iframe 的 Content-Security-Policy (CSP) 框架祖先【英文标题】:Content-Security-Policy (CSP) frame-ancestors for iframes without src 【发布时间】:2021-06-02 04:44:01 【问题描述】:

我想防止在 iframe 中托管我的网站(即www.my.com),但域的允许列表(即www.test.com、www.bla.com、...、www.n.com)除外点击劫持。

为了在普通浏览器上实现它,我使用 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 标头。

【问题讨论】:

【参考方案1】:

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

&lt;iframe src=http://... 的情况下,事情很简单,源元组取自src=

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

&lt;iframe name="some_name"&gt; 的情况下,其内容是由父页面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 :)【参考方案2】:

Content-Security-Policy 框架祖先可以包含多个来源,因此您可以包含整个允许列表。由于所有祖先都需要通过框架祖先检查,因此您必须包含多个来源才能使您的 salesforce 示例正常工作,请参阅https://www.w3.org/TR/CSP3/#frame-ancestors-navigation-response

X-Frame-Options ALLOW-FROM 只能包含一个来源,由浏览器决定是否所有祖先,顶部或底部必须匹配,请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options。

【讨论】:

这正是问题中描述的我正在做的事情。我的问题是当“中间”有一个没有 src 的 iframe 时如何使用这些标头?

以上是关于没有 src 的 iframe 的 Content-Security-Policy (CSP) 框架祖先的主要内容,如果未能解决你的问题,请参考以下文章

js获取iframe框架中src所指向的文件的內容 .

cordova iOS blank iframe iphone iframe 白屏 ios iframe 白屏

接口去除标签并且提取图片视频

cordova iOS blank iframe iphone iframe 白屏 ios iframe 白屏

没有 src 但仍有内容的 iframe?

js如何获取跨域iframe 里面content