javascript - JavaScript 可以读取 iframe 的内容吗?

标签 javascript html

JavaScript 是否可以读取嵌入同一页面的 iframe 的内容?

如果是的话,那么同源策略可以被绕过吗?我知道 XMLHttpRequest;它不能用于通过同源策略(例如 HTTP GET 请求)从其他站点获取数据。

读取 iframe 的内容将有效地提供与(不受限制的)XMLHttpRequest 从任意网站获取资源相同的功能?

最佳答案

简短的回答是,JavaScript 只能查看来自同一域的 iframe。因此,不,您不能使用 iframe 获得不受限制的跨域访问。

更长的答案是,如果您想自己测试一下,请安装一个简单的网络服务器。您将需要 < 2 分钟。 Here's a bunch

编辑/etc/hosts 文件或 C:\Windows\System32\Drivers\etc\hosts 文件并添加

127.0.0.1  first.com
127.0.0.1  second.com

创建一个包含index.html 和iframe.html 的文件夹。在 index.html 中放入一些 JavaScript 来尝试查看 iframe.html 并将 iframe.html 作为 iframe 包含进来

<!-- index.html -->
<iframe src="http://second.com:8080/iframe.html></iframe>
<script>
   const iframe = document.querySelector('iframe');
   console.log(iframe.contentDocument.body.innerText);
</script>

<!-- iframe.html -->
<div>Hello world</div>

使用该文件夹运行您的服务器。在浏览器中转到 http://second.com/8080:index.html

打开开发工具( chromefirefox ),查看控制台,您应该看到

Hello World

这有效,因为它们都在同一个域中。

现在将浏览器中的 URL 更改为 http://first.com:8080/index.html

这次你会看到类似的东西

VM41:66 Uncaught DOMException: Failed to read the 'contentDocument' 
 property from 'HTMLIFrameElement': Blocked a frame with origin 
"http://first.com:8080" from accessing a cross-origin frame.
at HTMLIFrameElement.contentDocumentDesc.get [as contentDocument] 

注意:根据您使用的服务器,您需要更改上面的 8080 以匹配您的服务器使用的端口。

关于javascript - JavaScript 可以读取 iframe 的内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49306615/

相关文章:

javascript - Jquery点击函数无法识别

css - 使用 div 在左侧或右侧对齐网页分区的正确方法

带有算术的javascript运算符给出了意想不到的结果

javascript - 如何找到在使用 Javascript 动态创建的某些字段中输入的值的总和?

javascript - 在 IE8 及更高版本中获取输入字段中的选定文本

jquery - 无权访问数据属性

javascript - php认证跨站文件上传

javascript - 如何获取一个类的所有元素而不是另一个类的所有元素?

javascript - 显示和隐藏根据内容调整大小的 iframe

html - seo yoast 或 header.php 的静态首页?