在PHP中管理会话的正确方法?

时间:2009-06-08 09:34:02

标签: php session cookies

我目前正在设置身份验证系统。 我目前的布局是从$_POST,他的密码获取他的电子邮件,并根据他的电子邮件和密码检查数据库。 如果匹配,我使用session_start,然后我开始在$_SESSION变量中存储数据,如下所示:

 $_SESSION['uid'] = $uid;
 $_SESSION['first_name'] = $first_name;

在网站的每个页面上,我都会对

进行简单的检查
isset($_SESSION['uid']);

如果没有,重定向到索引页面,如果是,则加载页面。

我这样做是否正确?这足够安全吗?有人伪造这些数据有多容易?

有人告诉我,我应该用用户的电子邮件和他的会话ID创建一个表格并使用它来管理事情......我变得相当困惑 - 这会有什么帮助?

有人可以澄清一下吗?使用PHP会话管理身份验证的正确方法是什么?

感谢。

4 个答案:

答案 0 :(得分:43)

安全更新:截至2017年10月23日:这个答案中的建议虽然具有历史意义,但却完全不安全。永远不应该使用md5来散列密码,因为它很容易被强制使用。请参阅this answer,了解如何使用内置的password_ * api来散列和验证密码。


我之前已经处理过登录/身份验证系统,我发现这个方法存在一些缺点:

  • 你“md5他的密码,并检查数据库” - 这意味着如果一个人有权访问数据库,他可以知道谁拥有相同的密码!

ADDENDUM(2015年9月19日)* 请查看此link。它解释了所有基础知识,您可以采用的方法,为什么要采用这些方法,并为您提供示例PHP代码。如果阅读时间太长,只需到最后,抓住代码并设置好!

更好的方法:将username+password+email+salt的md5存储在数据库中, salt 是随机的,并与用户的记录一起存储。

  • 直接在会话变量中使用'uid'可能会非常危险。考虑一下:我的朋友从我的浏览器登录,他离开了。我快速检查他的浏览器中设置了哪些cookie,并破译他的'uid'。现在我拥有他了!

更好的方法:在用户成功登录时生成随机会话ID,并将该会话ID存储在$_SESSION[]阵列中。您还需要将sessionid与其uid相关联(使用数据库或memcached)。优点是:

  1. 您甚至可以将sessionid绑定到特定IP,以便即使捕获了sessionid也不会被滥用
  2. 如果用户从其他位置登录,您可以使较旧的sessionid无效。因此,如果我的朋友从他自己的计算机登录,我计算机上的sessionid将自动失效。
  3. 编辑:我总是手动使用cookie来处理会话。这有助于我更轻松地集成我的Web应用程序的JavaScript组件。您将来的应用可能需要相同的内容。

答案 1 :(得分:26)

这样做没有错误

isset($_SESSION['uid']);

会话数据不会传输给用户,而是存储在服务器上(或会话处理程序存储它的任何地方)。传输给用户的是会话ID,它只是PHP生成的随机字符串,当然可以被盗,因为它被发送给用户。

应该清楚地注意到,在数据库和用户会话中随机存储字符串,然后使用它来识别用户不会使会话更安全,如果攻击者获得会话,他们仍然会受到攻击用户。

我们现在讨论的是session hijacking,您可能认为您只需将IP地址存储在会话中,并使用来自请求的IP进行检查并完成。然而,它通常不是那么简单,我最近在大型Web应用程序中被烧毁,我们在会话中存储用户代理+ IP地址的哈希,然后检查它们在每种情况下匹配,对于99%的用户这工作得很好。然而,我们开始接听那些发现他们不断被注销而没有任何解释的人的电话。我们记录了会话劫持检查以查看发生了什么,并发现这些人会进入一个IP并且他们的会话将继续在另一个IP上,这不是劫持尝试,但它与他们的代理服务器如何做因此,我们修改了会话劫持代码以确定class of the IP address并从那里找出IP地址的网络部分并仅存储IP地址的那些部分,这在会话劫持中稍微不那么安全从理论上讲,它可能来自同一个网络,但却导致我们所有的误报都消失了。

答案 2 :(得分:4)

我必须加上这个。如果您正在执行“MD5密码,然后检查数据库”方法,这表明密码存储在单个md5哈希中。这不再是存储散列密码的标准方法。

我发现此链接非常有用:http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard

答案 3 :(得分:-3)

我不是百分之百,但我认为如果有人真的想要有可能打造会议!

我认为在表中保存会话ID是最安全的方法。

我最近对此进行了一些调查,但我不确定,有兴趣听听最新的做法!

以下是一些要查看的资源

http://www.sitepoint.com/article/php-security-blunders/

http://www.phpeasystep.com/workshopview.php?id=6