Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中管理会话的正确方法?_Php_Session_Cookies - Fatal编程技术网

在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他的密码,并检查数据库”--这意味着,如果一个人有权访问数据库,他可以识别谁拥有相同的密码
附录(2015年9月19日)*看看这个。它解释了所有的基础知识、可以采用的方法、为什么应该采用这些方法,并给出了PHP代码示例。如果它太长而无法阅读,只需走到最后,抓取代码并进行设置

更好的方法:在数据库中存储
用户名+密码+电子邮件+salt
的md5,salt是随机的,并与用户记录一起存储

  • 直接在会话变量中使用“uid”可能会非常危险。考虑一下这个问题:我的朋友从我的浏览器上登陆,他离开了。我快速检查他的浏览器中设置了哪些cookies,并破译他的“uid”。现在我拥有他了
更好的方法:当用户成功登录时生成一个随机会话ID,并将该会话ID存储在
$\u session[]
数组中。您还需要将sessionid与他的uid相关联(使用数据库或memcached)。优点是:

  • 您甚至可以将sessionid绑定到特定的IP,这样sessionid即使被捕获也不会被滥用
  • 如果用户从其他位置登录,则可以使旧的sessionid无效。因此,如果我的朋友从他自己的计算机登录,我计算机上的sessionid将自动失效

  • 编辑:我总是手动使用cookies来处理会话。这有助于我更轻松地集成web应用程序的javascript组件。将来,您可能需要在应用程序中使用相同的功能。

    这样做没有错

    isset($_SESSION['uid']);
    
    会话数据不会传输给用户,而是存储在服务器上(或会话处理程序存储它的任何位置)。传输给用户的是会话id,它只是由PHP生成的一个随机字符串,当然这可能会被窃取,因为它被发送给用户

    需要明确指出的是,在数据库和用户会话中随机存储一个字符串,然后使用该字符串来识别用户并不会使会话更加安全,如果攻击者获得会话,他们仍然会危害用户


    我们现在讨论的是,您可能认为您可以将IP地址存储在会话中,并使用来自请求的IP进行检查,然后完成处理。然而,这通常并不是那么简单,最近在一个大型web应用程序上,我们在会话中存储了用户代理+IP地址的散列,然后每次都检查它们是否匹配,这对99%的用户来说效果很好。然而,我们开始接到一些人的电话,他们发现自己不断地在没有任何解释的情况下被注销。我们将日志记录到会话劫持检查中,以查看发生了什么,发现这些人将在一个IP上进入,他们的会话将在另一个IP上继续,这不是劫持企图,但这与他们的代理服务器的工作方式有关,因此,我们修改了会话劫持代码,以确定IP地址,并从中找出IP地址的网络部分,只存储IP地址的这些部分,这稍微有点不安全,因为从理论上讲,会话劫持可能来自同一网络内部,但会导致我们所有的误报消失。

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


    我发现这个链接非常有用:

    如何生成随机会话id?通过启动会话?巧妙地应用随机函数。我试过了,结果很好。。在这里查看:@AwalGarg你说得对。添加了一个附录,以更加密的方式完成。您已经知道如何正确使用会话。然而,您试图构建的是一个身份验证系统。这要复杂得多。你可以看看并检查它的来源,看看有什么地方投入了大量的精力和思想。