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

ファイルから読み取るときは、常に「mess」がそこにあると想定してください。特に、テキスト ファイルは、編集に使用された OS のプログラムに応じて異なる行区切りを持つことがよくあります。歴史的に、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 に答える
1

パスワードハッシュです。strcmp を使用する必要はありません。簡単な方法は次のとおりです。

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

楽しんで

于 2013-04-12T15:47:02.910 に答える
0

var_dump を使用して、startsWith() 内の $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 に答える