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,这是不一样的。以某种方式好的,谢谢你。