google-chrome - 没有 src 的 iframe 的 Content-Security-Policy (CSP) 框架祖先
问题描述
我想阻止在 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 标头。
解决方案
该frame-ancestors
指令适用于起源元组。
万一
<iframe src=http://...
事情很容易,并且从src=获取原始元组。如果
<iframe src=data:-Url
原点不透明,frame-ancestors
则跳过它并检查父项。如果
<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 中。
推荐阅读
- javascript - 如何在页面滚动时使第二个 div 动画
- java - Android:sharedPreferences URI 在应用程序启动时给出 null
- python-3.x - Dataframe Pandas 每行绘制图表
- c# - System.ArgumentException:“参数无效”内存流到图像
- spring-boot - 手动确认 Kafka Batch 侦听器。我在多线程方面做错了什么?
- jmeter - 如何从调试采样器中提取动态最后一个值并在下一个请求中传递它?
- c++ - 如何向 QMenu 添加按钮,或在自定义 QWidgetAction 中重现 QMenu
- authentication - 如何在 Angular 9 中创建linkedin登录?
- routing - 路由器是否使用 ARP 表?
- php - Nodejs 服务器 SSL_ERROR_RX_RECORD_TOO_LONG 的 Nginx 反向代理