PHP:strcmp不起作用?

PHP:strcmp不起作用?,php,passwords,strcmp,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

我试图从文本文件中读取密码,并将其与用户输入的密码进行比较。 但是,尽管我觉得这两个词完全相同,但我的脚本说的是另外一件事:

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

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

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

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

玩得开心

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

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


作为调试的旁注:请记住,您正在向浏览器输出HTML,浏览器会自动折叠所有空白。要查找两个字符串不相同的原因,请使用撇号(
echo“%$sample1”%$sample2“;
)将echo语句括起来,或者按照Rocket Hazmat的建议使用var_dump,或者将其输出到
部分。此外,如果字符串在输出中看起来相同,请与strlen再次检查,以确定其中没有“混乱”。

使用var_dump检查$haystack和$pinder中的startsWith()内容

function startsWithPassword($haystack, $needle)
{
    $needle .= ':';
    return !strncmp($haystack, $needle, strlen($needle));
}
还请注意,startsWith()已断开-如果行为“booksworm:bob”,但用户输入了密码“book”,则返回true。您应该(至少!)添加这样一行:

因此,您正在尝试将“enteredpassword:”与行的开头匹配

当然,如果用户在密码中使用冒号,您仍然会被卡住


如果您查找并了解有关密码加密和散列的信息,那么您将是一个更安全的站点,更快乐的程序员

尝试使用
var\u dump($pass)
var\u dump($retrievedPassword)
。可能里面有一些额外的字符。“试图从文本文件中读取密码”-我希望这只是一个测试。不完全安全。
$pass===$retrievedPassword
有效吗?
fgets()
返回EOF(文件结尾)和行结尾,使用
var\u dump
检查也是一个好主意。另外,从文本文件检索的行上是否有换行符?谢谢。我确实先尝试了这个,但没有使用$var[1],而是使用了$retrievedPassword,这是不一样的。以某种方式好的,谢谢你。