为什么iframe被认为是危险和安全风险?

176

为什么iframe被认为是危险的和安全风险?能否举一个恶意使用它的案例?


8
听起来像是无稽之谈。你的浏览器窗口基本上就是一个大的iframe。 - Bill Criswell
1
这个问题已经在stackoverflow上被问过了。 - Samich
2
@Samich - 不,那是关于最佳实践,而不是特定的安全问题(我能想到的唯一安全问题源自第三方使用iframe)。 - Quentin
不是因为安全性的问题,而是因为它不被视为最佳实践,请参见:https://dev59.com/IHNA5IYBdhLWcg3wIqLr。当人们还使用表格进行设计时,它们更受欢迎,但使用div元素几乎可以消除对iframes的需求。 - RandomUs1r
1
有趣的是,近十年后出现了一篇文章,建议将包含表单的所有内容放入iframe中,与所有第三方JavaScript隔离,以保护表单不被收集。https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8cb347c5b5 - GordonM
7个回答

181

IFRAME

元素如果您的网站嵌入到恶意网站的IFRAME中可能存在安全风险。搜索谷歌"点击劫持"获取更多详细信息。请注意,无论您是否使用<iframe>,这都不重要。唯一真正的保护措施是添加HTTP头X-Frame-Options: DENY并希望浏览器能够正确处理。

如果有人声称在您的网站上使用

1
不错,但是“这是因为来自同一源(同一域)的内容被允许访问父级内容DOM(实际上在“宿主”文档中执行JavaScript)。 ”不应该被重新表述为包含XSS漏洞的(父级)文档对(子级)iframe中的文档的影响吗? - Shuzheng
1
@Shuzheng,漏洞是双向的,如果在页面上使用<iframe>,它允许从iframe内部的内容扩展漏洞到主机文档。问题是关于<iframe>是否危险,如果主机文档存在XSS漏洞,则确实不需要<iframe>元素。 - Mikko Rantalainen
这个答案可能需要更新,因为Content-Security-Policy取代了X-Frame-Options。 - Quentin

120

一旦你展示来自另一个域名的内容,实际上就是在相信该域名不会提供恶意软件。

iframe 本身没有问题。如果你控制 iframe 的内容,它们是完全安全的。


26
只要你从另一个域链接到内容等等... 这与 iframe 没有任何特定关系。 - Quentin
7
一个正确实现的浏览器(也称为用户代理)不会允许iframe内容泄漏到iframe之外。如果主文档(包含<iframe>元素的文档)具有适当的样式并提示iframe包含不受信任的内容,则没有问题,当然,忽略浏览器中真正的漏洞。简而言之,一个<iframe>与<a href>一样安全。 - Mikko Rantalainen
2
同域下的隐藏iframe安全吗? - Ciaran Gallagher
2
如果隐藏的同域名 <iframe> 内容可以被攻击者修改,那么可能会导致安全风险。这将允许攻击者将 XSS 攻击扩展到引用该 <iframe> 的您网站上的任何页面上。有关详细信息,请参见 https://dev59.com/3Ww05IYBdhLWcg3wXAmF#9428051。 - Mikko Rantalainen
3
有趣的是,iFrame实际上可能是一种对抗反向攻击的有用保护措施。如果您的网站上有很多第三方脚本,您需要将表单与它们隔离开来。建议的做法之一是将表单放在自己的最小页面中,不包含第三方JavaScript,并在主机页面中使用iframe显示它。https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8cb347c5b5 - GordonM
1
基本上,Google只是一个大型的恶意软件分发引擎。@Quentin - NotoriousPyro

21

假设您控制了跨域的iFrame,因为如果您自己控制它,风险可能会更低。

  • 点击劫持是一个问题,如果您的站点被包含在iframe中
  • compromised iFrame可以显示恶意内容(想象一下iFrame显示登录框而不是广告)
  • 包含的iframe可以进行某些JS调用,例如alert和prompt,这可能会使用户感到恼怒
  • 包含的iframe可以通过location.href重定向(天啊,想象一下第三方框架将客户从bankofamerica.com重定向到bankofamerica.fake.com)
  • 3p框架内部的恶意软件(Java / Flash / ActiveX)可能会感染您的用户

