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

文本文件读取字符串与HTML表单输入字符串匹配失败问题排查

登录验证失败:SHA1值不一致的排查方案

问题背景

我正在开发一个简单的登录页面,逻辑是从文本文件读取登录信息,与用户在HTML表单中输入的内容比对。核心代码如下:

while (!feof($pass))
{
    $line = stripcslashes(fgets($pass));
    $data = explode(',', $line);
    echo 'username:'.$data[0].' password:'.$data[1];
    if ($user == trim($data[0]) AND $pwd == trim($data[1])) {echo'<p>Data Verified.  Access Granted!</p>'; $inBool = true; break;}
    else {echo ' - '.$user.' and '.$pwd.' are not in data array<br/>';$inBool = false;}
}
if ($inBool == false) {die('Error: username or password not found.');}

即使直接从文件中复制粘贴内容输入,系统也不授予访问权限,遍历所有行后提示“用户名或密码未找到”。后来我添加了代码打印两个字符串的SHA1值,发现二者确实不同,但不清楚原因:

  • 用户输入的SHA1值:3d625d378f07476327e620548ff942eb72a42b8a
  • 文件中密码的SHA1值:753fe78c9dea1654263e5634224a33cc38338fb8

排查方向

  • 处理行尾隐藏字符:fgets()读取的行可能包含换行符(\n)、回车符(\r)或首尾空白,虽然你用了trim()处理数组元素,但如果先对整行做trim()再拆分,能避免拆分后元素带隐藏字符的问题:

    $line = trim(stripcslashes(fgets($pass)));
    $data = explode(',', $line);
    
  • 统一字符编码:文件编码与表单提交编码不一致(比如文件是GBK,表单是UTF-8)会导致同一段文字的二进制内容不同,SHA1值自然不匹配。建议将文件转成UTF-8编码,同时在HTML表单中指定编码:

    <form accept-charset="UTF-8">
    
  • 检查拆分结果的完整性:如果文件中某行有多余逗号、格式错误,explode(',', $line)会生成超过2个元素的数组,导致$data[1]不是完整的密码。可以在循环中添加var_dump($data),查看拆分后的数组是否符合预期。

  • 处理输入转义问题:如果PHP开启了magic_quotes_gpc(旧版本PHP的默认设置),用户输入会被自动转义,导致和文件中的原始内容不一致。可以对表单输入做转义处理:

    $user = stripslashes(trim($_POST['username']));
    $pwd = stripslashes(trim($_POST['password']));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:38:34