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

PHP读取txt账号数据匹配POST提交密码失败问题排查

问题根源

你的代码有两个核心bug,直接导致密码匹配失效:

  • 校验逻辑位置错误
    你把密码比对的逻辑写在了for循环外部,循环执行完成后计数器$i的值已经等于$k(也就是$data数组的总长度),属于超出数组范围的非法索引值,这时候访问$user_array[$i][1]根本拿不到正确的存储密码。你之前测试登录名字段匹配能生效,大概率是临时把校验逻辑写在了循环内部,属于测试时的代码位置偏差。
  • 不可见换行符残留
    不同操作系统的换行符规则不同:Windows系统的换行符是\r\n,类Unix系统是\n。你现在只用\n拆分文件内容,每行末尾的\r(不可见回车符)会残留在每行最后一个字段(也就是密码字段)的末尾,比如文件里存的pass1实际读取出来是pass1\r,和表单提交的不带特殊字符的密码做比对时自然不会相等。而登录名字段是每行的第一个字段,不会沾到行尾的残留换行符,所以匹配登录名字段时不会被这个问题影响。
修复方案

直接替换后端PHP代码即可,修复点包括:处理换行符残留、修正校验逻辑位置、增加字段合法性判断、补充账号匹配逻辑(原逻辑未校验提交的登录名,只要密码碰对就能通过,本身存在逻辑漏洞):

<?php
// 读取用户文件,自动去除行尾换行、跳过空行
$lines = file("users.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$user_array = [];

foreach ($lines as $line) {
    $line = trim($line);
    $userInfo = explode(" | ", $line);
    // 只存储格式正确的账号密码行
    if (count($userInfo) == 2) {
        $user_array[] = [
            trim($userInfo[0]),
            trim($userInfo[1])
        ];
    }
}

if (isset($_POST["submitBtn"])) {
    $submitLogin = trim($_POST["login"]);
    $submitPwd = trim($_POST["password"]);
    $loginFlag = false;

    // 遍历用户数组做匹配
    foreach ($user_array as $user) {
        if ($user[0] === $submitLogin && $user[1] === $submitPwd) {
            $loginFlag = true;
            break;
        }
    }

    if ($loginFlag) {
        echo "works";
    }
}
?>

注意:上述代码仅为修复当前匹配逻辑的演示版本,正式生产环境禁止明文存储用户密码,请使用password_hash()函数做密码哈希存储后再做校验。

内容的提问来源于stack exchange,提问作者Val

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:24:22