PHP - 会话安全性和可靠性



我目前正在学习PHP,我想出了一个关于会话的问题。在写这篇文章之前,我已经阅读了一些信息和主题,例如关于这个主题的信息和主题,但其中大部分都有点旧,所以我想确保我以正确的方式处理它们。

所以,这是我的问题:假设以下项目为真,

  • 登录后,我正在使用session_regenerate_id()来重新生成 PHP 会话 ID;
  • 登录后,我正在创建一个带有加密代码的会话变量(在开始和结束时结合了用户 IP、浏览器和一些随机内容(

$_SESSION['check'] = hash('ripemd128', $rand1 . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $rand2).

该值被发送到数据库,在每一页中,我都在检查数据库上的值是否与该$_SESSION['check']变量匹配;

  • 我强制用户通过ini_set('session.use_only_cookies', 1)启用 cookie,并且还设置了ini_set('session.use_trans_sid', 0);
  • 注销后,我使用以下代码:

$_SESSION = array(); setcookie(session_name(), '', time()-259200, '/'); session_unset(); session_destroy();

这样,假设放入会话变量的值已正确验证,我可以 100% 信任我的会话变量吗?如果没有,我可以改进/更改哪些内容以使它们更安全?

我之所以问这个问题,是因为当用户登录时,我将一些信息保存到会话变量中,以避免查询使数据库过载,因此我需要确保它们不会受到损害。

谢谢。

带有哈希(不是"嵌入"!(用户代理和带有一些随机值的IP的整个舞蹈和歌曲是非常多余的。我也看不出在每个请求上都用它打扰数据库有什么意义。

这有什么好处,你想防止什么?如果有的话,您想防止会话劫持。让我们详细看看它:

会话
  • 劫持意味着中间人或其他第三方能够窃取用户的会话 cookie。你可以简单地用HTTPS来防止这种情况,这是你唯一能做的。
  • 如果用户计算机上的某些恶意软件窃取了 cookie 而不是 MitM,HTTPS 将无济于事。在这种情况下,攻击者可能会完全坐在其他地方。在这种情况下,检查IP会有所帮助。检查用户代理在很大程度上是多余的,因为它很容易被模仿。
  • 要检查IP,您只需将IP直接存储在会话中并执行简单的if ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR']);散列不会向该过程添加任何内容。
  • 请注意,IP 可能会突然合法更改,这将使登录无效。
  • 请注意,能够窃取某人cookie的恶意软件也可以直接从他们自己的计算机上冒充用户,在这种情况下,任何检查都不会做任何事情。

底线:任何形式的额外检查和保护都是毫无用处的。如果您使用的是HTTPS,并且有人仍然能够劫持会话,那么无论哪种方式,您基本上都是SOL。不要打扰。如果您没有使用 HTTPS,请立即开始使用它。

最新更新