1
你可以将 Flash 从列表中划掉 :P - Zimano

21

IFRAMEs没问题,但都市传说不行。

当你“使用IFRAMEs”时,并不只代表一件事。这是一个词义模糊。根据使用情况,“使用IFRAMEs”可能意味着以下几种情况之一:

  1. 别人在IFRAME中显示你的内容
  2. 你在IFRAME中显示别人的内容
  3. 你在IFRAME中显示自己的内容

那么这些情况中哪些会给你带来风险呢?

1. 别人在IFRAME中显示你的内容

这种情况几乎总是被称为点击劫持 - 模仿你网站的行为,试图诱使你的用户使用一个假的用户界面而不是真正的网站。这里的误解在于,你是否使用IFRAMEs并不重要,这只是你的决定 - 是别人使用IFRAMEs,你对此无能为力。顺便说一下,即使他们不需要特别使用IFRAMEs:他们可以通过其他方式复制你的网站,窃取你的HTML,从头开始实现一个假网站等等。

因此,为了防止点击劫持而放弃使用IFRAMEs - 这完全没有意义。

2. 你展示了别人的内容
这三个中,这是唯一一个有点风险的,但你经常读到的吓人文章大多来自同源策略引入之前的世界。现在,虽然还不建议将任何网站包含到你自己的网页中(谁知道明天会有什么内容?),但如果是可信的来源(如accuweather、雅虎股票信息等),你可以放心使用。在这里,绝对不允许用户(因此也包括恶意用户)控制iframe的src,告诉它要显示什么。不要让用户加载任意内容到你的页面中,这是所有问题的根源。但这与是否使用iframe无关,它与使用scriptstyle标签(没有它们你就没法生活了)一样,问题在于你让它们出现。你的网站上任何包含用户提供内容的输出都是有风险的。如果不对其进行清理(去除HTML标记),你基本上是在为XSS攻击打开你的网站,任何人都可以在你的内容中插入一个<script>标签,这是个坏消息。真的,非常糟糕的消息。

绝对不要输出任何用户输入,除非你确保它是无害的。

所以,虽然iframes再次变得无害,但要记住:除非你信任来源,否则不要让它们显示第三方内容。换句话说,不要在你的网站中包含不受信任的内容。(还有,不要跳到快速接近的货车前面。呃。)

3. 在iframe中显示自己的内容

这个显然是无害的。你的页面是可信的,iframe内部的内容是可信的,没有什么会出错。Iframe并不是什么魔术技巧;它只是一种封装技术,你完全有权利在一个沙盒中显示你的一部分内容。它就像把它放在一个div或其他任何地方一样,只是它有自己的文档环境。

总结

  • 案例1:使用iframes与否无关,
  • 案例2:不是iframes的问题,
  • 案例3:绝对无害的情况。
请停止相信都市传说。事实是,iframe是完全安全的。你也可以责怪script标签是危险的;任何东西在网站中恶意插入都可能引起麻烦。但是,他们是如何首次插入的呢?如果有人能够将HTML内容注入网站,那肯定存在后端漏洞。将一个技术组件归咎于一种常见攻击(而不是找到真正的原因),只是等于让安全漏洞一直存在。要找到火灾背后的幕后黑手。

不经过消毒的输出是不好的;但iframe并非如此。


更新:
有一个叫做sandbox的属性,值得一看:https://www.w3schools.com/tags/att_sandbox.asp

