无法访问 iframe 内容(同源策略)
Posted
技术标签:
【中文标题】无法访问 iframe 内容(同源策略)【英文标题】:Unable to access iframe content (same-origin policy) 【发布时间】:2014-01-23 11:40:06 【问题描述】:我有以下页面
<!DOCTYPE html>
<html>
<script type="text/javascript">
function loopLink(i)
window.open($('#iframe_a').contents().find('.image-navigator-mid a').attr('href'),'iframe_a');
setTimeout(function()
if (i < 3) loopLink(i+1);
, 5000);
// Wait for the page to load first
window.onload = function()
var a = document.getElementById("mylink");
a.onclick = function()
loopLink(0);
return false;
</script>
<iframe src="http://nanofate.us/content/fate-new-hair-style#node-inner" name="iframe_a" id="iframe_a"></iframe>
<br />
<a id="mylink" href="">Execute</a>
这个想法是,在它的当前形式中,当您单击执行时,javascript 将导致 iframe 使用“上一个”链接 4 次,每次等待 5 秒,但是当我单击链接时它只是重新加载页面即使在等待 10 秒后,iframe 也没有执行任何操作
我想知道我做错了什么
【问题讨论】:
而 iframe 显示的页面与该站点来自同一域? @adeneo 不,我要做的是一个页面,当您运行脚本时,它将循环整个画廊并下载每个图像,但首先我需要能够循环[尽管整个画廊 查看同源策略javascript.info/tutorial/same-origin-security-policy 如果不是来自同一个域,出于安全原因,您无权访问 iframe,请参阅上面的链接,不,没有办法绕过它。 【参考方案1】:由于Same Origin Policy 的限制,如果 iframe 正在运行来自另一个域的页面,您将无法访问它的内容。有相同域策略的解决方案,例如
通过代理打开页面查看Tomodo。这只是给您一个提示,他们如何使用代理绕过同源策略约束并访问 iframe 内容。所以实现思路是这样的
创建代理并将其托管在a.com/proxy
在a.com/index.html
托管您的主页
现在,请求您的代理向您提供 iframe_url 的内容,类似于 a.com/proxy?url=iframe_url.com
请注意,这不是一项简单的任务,您可能需要在代理中处理很多情况,例如处理相对 URL、通过 iframe_url 读取 cookie 等等等等。 所以只有在你迫切需要的时候才去买它。
另一种解决方案可能是这样的:
如果您想为特定域下载一些图像,只需为您询问服务器端代码即可。您的后端代码将获取页面的 html 并使用一些 HTML 解析器,例如
BeautifulSoup for python (Documentation Link) Jsoup for Java (Documentation Link)解析img标签并提取源并获取图像并下载它们。
PS:只是为了一些好的信息,请阅读Ways to circumvent same origin policy
【讨论】:
【参考方案2】:我认为你正在做的事情是受同源政策的约束。这应该是您收到权限被拒绝类型错误的原因。
【讨论】:
以上是关于无法访问 iframe 内容(同源策略)的主要内容,如果未能解决你的问题,请参考以下文章