PHP会话劫持[重复]

Posted

技术标签:

【中文标题】PHP会话劫持[重复]【英文标题】:PHP session hijack [duplicate] 【发布时间】:2011-12-09 00:49:36 【问题描述】:

可能重复:php Session Fixation / Hijacking

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

然而情况是这样的:

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

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

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

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

【问题讨论】:

是什么让你认为存储在$_SESSION 中的变量被发送到客户端? 什么都没有。我相信在 cookie 中的客户端只有某种哈希值,它与 $_SESSION 合作。我的问题可能写错了 - 我会更新。 【参考方案1】:

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

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

【讨论】:

对不起.. 我知道 $_SESSION 在服务器端,但会话在客户端与 cookie 一起工作 - 不知何故,数据需要从浏览器传递到服务器以进行会话。我认为这叫做会话劫持? 浏览器只传递 SID cookie。包含的["id"] 变量保留在服务器上。 请阅读PHP Session Fixation / Hijacking 谢谢 - 似乎是我正在寻找的完美网址 “只有使用...才有意义” - 废话 - 它应该始终用于身份验证或可以检测过期会话以防止固定攻击的地方跨度> 【参考方案2】:

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

【讨论】:

【参考方案3】:

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

例子:

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

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

【讨论】:

谢谢!我以前用过这种方法。。但现在我想知道它的缺点。 @KendallHopkins 哎呀,这是真的 @Atticus 你的意思是 md5(md5($user_id))==$user_id 吗? @ImranNaqvi 哎呀,不,我的意思是对 SQL 中的列进行 MD5,检查新脚本

以上是关于PHP会话劫持[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 会话劫持

已经开始的PHP会话[重复]

会话劫持在 PHP 中究竟是如何工作的?

PHP - 将会话变量设置为在 30 分钟后过期 [重复]

PHP会话已经开始[重复]

PHP中正确的会话劫持预防