文本文件读取字符串与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
相关产品推荐
相关产品推荐

