我试图从文本文件中读取密码,并将其与用户输入的密码进行比较。 但是虽然在我看来这两个词完全相同,但我的剧本却说了别的:
$user = $_POST['user'];
$pass = $_POST['pass']; //HTML form element with type="password"
$line;
$retrievedPassword = "";
$f = fopen("data/abc.log", "r");
// Read line by line until end of file
while(!feof($f)) {
$line = fgets($f);
if (startsWith($line, $user)) {
break; //password found
}
}
fclose($f);
$var = explode(":", $line);
$retrievedPassword = $var[1];
echo $pass." ".$retrievedPassword; // example: password password
if (strcmp($pass, $var[1]) == 0) {
header('Location: user.php'); //never the case
}else {
//header('Location: index.php');
}
function startsWith($haystack, $needle)
{
return !strncmp($haystack, $needle, strlen($needle));
}
密码是加密的还是类似的?或者为什么这段代码不起作用?
答案 0 :(得分:1)
是密码哈希。你不需要使用strcmp。简单的方法是:
if($pass == $var[1]))
玩得开心
答案 1 :(得分:1)
从文件中读取时,总是假设“混乱”在那里。特别是文本文件通常具有不同的行分隔符,具体取决于使用哪个OS编辑它们的程序 - 历史上Windows使用CRLF,Mac CR和* nix变体LF,但是现有的编辑器如Notepad2和Notepad ++允许您配置它们。
在爆炸冒号分隔线上之前,使用trim()删除任何无关的空格,如过时的行分隔符和尾随空格/制表符。
作为调试的旁注:请记住,您正在将HTML输出到浏览器,该浏览器会静默地折叠所有空格。要查找2个字符串不相同的原因,请将echo语句包装在撇号(echo "'$sample1' '$sample2'";
)中,或者按照Rocket Hazmat的建议使用var_dump,或将其输出到<pre>
部分。另外,如果字符串在输出中看起来相同,则用strlen双重检查以确定那里没有“乱七八糟”。
答案 2 :(得分:0)
使用var_dump检查$ haystack中的内容和$ needle内的startsWith()
另请注意,您的startsWith()已损坏 - 如果该行是“bookworm:bob”,则会返回true,但用户输入了密码“book”。你应该(至少!)添加这样的一行:
function startsWithPassword($haystack, $needle)
{
$needle .= ':';
return !strncmp($haystack, $needle, strlen($needle));
}
那么你试图将'enteredpassword:'与行的开头匹配。
当然,如果用户将冒号放入密码中,您仍然会被卡住......
如果你查阅并了解盐渍和哈希密码,那么你将会有一个更安全的网站更快乐的编码器!