【发布时间】:2013-03-08 23:20:08
【问题描述】:
当用户在我的网站上成功通过身份验证时,我将他们的用户 ID 存储在会话中:$_SESSION['user_id']
然后我在整个站点中使用它来检查用户是否可以执行某些操作。例如
if(isset($_SESSION['user_id'])){
//User is logged in, allow the following.
...
}
...
if ( $_SESSION['user_id'] == $comment_user ) {
//User owns the comment, go ahead and delete it.
...
}
但是,如果我发现登录用户有恶意目的,我该如何终止他们的登录会话以使他们无法执行这些安全操作?
要阻止用户,我可以在数据库上使他们的登录详细信息无效,或者将他们添加到在身份验证时检查的阻止列表中,以便他们无法再进行身份验证。 但是,这只会在他们下次尝试登录时生效。只要当前会话保持活动状态并且他们的用户 ID 存储在会话中,他们就会被视为经过身份验证..强>
- 有没有办法取消设置特定会话,强制注销?怎么样?
- 如果没有,确保被阻止的用户无法继续访问站点上的安全区域的最佳方法是什么?例如我唯一的想法是不仅仅是检查
if(isset($_SESSION['user_id'])),还可以添加一个额外的检查来确保user_id 没有被添加到数据库上的“被阻止的用户”列表中。我只是不喜欢每次执行某些操作时都会发出另一个数据库请求来检查用户是否进入了阻止列表。尤其是因为阻止用户的情况很少见。有没有办法在不去数据库的情况下检查用户是否被阻止?
谢谢!
编辑
到目前为止,大多数答案都涉及如何取消/销毁会话,或如何阻止用户下次登录尝试。我想剩下的唯一问题是如何检查用户当前登录时是否被阻止。有没有一种方法可以做到这一点,而无需每次用户执行时都去数据库检查“被阻止的用户”列表一种行为。这与我的主要问题有关,即上面的粗斜体。如果用户被阻止,那么我可以立即销毁会话(强制注销),他们也将无法再次进行身份验证。
【问题讨论】:
-
您没有在标签中注明您的操作系统,但我已经根据 linux 和您更新的问题重写了我的答案。
标签: php session authentication