Facebook:不安全的JavaScript问题(document.domain值应该相同)

时间:2013-02-15 10:20:40

标签: javascript facebook google-chrome cross-domain

Mine是一款基于画布的FB App。面对Chrome和Firefox上的问题,(虽然通常是Chrome):

1.当我在新的隐身Chrome窗口(https://apps.facebook.com/myfbappnamespace/)上点击我的已批准的fb应用安全网址时,以下错误仅在第一次出现,当我刷新页面时,错误消失了(大多数当时)

  

页面大约:空白显示不安全的内容   http://static.ak.facebook.com/connect/xd_arbiter.php?version=18#cb=f2e4fe7b ... os.com%2Ff4aeadb2&安培;域= www.mydomain.com&安培;关系=父&安培;误差= unknown_user

     

不安全的JavaScript尝试使用URL访问框架   来自带框架的框架http://www.mydomain.com/control/myfacebookapp/   http://static.ak.facebook.com/connect/xd_arbiter.php?version=18#cb=f2e4fe7b ... os.com%2Ff4aeadb2&安培;域= www.mydomain.com&安培;关系=父&安培;误差= unknown_user。   请求访问权限的框架'document.domain'为'facebook.com',   但被访问的框架没有。两者都必须设置'document.domain'   以相同的值允许访问。
  xd_arbiter.php:18

     

不安全的JavaScript尝试使用URL访问框架   来自带框架的框架http://www.mydomain.com/control/myfacebookapp/   http://static.ak.facebook.com/connect/xd_arbiter.php?version=18#cb=f2e4fe7b ... os.com%2Ff4aeadb2&安培;域= www.mydomain.com&安培;关系=父&安培;误差= unknown_user。   请求访问权限的框架'document.domain'为'facebook.com',   但被访问的框架没有。两者都必须设置'document.domain'   到相同的值以允许访问。 xd_arbiter.php:18

2.当我尝试http url(http://apps.facebook.com/myfbappnamespace/)时,控制台中显示的错误是:

  

不安全的JavaScript尝试使用URL访问框架   来自带框架的框架http://apps.facebook.com/myfbappnamespace/   https://s-static.ak.facebook.com/connect/xd_arbiter.php?version=18#channel= ... F控制%2Ffacebookappchannelurl%3Ffb_xd_fragment%23xd_sig%3Df23e84e85c%26。   请求访问的帧具有“https”协议,帧为   access具有'http'协议。协议必须匹配。

现在,当我登录我的fb帐户以查看这些错误会发生什么时,它们就会消失,有时只会消失。我知道我在查询中使用“大部分时间”和“有时”,但这正是我发生的事情。我也搜索了论坛并意识到fb已经修复了这个本来应该是特定于chrome的问题。我确保我的FB.init和其他调用是location.protocol值特定的。还在canvas url(http)和安全canvas url(https)中配置了正确的值。还尝试了两种设置: 帐户设置 - >安全 - >安全浏览 - > (已启用和已禁用)

如果我遗失某些地方,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:23)

有很多可能的问题。尝试使用以下解决方案之一:

  • 协议必须相同(因此尝试访问iframe的页面必须与提供iframe的网站具有相同的协议),因此,如果您在沙盒模式下测试应用程序(http而不是https),请禁用您的测试帐户的“安全浏览”模式
  • FB.init() 上的channelUrl(请参阅下面的代码)
  • 启用apache的头部mod并将以下行放在.htaccess
  • <div id="fb-root"></div>放在body标记之后,如fb doc中所述:https://developers.facebook.com/docs/reference/javascript/
  • 尝试在用户操作之后放置所有自动登录代码(例如点击登录按钮)
  • 从Canvas URL(在app→设置中)删除尾部斜杠,例如http://yoursite.com?
  • 修改您的<html>标记,如下所示:<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="https://www.facebook.com/2008/fbml">

.htaccess

的代码
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

频道代码问题:

FB.init({
    appId: '1234567890',
    status: true,
    cookie: true,
    xfbml: true,
    channelUrl : '//yoursite.com/channel.html'
});

您的服务器提供的 channel.html 应包含以下一行:

<script src="//connect.facebook.net/en_US/all.js"></script>

修改

关于你的第一期:

The page at about:blank displayed insecure content from http://static.ak.facebook.com/connect/xd_arbiter.php?version=18#cb=f2e4fe7b…os.com%2Ff4aeadb2&domain=www.mydomain.com&relation=parent&error=unknown_user.

这是一个预期的异常,用于测试一个条件 - 这没有任何副作用,所以不关心它。

请参阅此问题:Unsafe JavaScript attempt to access frame with URL: Domains, protocols and ports must match.

答案 1 :(得分:0)

在我的情况下,我在“_Layout”视图中有一个“facebook-like-box”,我必须在 global.css 文件中为它自定义一些CSS。

.fb_iframe_widget, .fb_iframe_widget span, .fb_iframe_widget span iframe[style] {
    width: 100% !important;
}

然后,当我尝试加载内容页面时,例如文章和新闻,它有一个Facebook的分享按钮,它开始给我这个错误:

Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "http://localhost:51826" from accessing a frame with origin "http://static.ak.facebook.com". The frame being accessed set "document.domain" to "facebook.com", but the frame requesting access did not. Both must set "document.domain" to the same value to allow access.

不知何故,我认为这段CSS代码导致了这个问题(通过处于全局范围内),试图访问和修改我的共享按钮的iframe行为。

  1. 删除那行CSS代码解决了这个问题。
  2. 将该行CSS代码移动到内部具有“facebook-like-box”的特定页面&lt;风格&gt;标签。