2017-07-26 143 views
0

我目前正在学习PHP,并提出了一个关于Sessions的问题。在发布这篇文章之前,我已经阅读了一些关于这个主题的信息和主题,例如this one,但其中大部分都有点老了,所以我想确保我以正确的方式处理它们。PHP - 会话安全性和可靠性

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

  • 登录时,我使用session_regenerate_id()再生PHP会话ID;
  • 登录时,我创建与encripted代码(即结合用户的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%?如果不是,我可以改进/改变什么以使它们更安全?

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

谢谢。

+2

你只是问你是否正确处理它们?如果是这样的话,这可能更多地属于[CodeReview](https://codereview.stackexchange.com/) – GrumpyCrouton

+0

由于存储和管理服务器端,会话变量通常可以被信任。然而,很多问题已经涵盖了SO的相同主题,所以做一些研究。 – Devon

+0

哈希不是“encripted”值。 – deceze

回答

0

整个舞蹈和歌曲与哈希(而不是“encripting”!)用户代理和IP与一些随机值是多余的。在每次请求中,我也没有看到它在困扰数据库的问题上。

这有什么好处,你想要防止什么?如果有的话,你想防止会话劫持。我们来仔细看一下:

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

底线:任何类型的额外检查和保护都是无用的。如果您使用的是HTTPS并且有人是仍然能够劫持会话,那么您大多数都是SOL。不要打扰。如果您未使用HTTPS,请立即使用它现在

+0

感谢您的反馈意见。是的,我确实想要防止会话劫持。我目前没有HTTPS,这就是为什么我试图用更多的“检查”来弥补它,但我会尽快使用它。关于问题的第二部分,我是否可以相信用户将无法处理放入会话变量中的信息(如果该信息之前已被正确验证,并且没有任何允许用户与会话变量交互)? –

+0

是的,用户无法更改服务器端会话中的任何信息(除非您编写代码)。 – deceze

+0

这就是我需要知道的。再次感谢! –