会话中的 PHP 登录系统问题!
Posted
技术标签:
【中文标题】会话中的 PHP 登录系统问题!【英文标题】:PHP Login System Problem On Sessions! 【发布时间】:2011-08-21 08:27:21 【问题描述】:我有几个关于会话和登录/注销系统的问题。
在我的系统中,首先我检查用户数据(用户名和密码)是否正确。如果是这样,我正在注册一个会话:$_SESSION['loggedin'] = 1
然后我假设已登录并且我总是检查 $_SESSION['loggedin']
是否为 1。
但是,我最近观察到,在其中一位用户登录后,假设他们转到他们的页面:/profile.php?u=newuser
,但是当他们在自己的页面中时,如果他们碰巧将 url 更改为:/@987654324 @我的系统假设 newuser2 现在已登录 :( 我该如何解决这个问题?登录用户的最佳和安全方式是什么?
最后,以下方式可行吗?假设我注册 $_SESSION['username'] = $username;
在这里 $username 数据是从数据库中检索的。为了了解用户是否登录,我总是从数据库中检索用户名并检查$_SESSION['username'] == username
。这合乎逻辑吗?从数据库中获取用户名总是有效的吗?
【问题讨论】:
您不需要在 URL 中传递用户名。只需在登录时将其存储在会话中,并检查会话是否设置了用户名,而不是 1,如果存在,则使用会话中的值作为用户名。 【参考方案1】:由于会话数据存储在服务器上,因此将用户名存储在 $_SESSION 并按照您所说的进行检查应该没有问题。
存储用户 ID 会更好,但老实说这没什么大不了的。当然,除非您允许用户更改他们的用户名。
profile.php 不应该有一个 $_GET 变量来决定编辑谁。它应该自动使用登录的人。即
而不是去
$username = $_GET['u'];
你应该使用
$username = $_SESSION['username'];
【讨论】:
那么我要检查 $_SESSION['username'] == $_GET['u'] 吗?如果这是正确的,那么用户已经登录,对吧? 不,你不应该使用 $_GET['u'] 你应该去 if( isset( $_SESSION['username'] ) ) echo 'logged in!'; 问题是,好的,我在用户登录时设置了 $_SESSION['username']。如果该用户转到其他人的页面,它仍然可以看到其他用户的私人功能。如何在仅检查 isset($_SESSION['username']) 时对其进行保护? 顺便说一句,我正在做的是将 $_SESSION['username'] 设置为登录用户的用户名。有什么我想念的吗? 在这种情况下是的,你应该去 $_SESSION['username'] == $_GET['u'] 是的,你是对的 $_SESSION['username'] 是登录用户的用户名以上是关于会话中的 PHP 登录系统问题!的主要内容,如果未能解决你的问题,请参考以下文章