Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使同一域iframe安全_Javascript_Iframe_Security - Fatal编程技术网

Javascript 使同一域iframe安全

Javascript 使同一域iframe安全,javascript,iframe,security,Javascript,Iframe,Security,tl;dr我可以在iframe上安全地执行不受信任的脚本吗 背景故事: 我正在努力。许多旧浏览器不支持Web Workers,这意味着我提出的当前解决方案不是最优的 我想我可以创建一个并在其中加载一个脚本。该脚本将执行一个JSONP请求(创建一个脚本标记),该请求将向主页发布一条消息。主页面将获取消息,执行回调并销毁iframe。我设法做到了 问题在于,由于iframe位于同一个域上,因此注入的脚本仍然可以通过.top或.parent等访问外部作用域 是否有任何方法可以创建无法访问父作用域上数据

tl;dr我可以在iframe上安全地执行不受信任的脚本吗

背景故事: 我正在努力。许多旧浏览器不支持Web Workers,这意味着我提出的当前解决方案不是最优的

我想我可以创建一个
并在其中加载一个脚本。该脚本将执行一个JSONP请求(创建一个脚本标记),该请求将向主页发布一条消息。主页面将获取消息,执行回调并销毁iframe。我设法做到了

问题在于,由于iframe位于同一个域上,因此注入的脚本仍然可以通过
.top
.parent
等访问外部作用域

是否有任何方法可以创建无法访问父作用域上数据的iframe? 我想创建一个iframe,其中通过脚本标记添加的脚本将无法访问父窗口(和DOM)上的变量。我尝试了类似
top=parent=null
的方法,但我真的不确定这是否足够,可能还有其他解决方法。我试着运行一个。。。在循环中,但我的函数停止工作,我无法找出原因

注意:


我知道网络工作者是一个更好的隔离环境。我知道JSONP是一种“糟糕”的技术(我甚至告诉我他今天从来没有使用过它)。我试图为需要执行JSONP查询的场景创建一个安全的环境;医生编号

任何不受信任的脚本都可以窃取cookie(比如会话id!),或者从DOM读取信息,比如信用卡输入字段的值

JavaScript依赖于所有代码都是可信代码的安全模型。任何从另一个域访问的尝试都需要显式的白名单


如果你想沙箱你的iframe,你可以从另一个域服务页面。这意味着你不能共享会话或进行任何形式的交流,因为它可能被滥用。这就像包括一个无关的网站。即使如此,如果允许不受信任的JavaScript,也有可能被滥用。例如,您可以执行以下操作:
window.top.location.href=http://my.phishing.domain/';,用户可能不会注意到重定向。

您不能真正删除引用,设置null将自动失败,并且总是有办法获取对父dom的引用

无法删除
frameElement
frameElement.defaultView
等引用。根据浏览器的不同,尝试这样做可能会以静默方式失败,也可能引发异常


不过你可以看看。

怎么办?它是有效的,阻止我删除iframe中对父窗口的所有引用的核心问题是什么?我试过这样做,但没有成功,但我想确信这是不可能的。在执行第二个脚本标记之前,您能给我一个不能设置为null的例子吗?这会影响安全性?在您的示例中,我不能执行
window.top=null?我不知道,伙计,你一次问了3个问题。你指的是什么问题?我只问一件事:“为什么答案是否定的?”,你的论点是脚本可能会窃取信息,你可以通过示例
window.top….来展示它。我是说我可以将
window.top
设置为空。我想知道为什么这对我没有帮助。我不是说你错了,我只是想了解内在的问题是什么。我不知道。。可能有办法解决这个问题。例如,你可以使用
window.parent
直到你到达顶端。也许你也可以阻止它,但也许也有办法。至少您可以执行
window.location.href
并将用户发送到任何地方。你打算怎么阻止它?这变成了一个猫捉老鼠的游戏,你会输,因为老鼠只需要得分一次。相互扣分。我关心的是,外部JSONP服务可以冻结浏览器,可以导航iframe,可以移动其中的内容。这是一个不可见的iframe,它们可以很容易地运行
,而(true){}
会挂起浏览器,因为iframe在同一线程上运行。我唯一真正关心的是安全。我不想让iframe以任何方式在我的主窗口中执行DOM或JavaScript变量。只要我保证用户数据的安全,这对我来说就是一个胜利。如果您将
iframe
document.domain
设置为其他内容会怎么样?因此,如果没有
postMessage
,他们将无法与其他人交谈。只是个主意。我记得如果你把它们都设置为相同的值,你可以让它们说话,所以我想知道做相反的事情是否会产生相反的结果。我在摆弄小提琴里的东西;这是一个有趣的问题,我喜欢你的方法:)@Ian我可以在iframe的代码中更改
document.domain
我自己吗?如果我这样做了,我能保证它不会被恶意代码更改回来吗?是的,我很确定你可以。当然,您也可以将父页面中的值更改为随机/唯一的值,那么iframe脚本很难猜测和匹配它。我想我应该在评论之前仔细考虑一下整个场景,但这可能是你可以玩弄的东西。我忘记了设置它的意义和它实际发生的变化,我只记得看到它被同步,以便窗口和iframe可以对话(通过什么方式,我不记得了)
function jsonp(url, data, callback) {
    var iframe = document.createElement("iframe");
    iframe.style.display = "none";
    document.body.appendChild(iframe);

    var iframedoc = iframe.contentDocument || iframe.contentWindow.document;
    sc = document.createElement("script");

    sc.textContent = "(function(p){ cb = function(result){p.postMessage(result,'http://fiddle.jshell.net');};})(parent);";
    //sc.textContent += "alert(cb)";
    iframedoc.body.appendChild(sc);
    var jr = document.createElement("script");

    var getParams = ""; // serialize the GET parameters
    for (var i in data) {
        getParams += "&" + i + "=" + data[i];
    }

    jr.src = url + "?callback=cb" + getParams;
    iframedoc.body.appendChild(jr);
    window.onmessage = function (e) {
        callback(e.data);
        document.body.removeChild(iframe);
    }

}

jsonp("http://jsfiddle.net/echo/jsonp/", {
    foo: "bar"
}, function (result) {
    alert("Result: " + JSON.stringify(result));
});