我目前正在设置身份验证系统。
我目前的布局是从$_POST
,他的密码获取他的电子邮件,并根据他的电子邮件和密码检查数据库。
如果匹配,我使用session_start
,然后我开始在$_SESSION
变量中存储数据,如下所示:
$_SESSION['uid'] = $uid;
$_SESSION['first_name'] = $first_name;
在网站的每个页面上,我都会对
进行简单的检查isset($_SESSION['uid']);
如果没有,重定向到索引页面,如果是,则加载页面。
我这样做是否正确?这足够安全吗?有人伪造这些数据有多容易?
有人告诉我,我应该用用户的电子邮件和他的会话ID创建一个表格并使用它来管理事情......我变得相当困惑 - 这会有什么帮助?
有人可以澄清一下吗?使用PHP会话管理身份验证的正确方法是什么?
感谢。
答案 0 :(得分:43)
安全更新:截至2017年10月23日:这个答案中的建议虽然具有历史意义,但却完全不安全。永远不应该使用md5来散列密码,因为它很容易被强制使用。请参阅this answer,了解如何使用内置的password_ * api来散列和验证密码。
我之前已经处理过登录/身份验证系统,我发现这个方法存在一些缺点:
ADDENDUM(2015年9月19日)* 请查看此link。它解释了所有基础知识,您可以采用的方法,为什么要采用这些方法,并为您提供示例PHP代码。如果阅读时间太长,只需到最后,抓住代码并设置好!
更好的方法:将username+password+email+salt
的md5存储在数据库中, salt 是随机的,并与用户的记录一起存储。
更好的方法:在用户成功登录时生成随机会话ID,并将该会话ID存储在$_SESSION[]
阵列中。您还需要将sessionid与其uid相关联(使用数据库或memcached)。优点是:
编辑:我总是手动使用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哈希中。这不再是存储散列密码的标准方法。
答案 3 :(得分:-3)
我不是百分之百,但我认为如果有人真的想要有可能打造会议!
我认为在表中保存会话ID是最安全的方法。
我最近对此进行了一些调查,但我不确定,有兴趣听听最新的做法!
以下是一些要查看的资源