2011-10-17 91 views
0

可能重复:
PHP Session Fixation/HijackingPHP会话劫持

我一直在使用超全局$_SESSION很多和重。

然而,情况是这样的:

一旦用户登录我要跟踪他的ID(MySQL表)的。我可以很容易地插入 的ID为$_SESSION['id'] = $user_id;

毕竟我可以使用跨页变量在我的网站。我的想法是 - 用户可以将ID欺骗到另一个。如果我看到有一个简单的数字,那么我可以稍微改变一下,看看会发生什么 - 我想要防止这种情况,因为它可能会导致很多问题,因为用户ID将用于添加,删除,编辑数据库中的条目。

难道session_regenerate_id()恰好足以让我的会话免于劫持?

结论: 的Cookie只存储会话识别器 - 所有值都在服务器上,永远不会传递到客户端。 Read about session fixation/hijacking on StackOverflow

+0

是什么让你认为存储在'$ _SESSION'中的变量被发送到客户端? –

+0

什么都没有。我相信在cookie中的客户端只有某种类型的哈希与$ _SESSION合作。 我可能写错了我的问题 - 我会更新。 –

回答

1

该用户没有acccess到$_SESSION['id']。他无法修改服务器上保存的变量(请参阅session doc)。

session_regenerate_id()有不同的目的。它重置cookie SID。这是区分用户和会话的手段。只有在您有辅助标识符(IP或用户代理字符串)进行验证时才使用它。它的主要目的是防止陈旧或相交的会话。再次看到手册。

+0

对不起。我知道$ _SESSION是在服务器端,但会话在客户端使用cookie - 不知何故数据需要从浏览器传递到服务器进行会话。我认为这被称为会话劫持? –

+0

只有SID cookie被浏览器传递。包含的[[“id”]'变量保存在服务器上。 – mario

+1

请阅读[PHP会话固定/劫持](http://stackoverflow.com/questions/5081025/php-session-fixation-hijacking) – mario

1

如果我是你,我会在你的数据库中有一个存储user_id和session_hash的表。可能还有一个date_expires。然后,当用户登录时,根据其id和可能的随机salt创建散列,将其存储在数据库以及会话变量中。这样,如果他们改变了他们的价值,那么他们在数据库中匹配其他存储值的机会是不太可能的。除此之外,如果用户在他们的账户上执行任何操作,您只需检查数据库表的哈希以获得他们的真实身份,然后像通常那样执行操作。

1

一个选项是散列它,然后在数据库中使用相同的散列。

实施例:

$_SESSION['id'] = md5($user_id); 

$query = "SELECT * from database_table where md5(database_table.user_id) = " . $_SESSION['id']; 
+0

加密!=散列 –

+0

谢谢!我以前正在使用这种方法..但现在我想知道它的缺点。 –

+0

@KendallHopkins哎呀这是真的 – Atticus