为什么javascript不能改变iframe的dom,但浏览器工具可以?

为什么javascript不能改变iframe的dom,但浏览器工具可以?,javascript,html,iframe,xss,Javascript,Html,Iframe,Xss,在donain A的网页中,我在iframe中显示了域B的另一个网站。我认为网站B可以选择一些新鲜的颜色,所以我想编辑身体的背景色,并将其改为蓝色 如果我尝试使用javascript获取iframe的DOM,然后编辑主体的背景色,我会得到一个安全错误,因为网站B位于另一个域上 如果打开开发工具(F12),我只需在那里编辑dom,就可以了 所以我真的很困惑:为什么浏览器允许我手工编辑dom,而不是javascript?显然,这个跨域策略所暗示的任何类型的安全措施都会被任何可以按F12的人破坏,因此

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

如果我尝试使用javascript获取iframe的DOM,然后编辑主体的背景色,我会得到一个安全错误,因为网站B位于另一个域上

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

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

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

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

防止恶意javascript与其他域交互。
否则,攻击者可以编写与您的电子邮件或银行帐户进行无声交互的代码

开发工具假定您不会邪恶并攻击自己。(这一假设是正确的)

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

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

但不是通过javascript

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

如果域A是您在电子邮件中找到的链接的随机站点,而域B是您的网上银行,该怎么办

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

  • 控制浏览器的人
  • 控制域A的人
  • 控制域B的人
其中一些人可能是同一个人,但他们可能不是,浏览器也无法分辨

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

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

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

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


只有在域B的合作下,在这种情况下,您可以使用
postMessage
请求域B更改颜色。(域B必须注册一个事件侦听器,这样它才能听到请求)。

因为Javascript可能是邪恶的并攻击你,而浏览器认为你不会是邪恶的并攻击你自己。(这个假设是)@SLaks-wetware,总是最薄弱的环节:(@adeneo我理解这个策略,但是为什么浏览器工具让我绕过它呢?另外,我也可以刮取网站并编辑它。这个策略在这里有什么好处?但是我在域A中,我正在从域B更改网站?为什么它不信任我自己的javascript(来自域A)并且不信任域B(不是我自己的)的内容它无权假设域A中的JavaScript不是恶意的。比方说,同源策略不存在,我在iframe中打开了一个银行网站。我可以在我自己的网站上写什么JavaScript来偷钱?@user1884155
iframe.src='client_internete_bank.com'
加载后,
iframe.contentDocument.getElementById('login_form')。addEventListener('submit',函数(e){/*在继续之前将登录数据发送到其他地方*/})
。但是不要担心-这在任何主流浏览器上都不起作用:)你可以针对特定银行的网站编写javascript,可以刮取账号,或者更一般的东西,只跟踪你要去的网站,记录你所有的鼠标点击/按键,在一天的浏览之后,基本上可以让任何人访问你的所有密码。假设和简单地说:
 document.frames[0]。表单[0]。收件人=12345;document.frames[0]。表单[0]。sortcode=401212;document.frames[0]。表单[0]。金额=12345.00;document.frames[0]。表单[0]。提交()=12345;