我目前正在使用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。我知道我应该使用FB sdk,但我正在学习网页设计/安全,所以这是一个很好的练习来学习它是如何工作的!!
谢谢Sam
对于任何感兴趣的人,我已经弄清楚它是如何工作的,但仍然没有解决我的问题…无论如何
CSFR保护系统通过在服务器端$_SESSION[' State ']中保存状态'ID'来工作,相同的ID也保存在$_REQUEST[' State ']中,因此在客户端。因此,这意味着如果发生CSRF攻击,CSRF攻击(客户端)的状态值将与$_SESSION['state']的状态值不匹配,因此代码不会继续进行并且攻击被阻止。
如果我错了,请纠正我!
你的描述基本上是正确的,状态值是在url时重定向回您的网站($_REQUEST['state'])应该匹配的状态值,当第一次重定向到Facebook(存储在$_SESSION['state'])分配。如果它们不匹配,说明发生了一些"操纵",您不应该继续。
但是你也说$_SESSION['state']没有被设置,因为$code从来不是空的。如果是这样的话,那么跳转到Facebook是怎么发生的呢?
似乎更有可能的是会话值没有被保留。这是您网站中唯一使用会话的地方吗?
请注意,如果有问题,您不必使用会话。如果您设置了数据库,您可以很容易地使用它。或者,您可以完全避免本地存储,只要您能够合理地确定您接收到的状态值实际上是由您的代码作为预期序列的一部分创建的。例如,可以将状态值设置为当前时间戳与时间戳的md5加上一个秘密字符串相连接。当状态值返回时,首先检查时间戳部分以确保它是在最后一两分钟内创建的,然后检查md5以确保它不是由其他人创建的。这样,您就有了一个简单的令牌,它不能提前被猜测,也不能被重用,这是防止CSRF的两个基本要求。