IFRAME 没问题;都市传说不是。
当您“使用 iframe”时,它不仅仅意味着一件事。这是一个词汇歧义。根据用例,“使用 iframe”可能意味着以下情况之一:
- 其他人在 iframe 中显示您的内容
- 您在 iframe 中显示 domeone else 的内容
- 您在 iframe 中显示自己的内容
那么,这些案例中的哪些会让您面临风险?
1.其他人显示您的内容
这种情况几乎总是被称为 clickjacking - 模仿您网站的行为,试图引诱您的用户使用虚假 UI 而不是真实网站。这里的误解是 您使用或不使用 iframe 无关紧要,这根本不是你的电话 - 这是 其他人使用 iframe,你无能为力。顺便说一句,即使他们并不特别需要它们:他们可以以任何其他方式复制您的网站、窃取您的 html、从头开始实施假网站等。
因此,放弃 iframe 以防止点击劫持 - 这完全是零意义。
2。您显示其他人的内容
在上述三篇中,这是唯一一篇有些冒险,但你一直阅读的大部分可怕文章都来自于same-origin policy 推出之前的世界。目前,仍然不建议将任何网站包含在您自己的网站中(谁知道明天会包含什么?),但如果它是可信赖的来源(accuweather、雅虎股票信息等),您可以放心地这样做。这里最大的禁忌是让用户(因此,恶意用户)控制 iframe 的src,告诉它要显示什么。 不要让用户将任意内容加载到您的页面中,这是万恶之源。但这是真的有或没有 iframe。这与他们无关;使用script 或style 标签可能会发生这种情况(祝你好运,没有它们) - 问题是你把它们放出来了。您网站上包含任何用户提供的内容的任何输出都是有风险的。如果不对其进行清理(去 HTML 化),您基本上是在为 XSS 攻击打开您的网站,任何人都可以在您的内容中插入 <script> 标签,这是个坏消息。比如,baaaad 新闻。
永远不要输出任何用户输入而不确保它是无害的。
因此,虽然 iframe 又是无辜的,但要点是:除非您信任来源,否则不要让它们显示第 3 方内容。换句话说,不要在您的网站中包含不受信任的内容。 (另外,不要跳到快速接近的货运列车前面。Duh。)
3.您在 iframe 中显示自己的内容
这个显然是无害的。您的页面是可信的,iframe 的内部内容是可信的,不会出错。 iframe 不是魔术。它只是一种封装技术,您绝对有权在沙箱中展示您的一段内容。这很像将它放在 div 或其他任何东西中,只是它会有自己的文档环境。
TL;DR
- 案例 1:不管你是否使用 iframe,
- 案例 2:不是 iframe 问题,
- 案例 3:绝对无害的案例。
请不要再相信都市传说了。事实上,iframe-s 是完全安全的。你也可以责怪script标签很危险;当恶意插入站点时,任何事情都可能导致麻烦。但是如何他们首先插入它?如果有人能够将 html 内容注入站点,则必须存在现有的后端漏洞。将一项技术归咎于常见攻击(而不是找到真正的原因)只是保持安全漏洞开放的同义词。找到火后面的龙。
未经处理的输出不好; iframe 不是。
停止猎巫。
更新:
有一个属性叫sandbox,值得一试:https://www.w3schools.com/tags/att_sandbox.asp
更新 2:
在您对 iframe 发表评论之前 - 请考虑一下锤子。锤子很危险。它们看起来也不是很好,它们很难游泳,对牙齿有害,电影中的某个人曾经滥用锤子造成严重伤害。此外,只是用谷歌搜索它,大量文献说凡人甚至不能移动它们。如果这看起来是永远不再使用锤子的好理由,那么 iframe 可能不是你真正的敌人。很抱歉要越野。