1
我不太同意,在第三种情况下,使用 iframe 嵌入自己的内容通常不是一个好主意。这是一个糟糕架构解决方案的标志。它可能会导致维护网站时出现所有问题,例如:如果您需要在 iframe 中包含全局样式/脚本怎么办?如何处理可用性问题(移动设备、屏幕阅读器等)?跨域严格限制可能会引起一些信任问题,因此我们不能假设在 iframe 内部,一切都应该“正常工作”... - Mr. Duc Nguyen
2
@Mr.DucNguyen 这些只是假设、想象中的糟糕例子和对可能不存在问题的不清晰引用。我认为仅基于恐惧和感知到的“糟糕架构迹象”而拒绝使用某种技术是非常糟糕的做法。一个人可能有非常合理的理由使用iframe(甚至是复数),是的,屏幕阅读器和便携式设备可以得到很好的管理,这不是你是否使用iframe的问题。此外,“跨域严格限制”不应影响您自己的内容。因此,你的结论是没有支持的。 - dkellner
1
@Mr.DucNguyen 再次强调,我不认为这些是实际问题或糟糕设计的迹象,但好吧,就像你说的 - 你的意见 :) 意见总是受欢迎的。 - dkellner
1
#1并不完全准确。Iframes确实会引入漏洞,超出了制作虚假网站的范畴,因为iframes可以访问其域中的cookies和localstorage。例如,您已登录银行账户,而您的银行服务器允许跨源iframes。有人可以制作一个恶意网站,其中包含一个银行的不可见全屏iframe,并让用户点击与银行网站上的按钮相对应的某些位置来发送资金。 - nnsk
1
@dkellner 实际上这是一个 iframe 的问题;虚假网站无法像 iframe 一样访问目标网站的 cookie,因此无法进行此类攻击。为了防止此类攻击,通常建议通过 X-Frame-Options 拒绝 iframes,但如果需要使用 iframes,则在 iframe 中添加验证码可能已经足够。 - nnsk
显示剩余8条评论

4
当人们提到iframe时,很少会想到“危险”和“安全风险”这两个词……但它们可以被用于点击劫持攻击。

0

2
这些并不是特定于iframe;你同样可以说“脚本标签容易受到XSS攻击”,这些攻击首先需要利用已经存在的漏洞。 - dkellner
2
人们说这是真的,但XFS不是一个iframe问题。这主要是在旧版本的IE浏览器中存在的浏览器漏洞。可以通过禁止某些旧版本的IE和任何其他受影响的浏览器在iframe中来解决这个问题。 - nnsk

-1

我来这里是为了弄清楚一个远程网站的HTML/CSS/JS是否可以被任何人在本地获取,比如通过浏览器 > 设置 > 查看页面源代码或开发者工具,因为我打算使用<iframe> 来确保客户端安全性。我没有找到明确的答案。我在MDM中查过了,没有找到防止访问<iframe>内容的方法。我做了一个实验,发现两种方法都可以查看到远程源代码。所以,<iframe>无法提供客户端安全性。


这并没有真正回答问题。如果你有其他问题,可以点击提问来提出。如果你想在这个问题有新的回答时收到通知,你可以关注这个问题。你也可以添加悬赏来吸引更多关注。- 来自评论 - Sweta Jain
这并没有真正回答问题。如果你有其他问题,可以点击提问来提问。如果你想在这个问题有新的回答时收到通知,你可以关注这个问题。你也可以添加悬赏来吸引更多的关注。- 来自评论 - undefined
我的回答确实没有回答原始问题,因为那个问题已经得到了解答。我的回答是一个密切相关的问题,这个问题让我通过网络搜索来到了这个页面。客户安全是一个重要的问题,在这个领域几乎没有什么帮助,所以我觉得我的回答在这里是相关的。 - David Spector
我认为这些是好的观点,所以我会发表一个新问题,给出我的答案,然后删除我在这里的离题帖子,如果我可以的话。 - David Spector
我觉得这些都是很好的观点,所以我会发一个新的问题,给出我的答案,然后尽量删除我在这里发的与主题无关的帖子。 - undefined
我使用“询问问题”按钮将此作为问题提问(https://stackoverflow.com/questions/76643916/can-the-source-html-css-js-of-a-remote-site-shown-in-an-iframe-be-accessed/76643917#76643917),但到目前为止,它及其答案都收到了-1的评分,并没有什么解释。这是否意味着Iframe可以提供安全性?我不知道。 - David Spector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接