获取跨域 iframe 的 DOM 内容

IT技术 javascript jquery html iframe
2021-01-12 20:47:00

我有一个跨域站点的 iframe。我想读取 iframe 的 DOM,我认为这是可能的,因为使用检查器,我什至可以修改 iframe 的 DOM。然而,我尝试阅读它的每一种方式都遇到了同源策略。我想要的只是从 iframe 加载到本地 DOM 中的内容。我认为它会像 一样简单$(document.body).find('iframe').html(),但这会返回空字符串。

我真的希望有一种方法可以做到这一点,因为我过去几天一直在做的工作是基于这是可行的。

谢谢

5个回答

你不能。XSS 保护javascript 无法读取跨站点内容。没有主流浏览器会允许你这样做。我很抱歉,但这是一个设计缺陷,你应该放弃这个想法。

编辑

请注意,如果您对加载到 iframe 中的网站具有编辑权限,则可以使用postMessage(另请参阅浏览器兼容性

如果您的意思是设计(流程)缺陷,那么不,这不是缺陷,这是为了安全而实施的。
2021-03-25 20:47:00
注意:您可以使用 window.postMessage 在 iframe 和主窗口之间进行通信。
2021-03-28 20:47:00
我知道它是出于安全原因实施的,我的意思是基于此概念的设计缺陷(为此而感谢)。
2021-03-30 20:47:00
作为参考,跨域同源策略意味着主机名、端口和协议都必须相同 - en.wikipedia.org/wiki/Same-origin_policy(例如 app1.example.com 和 app2.example.com 是不同的;example.com 和 www.example.com 是不同的)
2021-03-31 20:47:00
在那种情况下,我误解了
2021-04-07 20:47:00

有一个简单的方法。

  1. 您创建了一个 iframe,它的源代码类似于“http://your-domain.com/index.php?url=http://the-site-you-want-to-get.com/unicorn

  2. 然后,您只需获取此 url$_GET并显示内容file_get_contents($_GET['url']);

您将获得一个域与您的域相同的 iframe,然后您将能够使用$("iframe").contents().find("body")来操作内容。

如果出于某种原因您不想要 iframe,您也可以对您的 php 进行 ajax 调用
2021-03-15 20:47:00
抱歉来晚了,没注意。1. 创建一个 php 页面,通过 GET 参数显示您想要的页面内容。content.php <?php echo file_get_contents($_GET['url']); ?> 2. 然后,在您的主页面中,添加将加载此页面的 iframe。<iframe src="content.php?url=http://google.com"> 3.它会在iframe中显示想要的页面。Content.php 来自您的域,因此您可以使用 JS 操作 iframe 内容,而不会违反跨域策略。var $iframeBody = $("iframe").contents().find("body"); $iframeBody.css("background", blue");
2021-03-18 20:47:00
能否请您详细解释一下。非常感谢你@@
2021-03-21 20:47:00
请注意,如果您使用此方法,请务必小心,因为这将允许您的服务器用作事实上的代理。因此,这应该在身份验证之后和/或应该限制允许的网站列表。
2021-03-26 20:47:00
@Bharata:错了。如果将文件内容加载到 iframe 中,则可以像普通的同源 iframe 一样访问其内部 DOM。
2021-04-05 20:47:00

如果您有权访问iframe页面,则可以使用诸如easyXDM 之类的东西在 iframe 中进行函数调用并返回数据。

如果您无权访问 iframe 页面,则必须使用服务器端解决方案。使用 PHP,你可以做一些快速而肮脏的事情,比如:

    <?php echo file_get_contents('http://url_of_the_iframe/content.php'); ?> 
感谢分配的想法,这个答案和这个 - stackoverflow.com/a/29501376/1521606,帮助我创建了一个解决方法!干杯
2021-03-15 20:47:00
@devmatt,file_get_contents($_GET['url'])你可以获取页面内容,但是你不能获取DOM内容!错误的答案。
2021-03-24 20:47:00
先生你是学者和绅士
2021-03-25 20:47:00
在这种情况下,这是不可能的。有关更多详细信息,请参阅en.wikipedia.org/wiki/Same_origin_policy
2021-03-28 20:47:00
我无权访问 iframe 页面,服务器端解决方案几乎不可能,因为我使用的是 cocoahttpserver(服务器在 iphone 上运行)
2021-04-07 20:47:00

如果您有权访问加载的域/iframe,那么您可以使用 window.postMessage 在 iframe 和主窗口之间进行通信。

在 iframe 中使用 JavaScript 读取 DOM,并通过 postMessage 将其发送到顶部窗口。

更多信息:https : //developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

我们如何使用js读取iframe中的DOM?有可能,不是吗?
2021-03-14 20:47:00
您可以像往常一样阅读 DOM。例如 document.getElementsByTagName("BODY")[0]; 之后,使用 window.postMessage 将您刚刚在 iframe 窗口中读取的 DOM 对象发送到托管 iframe 窗口的窗口。
2021-04-03 20:47:00

有一个解决方法来实现它。

  1. 首先,将您的 iframe 绑定到具有相对 url 的目标页面。浏览器会将 iframe 中的站点视为与您的网站相同的域。

  2. 在您的 Web 服务器中,使用重写module将请求从相对 url 重定向到绝对 url。如果您使用 IIS,我建议您检查IIRF module

他的意思是在服务器上重写请求,所以客户端不知道它不是正确的url
2021-03-16 20:47:00
您的意思是服务器将 http 重定向发送到国外位置吗?如果是这样,它至少在 Firefox 9 中不起作用。我认为其他浏览器也不会被愚弄
2021-03-24 20:47:00