在PHP中管理会话的正确方法?
我目前正在设置一个身份验证系统。 我当前的布局是从在PHP中管理会话的正确方法?,php,session,cookies,Php,Session,Cookies,我目前正在设置一个身份验证系统。 我当前的布局是从$\u POST获取他的电子邮件,md5他的密码,并根据他的电子邮件和密码检查数据库。 如果匹配,我使用session\u start,并开始在$\u session变量中存储数据,如下所示: $_SESSION['uid'] = $uid; $_SESSION['first_name'] = $first_name; 在网站的每一页上,我都会对 isset($_SESSION['uid']); 如果不是,则重定向到索引页,如果是,则加载
$\u POST
获取他的电子邮件,md5他的密码,并根据他的电子邮件和密码检查数据库。
如果匹配,我使用session\u start
,并开始在$\u session
变量中存储数据,如下所示:
$_SESSION['uid'] = $uid;
$_SESSION['first_name'] = $first_name;
在网站的每一页上,我都会对
isset($_SESSION['uid']);
如果不是,则重定向到索引页,如果是,则加载该页
我这样做对吗?这足够安全吗?伪造这些数据对某人来说有多容易
有人告诉我,我应该创建一个表,包含用户的电子邮件和他的会话id,并使用它来管理事情。。。我变得相当困惑——这会有什么帮助
有人能澄清一下吗?使用PHP会话管理身份验证的正确方法是什么
谢谢。我并不是100%同意这个观点,但我认为如果有人真的愿意,可以伪造会话 我认为将会话id保存在表中是最安全的方法 我最近对此进行了一些研究,但我也不确定,有兴趣听听什么是最佳实践 这里有一些资源可以查看
安全更新:截至2017年10月23日:此答案中的建议虽然具有历史意义,但完全不安全。千万不要在散列密码时使用md5,因为它很容易被强制使用。请参阅关于如何使用内置密码api散列和验证密码
我在前面讨论过登录/身份验证系统,我发现这种方法有几个缺点:
- 您可以“md5他的密码,并检查数据库”--这意味着,如果一个人有权访问数据库,他可以识别谁拥有相同的密码李>
用户名+密码+电子邮件+salt
的md5,salt是随机的,并与用户记录一起存储
- 直接在会话变量中使用“uid”可能会非常危险。考虑一下这个问题:我的朋友从我的浏览器上登陆,他离开了。我快速检查他的浏览器中设置了哪些cookies,并破译他的“uid”。现在我拥有他了李>
$\u session[]
数组中。您还需要将sessionid与他的uid相关联(使用数据库或memcached)。优点是:
编辑:我总是手动使用cookies来处理会话。这有助于我更轻松地集成web应用程序的javascript组件。将来,您可能需要在应用程序中使用相同的功能。这样做没有错
isset($_SESSION['uid']);
会话数据不会传输给用户,而是存储在服务器上(或会话处理程序存储它的任何位置)。传输给用户的是会话id,它只是由PHP生成的一个随机字符串,当然这可能会被窃取,因为它被发送给用户
需要明确指出的是,在数据库和用户会话中随机存储一个字符串,然后使用该字符串来识别用户并不会使会话更加安全,如果攻击者获得会话,他们仍然会危害用户
我们现在讨论的是,您可能认为您可以将IP地址存储在会话中,并使用来自请求的IP进行检查,然后完成处理。然而,这通常并不是那么简单,最近在一个大型web应用程序上,我们在会话中存储了用户代理+IP地址的散列,然后每次都检查它们是否匹配,这对99%的用户来说效果很好。然而,我们开始接到一些人的电话,他们发现自己不断地在没有任何解释的情况下被注销。我们将日志记录到会话劫持检查中,以查看发生了什么,发现这些人将在一个IP上进入,他们的会话将在另一个IP上继续,这不是劫持企图,但这与他们的代理服务器的工作方式有关,因此,我们修改了会话劫持代码,以确定IP地址,并从中找出IP地址的网络部分,只存储IP地址的这些部分,这稍微有点不安全,因为从理论上讲,会话劫持可能来自同一网络内部,但会导致我们所有的误报消失。我必须补充一点。如果您正在执行“MD5检查密码,然后检查数据库”方法,这表明密码存储在单个MD5哈希中。这不再是存储散列密码的标准方式
我发现这个链接非常有用:如何生成随机会话id?通过启动会话?巧妙地应用随机函数。我试过了,结果很好。。在这里查看:@AwalGarg你说得对。添加了一个附录,以更加密的方式完成。您已经知道如何正确使用会话。然而,您试图构建的是一个身份验证系统。这要复杂得多。你可以看看并检查它的来源,看看有什么地方投入了大量的精力和思想。