php在会话中存储用户ID?

问题描述:

我想知道在会话中存储用户ID的风险是什么?php在会话中存储用户ID?

然后简单地做,我们不会担心散列他们

if(isset($_SESSION['user_id'])){ 
    login_user($_SESSION['user_id]); 
} 

在会话加密就够了吗? 某人能够更改其ID的机会有多大?

+0

值得注意的是,如果用户有适当的插件(我使用Web Developer for Firefox),用户可以看到他们自己的会话信息。你也错过了第二个'在你的login_user电话 – DaOgre 2011-04-20 00:57:07

+5

@DaOgre *会议*信息!== *饼干*信息 – deceze 2011-04-20 01:24:06

+0

非常好的点@deceze。我很快查看并看到会话ID被存储,并做出一些快速(和错误)的心理跳跃。感谢您的支持 – DaOgre 2011-04-20 08:20:38

该会话默认作为文件存储在/tmp中。除非您有安全问题,例如directory traversal漏洞,否则最终用户无法查看它。

客户端看到的唯一部分是存储在映射到服务器上相关会话的cookie中的唯一哈希。

如果有人能够访问您的会话,他可能可以访问更多。我不会散列它,并且确保它不会到达客户端

大多数应用程序按照原样使用$_SESSION。如果那里存在大范围的弱点,那么重大项目会以不同的方式做事。

在$ _SESSION中存储用户ID是一种相当常见的做法。

您的替代方案可能是使用某种形式的session_id()作为关键字将会话信息(包括当前用户标识)存储在表中。

会话信息以纯文本形式存储。

取决于您的设置,会话位置应该在正确设置的服务器上安全。可以使用session_save_path()来改变位置,这将克服潜在的位置问题。

我建议不要只在会话中添加用户标识。例如:

1:在一个浏览器中创建一个帐户并登录。然后将该浏览器打开并转至另一台计算机。

2:登录到同一个帐户并删除它。现在用一个不同的密码创建一个新帐户(如果用户名是用户名,则使用相同的用户名)。

3:回到你的其他电脑做东西。你会发现你很可能现在正在使用另一台计算机上创建的帐户。

基本上,因为会话存储的id,这可能不一定仍然属于同一人,这取决于iff帐户已经改变等。如果没有密码是必需的(因为你已经去了那个过程,当你拥有该帐户)那么它类似于打入。

因此,这似乎只有一个工作的机会,如果,当你从数据库中删除用户帐户,数字ID可以重用(约2%的系统,我见过这样做)。或者,如果用户名是用户名(约20%我见过这样做)。

因此,我会建议在会话中添加用户标识和密码哈希(即md5,sha1),并且每次都使用它们来获取用户信息。

+0

除非您有一位可怕的程序员为您工作,否则您的情况永远不会发生。 – RiceRiceBaby 2015-09-28 20:39:02

+0

如果你的用户ID是一个自动递增的主列(为什么它不是?),那么这不会发生.. – 2017-08-17 05:54:09