【问题标题】:Why can javascript not alter the dom of an iframe, but the browser tools can?为什么 javascript 不能改变 iframe 的 dom,但浏览器工具可以?
【发布时间】:2015-04-17 15:06:20
【问题描述】:

在我来自 donain A 的网页中,我在 iframe 中显示了来自域 B 的另一个网站。我认为网站B可以选择一些新鲜的颜色,所以我想编辑body的背景颜色并将其更改为蓝色。

如果我通过获取 iframe 的 DOM,然后编辑正文的背景颜色来尝试使用 javascript,我会收到安全错误,因为网站 B 在另一个域上。

如果打开开发者工具 (F12) 我只是在那里编辑 dom 就可以了。

所以我真的很困惑:为什么浏览器允许我手动编辑 dom,而不是通过 javascript?显然,这个跨域策略应该暗示的任何类型的安全措施都会被任何可以按 F12 的人所破坏,因此浏览器阻止访问是没有意义的。

或者,我可以用我的服务器抓取网站 B,然后将(非法)检索到的 HTML 放入我自己的网站(颜色更好)。我再次绕过了跨域策略,因此做了跨域策略禁止我做的事情。

作为一个相关问题,有没有办法在 iframe 中使用 javascript 更改元素的颜色而不会出现跨域错误?

【问题讨论】:

  • 因为 Javascript 可以是邪恶的并攻击你,而浏览器假设你不会是邪恶的并攻击自己。 (这个假设是not always true
  • @SLaks 湿件,总是最薄弱的环节 :(
  • @adeneo 我了解该政策,但为什么浏览器工具仍让我绕过它?此外,我也可以抓取网站并对其进行编辑。政策在这里有什么好处?

标签: javascript html iframe xss


【解决方案1】:

为什么浏览器允许我手动编辑 dom

如果是您的浏览器。它信任你。

但不是通过javascript?

您的浏览器不信任在域 A 上编写 JavaScript 的人有权访问在域 B 上编写页面的人提供给您的数据。

如果域 A 是您在电子邮件中发现链接的随机站点,而域 B 是 您的网上银行会怎样?

重要的是要记住可能涉及三个人:

  • 控制浏览器的人
  • 控制域 A 的人
  • 控制域 B 的人

其中一些可能是同一个人,但可能不是,浏览器无法分辨。

或者,我可以用我的服务器抓取网站 B

在这种情况下,域 B 首先信任域 A 的数据。

域 A 无法访问您的浏览器可以访问的内容(例如域 B 的 cookie),这可能会导致域 B 向您提供不同的数据(例如您自己的银行记录)。

作为一个相关问题,是否可以在 iframe 中使用 javascript 更改元素的颜色而不会出现跨域错误?

只有在域 B 的配合下,您才可以使用postMessage 请求域 B 更改颜色。 (域 B 必须注册一个事件监听器才能听到请求)。

【讨论】:

  • 假设不存在同源策略,我在 iframe 中打开了一个银行网站。我可以在自己的网站上写什么 javascript 来偷钱?
  • @user1884155 iframe.src = 'client_internet_bank.com'; 然后加载后,iframe.contentDocument.getElementById('login_form').addEventListener('submit', function (e) {/* send login data elsewhere before proceeding*/}) .. 但不要担心 - 这不会在任何主流浏览器上工作 :)
  • 您可以编写针对特定银行网站的 javascript,它可以抓取帐号或更通用的东西,只跟踪您要去的网站并记录您所有的鼠标点击/击键,在一天的浏览之后基本上可以让任何人访问您的所有密码。
  • 假设和简单化:document.frames[0].forms[0].recipient = 12345; document.frames[0].forms[0].sortcode = 401212; document.frames[0].forms[0].amount = 12345.00; document.frames[0].forms[0].submit()= 12345;
【解决方案2】:

Same Origin Policy 可防止恶意 Javascript 与其他域交互。
否则,攻击者可能会编写与您的电子邮件或银行帐户进行静默交互的代码。

开发工具假定您不会作恶并攻击自己。 (这个假设是not always true

【讨论】:

  • 但是我在域 A 中,我要从域 B 更改网站?为什么它不信任我自己的javascript(来自域A)并且不信任来自域B(不是我自己的)的内容
  • 无权假定域A中的JavaScript没有恶意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多