0

我试图从文本文件中读取密码,并将其与用户输入的密码进行比较。但是,尽管在我看来这两个词完全一样,但我的脚本还说了别的:

$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));
}

密码是加密的还是类似的,或者为什么这个代码不起作用?

4

3 回答 3

1

是密码哈希。您不需要使用 strcmp 。简单的方法是:

if($pass == $var[1]))

玩得开心

于 2013-04-12T15:47:02.910 回答
1

从文件中读取时,总是假设“混乱”在那里。特别是文本文件通常具有不同的行分隔符,具体取决于用于编辑它们的操作系统的哪个程序 - 历史上 Windows 使用 CRLF、Mac CR 和 *nix 变体 LF,但像 Notepad2 和 Notepad++ 这样的现代编辑器允许您配置它们。

在分解冒号分隔符上的行之前,使用 trim() 删除任何无关的空格,如过时的行分隔符和尾随空格/制表符。

作为调试的旁注:请记住,您正在将 HTML 输出到浏览器,它会默默地折叠所有空格。要查找 2 个字符串不相同的原因,请将 echo 语句包含在撇号 ( echo "'$sample1' '$sample2'";) 中,或者按照 Rocket Hazmat 的建议使用 var_dump,或者在一个<pre>部分中输出。此外,如果字符串在输出中看起来相同,请使用 strlen 仔细检查以了解其中没有“混乱”。

于 2013-04-12T15:48:54.857 回答
0

使用 var_dump 检查 $haystack 和 $needle 中的内容

另请注意,您的 startsWith() 已损坏 - 如果该行是“bookworm:bob”但用户输入了密码“book”,它将返回 true。您应该(至少!)添加这样的一行:

function startsWithPassword($haystack, $needle)
{
    $needle .= ':';
    return !strncmp($haystack, $needle, strlen($needle));
}

因此,您尝试将 'enteredpassword:' 与该行的开头进行匹配。

当然,如果用户在他们的密码中输入冒号,你仍然会被卡住......

如果您查找并了解加盐和散列密码,那么您将成为一个更快乐的编码员,拥有一个更安全的网站!

于 2013-04-12T15:53:40.937 回答