访问财产“Arbiter”的权限被拒绝

时间:2012-01-06 12:43:53

标签: javascript facebook

我有一个iframe FB应用。我们有三个地方开发它:我的localhost,我们测试应用程序的舞台服务器,生产服务器。 Localhost和生产都有HTTPS。 Localhost和stage应用程序启用了沙箱模式。所有版本的应用程序都是相同的,代码是相同的。除了HTTPS之外,舞台和制作完全是相同设置的服务器机器。

现在发生了什么仅在我的舞台服务器应用程序:当我点击应该召唤jQuery UI对话框的内容时,它会在我的Firebug中引发跟随错误:Permission denied to access property 'Arbiter'。然后没有召唤对话。它以某种方式动态加载canvas_proxy.php,在此代码中引发:

/**
 * Parses the fragment and calls Arbiter.inform(method, params)
 *
 * @author ptarjan
 */
function doFragmentSend() {
  var
    location = window.location.toString(),
    fragment = location.substr(location.indexOf('#') + 1),
    params = {},
    parts = fragment.split('&'),
    i,
    pair;

  lowerPageDomain();

  for (i=0; i<parts.length; i++) {
    pair = parts[i].split('=', 2);
    params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
  }
  var p = params.relation ? resolveRelation(params.relation) : parent.parent;

  // The user is not inside a frame (probably testing on their own domain)
  if (p == parent || !p.Arbiter || !p.JSON) {
    return;
  }

  p.Arbiter.inform(
    'Connect.Unsafe.'+params.method,
    p.JSON.parse(params.params),
    getBehavior(p, params.behavior));
}

if (p == parent || !p.Arbiter || !p.JSON) {行提出了它。我链接JS API的脚本代码如下所示:

<script src="https://connect.facebook.net/en_US/all.js#appId=APPID"></script>

有没有人知道为什么会发生这种情况?我找到了thisthis,但这些问题似乎对我没有帮助(或者我只是没有得到它)​​。可能是因为HTTPS?为什么它前天工作?我很绝望: - (

1 个答案:

答案 0 :(得分:7)

如果您有权限被拒绝的消息并且您正在处理框架或iframe,那么这是一个文档域问题。一个文档属于域x,另一个文档属于域y。请注意,www.domain.com和domain.com不是同一个文档域!

当你从另一个框架文档中获取一个框架文档的DOM时,(无论是为了更改页面元素的值还是只是读取一些隐藏变量或URL等的值),你将获得除非两个框架文档都来自相同/相同的域,否则将拒绝权限。

因此,如果一个框架属于www.mydomain.com而另一个框架恰好只是mydomain.com或www.someotherdomain.com,那么您将获得该血腥权限拒绝错误。

没有办法绕过它。如果有的话,身份盗窃问题很快就会飙升。