PHP gamelogin.php报Undefined index: user_id/user_pass错误如何解决
报错原因
- 核心原因是发起请求时未传递
user_id、user_pass两个GET参数,代码直接读取$_GET数组中不存在的键,触发PHP Notice级别的报错。 - 代码同时存在两处高危隐患:
- 完全缺失密码校验逻辑,读取到数据库存储的密码后未和用户提交的密码做比对,任意合法用户名无需密码即可登录。
- 后续UPDATE语句直接拼接用户输入的
$user_id,存在SQL注入风险,自定义的防注入函数过滤逻辑简陋,无法有效抵御注入攻击。
修复步骤
1. 解决参数不存在的报错
替换原代码中14、15行的变量赋值逻辑,先判断参数是否存在再取值,为空直接返回错误:
// PHP7+版本写法 $user_id = antiinjection($_GET['user_id'] ?? ''); $user_pass = antiinjection($_GET['user_pass'] ?? ''); // 兼容低版本PHP写法 // $user_id = isset($_GET['user_id']) ? antiinjection($_GET['user_id']) : ''; // $user_pass = isset($_GET['user_pass']) ? antiinjection($_GET['user_pass']) : ''; // 增加参数非空校验 if (empty($user_id) || empty($user_pass)) { echo '2'; exit(); }
2. 补全密码校验逻辑
在从数据库取出存储的密码后增加比对逻辑,注意如果数据库存储的是加密后的密码,需要对用户提交的密码做相同加密处理后再比对:
$userPass = sqlsrv_get_field($r2, 1); // 示例为明文比对,若存的是md5加密则改为 if (md5($user_pass) !== $userPass) if ($user_pass !== $userPass) { sqlsrv_close($conn); echo '2'; exit(); }
3. 修复SQL注入风险
将直接拼接变量的UPDATE语句改为参数绑定的写法,和前面的查询逻辑保持一致:
// 替换原拼接SQL的代码 $sql = "UPDATE Account SET Blocked = 0 WHERE UserId = ?"; sqlsrv_query($conn, $sql, array($user_id), array( "Scrollable" => 'static' ));
内容的提问来源于stack exchange,提问作者Suroso
相关产品推荐
相关产品推荐

