PHP:strcmp不起作用?

时间:2013-04-12 15:41:53

标签: php passwords strcmp

我试图从文本文件中读取密码,并将其与用户输入的密码进行比较。 但是虽然在我看来这两个词完全相同,但我的剧本却说了别的:

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

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

3 个答案:

答案 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:'与行的开头匹配。

当然,如果用户将冒号放入密码中,您仍然会被卡住......

如果你查阅并了解盐渍和哈希密码,那么你将会有一个更安全的网站更快乐的编码器!