如何知道我的页面是否在facebook iframe中运行

时间:2011-10-16 10:47:19

标签: php facebook

我目前正在开发一个独立运行的网站,并在iframe上作为Facebook应用 我想知道在页面加载之前检查我的页面是否在facebook iframe中运行是什么样的“最佳实践”,因此我可以预设相关的CSS和其他变量

感谢。

6 个答案:

答案 0 :(得分:6)

$signed_request = $_POST['signed_request'];

if(empty($signed_request))
      die('No direct access.');

答案 1 :(得分:5)

有几种方法可以解决这个问题。如果您不关心安全性(即您真的只想知道如何格式化页面而不是决定要显示的内容),那么您最好的选择可能是使用不同的URL进行Facebook访问。例如,如果您的独立站点是www.mysite.com,则可以将fb.mysite.com或www.mysite.com/fb配置为指向同一位置,然后在应用程序设置中使用备用版本。然后,您的服务器代码可以轻松检查正在访问的URL版本并采取相应措施。当然,您必须小心处理您的链接,以确保它们保持正确的前缀。

另一种方法是使用所讨论的signed_request,在它存在时设置cookie(或会话)以指示Facebook访问。其中的诀窍是在每个页面的顶部还包含一些javascript代码,用于检查页面是否在iframe中。如果没有,那么代码立即重定向回当前页面,添加的参数如“?clearfb = 1”,它将告诉服务器清除cookie /会话并以外部格式输出页面。

答案 2 :(得分:3)

检查是否存在signed_request也是一个很好的测试...

答案 3 :(得分:2)

这是一些PHP代码,用于测试当前页面是否在facebook iframe中运行:

if( strpos( $_SERVER[ 'HTTP_REFERER' ], "apps.facebook.com" ) !== false ){
    // Page is running in Facebook iframe
}

答案 4 :(得分:1)

唯一真正的检查可以在客户端通过比较window.top==window来完成,如果它是真的应用程序是在iframe之外运行的。

没有服务器端检查可以确保这一点,因为浏览器没有将有关父帧的信息传递给HTTP_REFERRER以外的服务器,而这些服务器是不可信任的。

如果在页面标签画布 Canvas 上运行,Facebook会将signed_request传递给您的应用程序,但这不是您可以完全信任的,因为它也可以被用户模仿。

<强>更新

这是唯一真实检查的说法并不意味着你应该使用它!您最好坚持基于signed_request的解决方案,因为这是Facebook与您的应用互动的一种方式,用户不打算使用signed_request,并且不应该在任何条件下作为查询字符串的一部分传递!如果用户模仿它,可能会出现问题,在这种情况下,我不打算提供错误的样式。

答案 5 :(得分:0)

今天早上我遇到了同样的问题 - 我希望桌面用户通过Facebook访问我的应用,但我希望移动用户能够通过URL直接访问应用。就像Floyd Wilburn所说的那样,通过不同的URL访问应用程序的不同版本是一个不错的选择,但我没有使用应用程序的两个副本(难以维护),而是使用mod_rewrite将/ facebook目录重写为app root:

# rewrite both /facebook and / to same place so you
# can tell if your request came from facebook or from direct URL access :)
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} /facebook*
RewriteRule (.*) /index.php [L]

请务必将您的Facebook页面标签网址设置为登陆/ facebook子目录。现在,您可以浏览器嗅探他们是否是移动用户或桌面用户,并且您可以测试请求的URL以查看他们是通过Facebook还是直接访问应用程序:)

让我补充说,确定客户端类型或访问点没有万无一失的方法 - 两者都可以被知道他们正在做什么的人欺骗 - 所以在设计应用程序的安全性和身份验证机制时要考虑到这一点。