Facebook Auth和CSRF机制

时间:2011-10-18 11:24:46

标签: php facebook facebook-graph-api csrf

我目前正在使用facebook身份验证构建网站。我在本地运行并且不断收到CSRF错误。我想了解他们的CSRF保护机制:

 $code = $_REQUEST["code"];

 $_SESSION['state']= $_REQUEST['state'];//GETS SITE WORKING BUT UNSAFE!!!///

 if(empty($code)) {
 $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection

 $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
   . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
   . $_SESSION['state'];

 echo("<script> top.location.href='" . $dialog_url . "'</script>");
 }

 if($_REQUEST['state'] == $_SESSION['state']) {

看来我的$ _REQUEST ['state']已设置但我的$ _SESSION ['state']不是。因此,为了让它工作,我有两条设置相等的线。我的$ code变量似乎永远不会为空,因此永远不会设置新的$ _SESSION ['state'变量。

首先$ _REQUEST ['code']的作用是什么?这个/这个变量来自/ set?

如何使用我的不安全代码来解决这个问题?

p.s我知道我应该使用FB sdk,但我正在学习网页设计/安全性,所以这是一个很好的练习,以了解它是如何工作的!

非常感谢Sam


对于任何有兴趣的人,我已经弄清楚它是如何工作的,但仍然没有解决我的问题...无论如何

CSFR保护系统通过在$ _SESSION ['state']中保存服务器端的状态'ID'来工作,同样的ID也保存在$ _REQUEST ['state']内,所以在客户端侧。因此,这意味着如果发生CSRF攻击,CSRF攻击(客户端)的状态值将与$ _SESSION ['state']的状态值不匹配,因此代码不会继续,并且会阻止攻击。

如果我错了,请纠正我!

1 个答案:

答案 0 :(得分:0)

您的描述基本上是正确的,重定向回您的网站时,网址中的状态值($ _REQUEST ['state'])应与首次重定向到Facebook时分配的状态值相匹配(存储在$ _SESSION中) ['州'])。如果它们不匹配,则会发生一些“操纵”,你不应该继续。

但你也说$ _SESSION ['state']没有被设置,因为$ code永远不会是空的。如果是这种情况,那么如何重定向到Facebook呢?

似乎更有可能一般不保留会话值。这是您网站中唯一使用会话的地方吗?

请注意,如果有问题,您不必使用会话。如果您设置了数据库,则可以轻松使用它。或者您可以完全避免本地存储,只要您设想一种方法可以合理地确定您收到的状态值实际上是由您的代码创建的,作为预期序列的一部分。例如,您可以将状态值设置为与时间戳的md5和秘密字符串连接的当前时间戳。当状态值返回时,首先检查时间戳部分以确保它在最后一两分钟内创建,然后检查md5以确保它不是由其他人创建的。这样你就有一个简单的令牌,不能提前猜到,也不能重复使用,这是CSRF预防的两个基本要求。