0

可能重复:
PHP Session Fixation / Hijacking

我一直在$_SESSION大量使用 superglobal。

然而情况是这样的:

用户登录后,我想跟踪他的 ID(MySQL 表)。我可以轻松地将 id 插入$_SESSION['id'] = $user_id;

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

session_regenerate_id()足以让我的会话免受劫持吗?

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

4

3 回答 3

1

如果我是你,我会在你的数据库中有一个存储 user_id 和 session_hash 的表。可能还有一个 date_expires 。然后,当用户登录时,您会根据他们的 id 和可能的随机盐创建一个哈希,将其存储在数据库中以及会话变量中。这样一来,如果他们更改了该值,那么他们匹配数据库中其他一些存储值的可能性就很小。除此之外,如果用户对其帐户执行任何操作,您只需检查数据库表的哈希值以获取其真实 ID,然后像往常一样执行操作。

于 2011-10-17T05:28:16.120 回答
1

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

例子:

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

$query = "SELECT * from database_table where md5(database_table.user_id) = " . $_SESSION['id'];
于 2011-10-17T05:30:03.730 回答
1

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

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

于 2011-10-17T05:31:06.813 回答