在PHP中将用户ID存储在会话中?

15

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

然后只需执行一个

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

会话是否加密得足够安全,以至于我们无需对其进行哈希处理而担心呢? 有人能够更改他们的ID的机会有多大?


值得注意的是,如果用户有适当的插件(我使用Firefox的Web Developer),他们可以查看自己的会话信息。此外,在您的login_user调用中缺少第二个引号。 - DaOgre
6
@DaOgre 的“Session info”并不等同于“cookie info”。 - deceze
非常好的观点@deceze。我快速检查了一下,发现会话ID已经存储,并进行了一些快速(错误的)思维跳跃。感谢你的提醒。 - DaOgre
5个回答

12

会话默认存储在文件中的/tmp。除非存在目录遍历漏洞等安全问题,否则用户无法查看它。

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


2

大多数应用程序像你一样使用$_SESSION。如果存在普遍的弱点,那么重要的项目将会采取不同的方法。


1

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

您的替代方案可以是使用session_id()作为键,在表中存储会话信息(包括当前用户ID)。

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

根据您的设置,会话位置应该在正确设置的服务器上是安全的。可以使用session_save_path()更改位置,从而克服潜在的位置问题。


0
如果有人能够访问您的会话,那么他可能能够访问更多更重要的信息。我不会对其进行哈希处理,也会确保它不会传输到客户端。

-4

我建议不要仅将用户ID添加到会话中。例如:

1:在一个浏览器中创建帐户并登录。然后保持该浏览器打开状态,转到另一台计算机。

2:登录相同的帐户并将其删除。现在使用不同的密码(如果用户名用作ID,则使用相同的用户名)创建新帐户。

3:返回到您的其他计算机并进行操作。您会发现,您可能正在使用在其他计算机上创建的帐户。

基本上,由于会话存储了ID,因此根据账户是否更改等情况,这可能不一定仍然属于同一人。如果不需要密码(因为您已经通过拥有该帐户的过程),那么它类似于闯入。

因此,如果从数据库中删除用户帐户时可以重复使用数字ID(我见过的系统中约有2%可以这样做)。或者如果用户ID是用户名(我见过的约20%可以这样做),则似乎只有一种可能性可以实现。

因此,我建议将用户ID和密码哈希(即md5,sha1)添加到会话中,并每次使用它们获取用户信息。


除非你有一个糟糕的程序员在工作,否则你的情况永远不应该发生。 - RiceRiceBaby
1
如果您的用户ID是自增的主列(为什么不是呢?),那么这种情况就不会发生。 - Jamie M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接