用户手动修改Cookie值后,如何删除数据库中对应token条目?
问题解答
一、能否同时删除数据库中的无效token条目?
完全可以实现,只需要在检测到token无效(cookieToken()返回FALSE)的分支里,新增删除数据库对应token的逻辑即可。
修改后的代码示例:
if(isset($_COOKIE["cookie"])) { $token = $_COOKIE["cookie"]; // 提前调用一次,避免重复查询数据库 $tokenCheckResult = cookieToken($con, $token); //check if the token is valid if ($tokenCheckResult !== FALSE) { $user_id = $tokenCheckResult["user_id"]; $user_credentials = cookieUserDummy($con, $user_id); $email = $user_credentials["email"]; $pwd = $user_credentials["pass"]; cookieUserLogin($con, $email); } else { // 新增:删除数据库中对应的无效token,用预处理语句防SQL注入 $deleteStmt = mysqli_prepare($con, "DELETE FROM logincookies WHERE token = ?"); mysqli_stmt_bind_param($deleteStmt, "s", $token); mysqli_stmt_execute($deleteStmt); unset($_COOKIE['cookie']); setcookie('cookie', '', time() - 3600, '/'); echo "Cookie Session Expired. Log in Again<hr>"; } }else { session_start(); }
二、如果不处理,是否需要担忧冗余数据?
- 短期少量冗余不会有明显影响,但长期积累会占用数据库存储空间,还会拖慢
logincookies表的查询效率(比如校验token时的检索速度)。 - 这些无效token留在数据库里没有任何作用,反而可能带来极低概率的安全风险(比如被恶意尝试匹配伪造),完全没有保留的必要。
额外优化建议
- 给
logincookies表加一个expire_at字段,生成token时设置有效期(比如30天),然后用定时任务(比如Linux Cron)定期清理过期的token,就算出现漏删也能自动维护表的整洁。 - 避免重复调用
cookieToken():原代码里两次调用该函数查询数据库,改成调用一次存到变量里,能小幅提升性能。
内容的提问来源于stack exchange,提问作者user5237857
相关产品推荐
相关产品推荐

