账户验证逻辑异常:错误Token仍触发成功提示的原因排查
问题原因及修复方案
错误根源
你的判断逻辑存在问题:mysqli_query()函数只要SQL语句语法合法就会返回true,哪怕这条UPDATE语句没有匹配到任何用户(也就是token错误的场景)。所以即便token无效,$query依然为true,直接进入了成功分支,根本不会执行else里的逻辑。
修复步骤
- 替换判断依据:不要直接判断
$query的真假,改用mysqli_affected_rows($conn)检查实际被更新的行数。这个函数会返回SQL语句影响的行数,token正确时返回≥1的数值,错误时返回0。 - 修复SQL注入漏洞:原代码直接把用户传入的
$token拼接进SQL语句,存在严重的注入风险,必须改用预处理语句处理。
修复后的完整代码
session_start(); include 'partials/_dbconnect.php'; if(isset($_GET['token'])){ $token = $_GET['token']; // 使用预处理语句防范SQL注入 $updatequery = "UPDATE `users` SET `status` = 'active' WHERE `users`.`token` = ?"; $stmt = mysqli_prepare($conn, $updatequery); mysqli_stmt_bind_param($stmt, "s", $token); mysqli_stmt_execute($stmt); // 通过受影响行数判断验证是否成功 if(mysqli_affected_rows($conn) > 0){ echo '<script>alert("Your account is verified successfully. Please login now. !")</script>'; echo '<script> window.location.href = "/login.php"</script>'; } else { echo '<script>alert("This link is not valid. Account verification failed !")</script>'; echo '<script> window.location.href = "/index.php"</script>'; } mysqli_stmt_close($stmt); } ?>
内容的提问来源于stack exchange,提问作者pushpraj
相关产品推荐
相关产品推荐

