我一直在使用$_SESSION
超级全球。
然而情况是这样的:
用户登录后,我想跟踪他的ID(MySQL表)。我很容易
将ID插入$_SESSION['id'] = $user_id;
毕竟我可以在我网站的页面上使用该变量。我的想法是 - 用户可以将ID欺骗到另一个。如果我看到有一个简单的数字,那么我可以稍微改变一下,看看会发生什么 - 我想防止它,因为它可能会导致很多问题,因为用户ID将用于添加,删除,编辑数据库中的条目
session_regenerate_id()
是否足以让我的会话免遭劫持?
结论: Cookie仅存储会话标识符 - 所有值都在服务器上,永远不会传递给客户端。 Read about session fixation/hijacking on StackOverflow
答案 0 :(得分:1)
如果我是你,我会在你的数据库中有一个存储user_id和session_hash的表。也可能是date_expires。然后,当用户登录时,您可以根据其ID和随机盐创建哈希,将其存储在数据库中以及会话变量中。这样,如果他们改变了他们的价值,那么他们在数据库中匹配其他存储价值的可能性就不大可能。除此之外,如果用户对其帐户执行任何操作,您只需检查数据库表中的哈希值以获取其真实ID,然后像往常一样按照操作进行操作。
答案 1 :(得分:1)
一种选择是散列它,然后在数据库中使用相同的散列。
示例:
$_SESSION['id'] = md5($user_id);
$query = "SELECT * from database_table where md5(database_table.user_id) = " . $_SESSION['id'];
答案 2 :(得分:1)
用户无法访问$_SESSION['id']
。他无法修改保存在服务器上的变量(请参阅session
doc)。
session_regenerate_id()
有不同的目的。它重置cookie SID。这是区分用户和会话的句柄。只有在您具有要验证的辅助标识符(IP或用户代理字符串)时才使用它是有意义的。它的主要目的是防止陈旧或交叉的会话。再次,请参阅手册。