无法访问 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/proxya.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 内容(同源策略)的主要内容,如果未能解决你的问题,请参考以下文章

用户脚本绕过访问嵌套 iframe 的同源策略

webdriver.io 无法为 iframe 禁用同源策略

同源和跨域

跨域 iFrame 中的凭据填充

同源策略与 CORS 的用处

跨域访问和同源策略