PHP会话劫持


PHP session hijack

可能重复:
PHP会话固定/劫持

我一直在大量使用$_SESSION超全局。

然而,情况是这样的:

一旦用户登录,我想跟踪他的ID(MySQL表(。我很容易将id插入$_SESSION['id'] = $user_id;

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

session_regenerate_id()是否足以保证我的会话不被劫持?

结论: Cookie只存储会话标识符-所有值都在服务器上,永远不会传递到客户端阅读StackOverflow 上的会话固定/劫持

用户没有访问$_SESSION['id']的权限。他不能修改保存在服务器上的变量(请参阅session文档(。

session_regenerate_id()具有不同的用途。它重置cookie SID。这是区分用户和会话的句柄。只有当您有辅助标识符(IP或用户代理字符串(要验证时,才有意义使用。它的主要目的是防止过时或交叉的会话。请再次参阅手册。

如果我是你,我会在你的数据库中有一个表,存储user_id和session_hash。可能还有一个日期到期。然后,当用户登录时,你会根据他们的id创建一个散列,也许还有一个随机的salt,将其存储在数据库和会话变量中。这样,如果他们改变了自己的值,那么他们匹配数据库中其他存储值的可能性就很小了。除此之外,如果用户对其帐户执行任何操作,您只需检查数据库表中的哈希值,即可获得其真实id,然后像往常一样执行操作。

一种选择是对其进行散列,然后在数据库中使用相同的散列。

示例:

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