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
相关产品推荐
相关产品推荐

