【发布时间】:2020-06-13 12:22:58
【问题描述】:
我的注销脚本有一些严重的问题(它在 90% 的情况下都会崩溃)
重要
脚本必须从数据库和 cookie 中删除令牌(如果存在) (记住我 isset)然后它应该取消设置
$_SESSION['user_id']并同时重新加载页面
问题在于,有时它会在删除用户会话之前重新加载页面,并一直显示成员页面,直到我再次重新加载(我使用一个包含登录和成员页面的索引文件,以 if($person->is_logged()) 分隔)
例如:当我点击注销按钮时,有时它会在不破坏用户会话的情况下从数据库中删除令牌,或者有时相反,但主要问题是它崩溃并同时显示成员和登录页面,直到我再次重新加载以仅显示正确的页面
这是ajax代码
$("#signout").click(function () {
var post_data = {
'type': 'sign_out'
}
$.post('processing/core/connect.php', post_data, function (data) {
window.location.reload();
});
});
那么这是 php 连接文件:
if ($_POST['type'] == 'sign_out') {
$person->logout();
}
这是我的注销功能:
private $cookie_user_id = "c_user";
private $cookie_session_token = "xs";
public function logout()
{
global $database;
/* delete token from database */
$database->query("DELETE FROM `users_sessions` WHERE `session_token` = '{$_COOKIE[$this->cookie_session_token]}' AND `user_id` = '{$_COOKIE[$this->cookie_user_id]}'");
/* destroy the session */
unset($_SESSION['user_id']);
/* unset the cookies */
setcookie($this->cookie_user_id, null, -1, '/');
setcookie($this->cookie_session_token, null, -1, '/');
}
有什么好的做法可以强制 100% 退出而没有任何问题?
【问题讨论】:
-
对于良好实践的起点,您的查询应该是
DELETE FROM `users_sessions` WHERE `session_token` = ? AND `user_id` = ?。始终参数化。你也应该使用$_SESSIONs,而不是$_COOKIEs -
@user3783243 是的,准备好的声明,我打算在我解决这个问题后这样做,但谢谢
-
cookie 的好处是当您返回站点时它们会记住您,您应该在登录时将 cookie 会话从非活动更新为活动,而不是在注销时删除。删除 cookie 意味着您不使用 cookie 的好处
-
@Dlk 我只在注销操作后删除 cookie
-
那么为什么要使用cookies呢?他们有什么好处? PHP 会话就足够了。