【问题标题】:Unsafe JavaScript attempt to access a frame when using secure browsing on Facebook在 Facebook 上使用安全浏览时,不安全的 JavaScript 会尝试访问框架
【发布时间】:2012-02-28 08:33:20
【问题描述】:

我上周启动了一个应用程序,并注意到在 Chrome 中只有我的画布的高度并不总是被调整。我花了很多时间研究这些问题,并注意到我有时会收到以下错误。

Unsafe JavaScript attempt to access frame with URL https://apps.facebook.com/tabletr/ from frame with URL

http://static.ak.facebook.com/connect/canvas_proxy.php?version=3#behavior=p&method=getPageInfo&params=%7B%22channelUrl%22%3A%22https%3A%2F%2Fs-static.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%3Fversion%3D3%23cb%3Df3782154e%26origin%3Dhttps%253A%252F%252Ftabletr.herokuapp.com%252Ff2951037b%26relation%3Dtop.frames%255Biframe_canvas_fb_https%255D%26transport%3Dpostmessage%22%2C%22frame%22%3A%22iframe_canvas_fb_https%22%7D&relation=top。 域、协议和端口必须匹配。

现在,对编程有所了解,我推断这可能是由于httpshttp 可以互换使用。我(有时)在 Facebook 上“开启”安全浏览时遇到错误,而“关闭”时从来没有。

但我发现真正奇怪的是,通过 HTTPS 浏览时偶尔会出现此问题。我仍然没有找到任何模式来解决即将出现的问题或我的代码按预期工作。我知道这里有一些关于这个主题的帖子,我尝试了许多解决方法,但似乎没有一个解决我的问题。这是我的代码的一部分-

<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function() {
        FB.init({
            appId      : '<myid>', // App ID
            channelUrl : '//tabletr.herokuapp.com/channel.php', // Channel File
            status     : false, // Check login status
            cookie     : true, // Enable cookies to allow the server to access the session
            xfbml      : false  // Parse XFBML
        });

        // Additional initialization code here
        FB.Canvas.setSize({ height: 1200 });
    };

    // If I comment out this function I don't get any unsafe URL errors
    // anymore. I'm guessing that the include of the JavaScript code either
    // fails to use the right protocol or is faulty in its implementation
    // by Facebook. My money is on the former.
    (function(d){
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        //js.src = "//connect.facebook.net/en_US/all.js";
        js.src = "//tabletr.herokuapp.com/js/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
    }(document));
</script>

我该如何解决这个问题?老实说,我不在他们身边。也许我的频道文件实现有误?

更新代码

<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function() {
        FB.init({
            appId      : '<myid>', // App ID
            channelUrl : '//tabletr.herokuapp.com/channel.php', // Channel File
            status     : false, // Check login status
            cookie     : true, // Enable cookies to allow the server to access the session
            xfbml      : false  // Parse XFBML
        });

        // Additional initialization code here
        FB.Canvas.setSize({ height: 1200 });
    };

    // If I comment out this function I don't get any unsafe URL errors
    // anymore. I'm guessing that the include of the JavaScript code either
    // fails to use the right protocol or is faulty in its implementation
    // by Facebook. My money is on the former.
    (function(d){
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        //js.src = "//tabletr.herokuapp.com/js/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
    }(document));
</script>

我已经根据 Stack Overflow 问题 Facebook JavaScript SDK over HTTPS loading non-secure items 更新了我的代码 - 但是,这还没有解决问题。我在 2012 年 1 月 19 日遇到了以下错误报告,它显示了我面临的相同症状。 Facebook 很快就会修复这个问题!

https://developers.facebook.com/bugs/192507854181725?browse=search_4f2bbd593f8798794293016

【问题讨论】:

    标签: javascript xss frame unsafe facebook-javascript-sdk


    【解决方案1】:

    完全有可能。

    您的错误消息指出:

    域、协议和端口必须匹配

    您正在使用包含的脚本访问框架

    https://apps.facebook.com/tabletr/

    来自带有 URL 的框架

    http://static.ak.facebook.com/connect/canvas_proxy.php? ...

    所以这肯定看起来像 http/https 不匹配。我认为这不会扩展到子域,但这可能是有问题的。

    但这是您的代码还是框架的代码?基本上,您需要确保这两种协议在安全或常规浏览场景中匹配。

    【讨论】:

    • 你好,我的评价一模一样;但这是来自 facebook 的代码 :)
    【解决方案2】:
     //js.src = "//connect.facebook.net/en_US/all.js";
     js.src = "//tabletr.herokuapp.com/js/all.js";
    

    您似乎将 http://connect.facebook.net/en_US/all.js 复制到本地服务器 https://tabletr.herokuapp.com/js/all.js.

    http://connect.facebook.net/en_US/all.jshttps://connect.facebook.net/en_US/all.js 的差异分别显示了几个带有“http”和“https”硬编码的 URL。如果你想在本地复制它们,你将不得不像 Facebook 那样托管两个不同的版本。

    但我建议只指向官方的 Facebook 脚本,这样您就不必一直同步它。

    【讨论】:

    • 哇,真是个大问题!我曾假设文件是​​相同的,但正如你所说,我刚才注意到存在差异。我明天必须做出调整。但是,它仍然无法解释的是为什么它仍然有效并且有时无效。
    • 好的,我已经更改了我的代码(见上文)并验证了当我通过 https 访问应用程序时正在加载正确的 all.js。不幸的是,我仍然得到错误。
    【解决方案3】:

    Facebook 已承认这是一个错误并分配给了一名工程师。您可以通过https://developers.facebook.com/bugs/192507854181725?browse=search_4f2bbd593f8798794293016跟踪进度

    【讨论】:

      【解决方案4】:

      当您错误地配置您的 fb 应用程序时也会发生这种情况,请检查接下来的三个步骤

      1- 确保您的 Facebook 应用程序的redirect_uri没有丢失

      转到您的应用>>设置>>高级>>安全。然后设置redirect_uri

      2- 确保您的应用允许登录 Client OAuth LoginEmbedded browser OAuth Login

      转到您的应用>>设置>>高级>>安全。然后为Client OAuth LoginEmbedded browser OAuth Login 选择“是”

      3- 不要忘记配置您的应用以接受来自您网站的登录

      转到您的应用 >> 设置 >> 添加平台 >> 网站。然后使用您的域设置Site URL

      【讨论】:

        猜你喜欢
        • 2011-05-18
        • 2013-02-02
        • 1970-01-01
        • 2011-11-18
        • 2011-03-01
        • 2012-06-21
        • 1970-01-01
        相关资源
        最近更新 更多