You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP gamelogin.php报Undefined index: user_id/user_pass错误如何解决

报错原因

  • 核心原因是发起请求时未传递user_id、user_pass两个GET参数,代码直接读取$_GET数组中不存在的键,触发PHP Notice级别的报错。
  • 代码同时存在两处高危隐患:
    1. 完全缺失密码校验逻辑,读取到数据库存储的密码后未和用户提交的密码做比对,任意合法用户名无需密码即可登录。
    2. 后续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:36:05