2016-10-29 16 views
1

私はどのようにフォームを理解しようとし、password_hashと検証作業。ここに私が書いた簡単なコードがあります。 結果は「無効なパスワード」ですphp password_hashとpassword_verifyの問題

私は何が欠けていますか?

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Untitled Document</title> 
</head> 

<body> 

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="pwd"> 
Password: 
<table> 
    <tr> 
    <td><input name="passwd" type="text"/></td> 
    </tr> 
    <tr> 
    <td align="center"><br/> 
     <input type="submit" name="submit_pwd" value="hash"/> 
    </td> 
    </tr> 
</table> 
</form> 

<?php 
$passwd = $_POST['passwd']; 

echo "Password : <BR>".$passwd."\n <BR>" ; 
echo "Hash  : <BR>".$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>"; 

if (password_verify($passwd, $hash)) { 
echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 

?> 

</body> 
</html> 
+0

Phpのバージョンは?( 'echo PHP_VERSION;') – Progrock

答えて

2

ここでは何が起こっているのかを説明しましょう。

何次は...

$hash = password_hash($passwd, PASSWORD_DEFAULT). "\n <BR>" 

も、改行、スペースや<BR>タグが含まれていますあなたはハッシュをしようとしている割り当て、パスワード、あるん。

次に、入力したパスワードが入力されたパスワード、改行、スペース、および<BR>と一致するかどうかを確認しようとしています。

  • これはかなり難しいでしょう、あなたは同意しないでしょうか?

$passwd = $_POST['passwd'];についても未定義のインデックス通知が得られるはずです。そのため、名前付き送信入力を使用して条件文にコード全体をラップしてください。

. "\n <BR>"を完全に削除している間は、コードを次のように変更する必要があります。

if(isset($_POST['submit_pwd'])){ 

    $passwd = $_POST['passwd']; 

    echo "Password : <BR>".$passwd."\n <BR>" ; 
    echo "Hash  : <BR>".$hash = password_hash($passwd, PASSWORD_DEFAULT); 

if (password_verify($passwd, $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
    } 
} 

ここではこれを証明するために、一例として、MD5を使用して簡単なテスト、(私は別のハッシュを生成するので、ここではpassword_hash()を使用していないと、実際に違いを証明するのは難しいだろうに注意です);部分的に借りたコードhttp://php.net/manual/en/function.md5.php

MD5は同じハッシュ値を生成することに注意してください。

$str_good = 'apple'; 
$str_bad = 'apple'. "\n <BR>"; 

echo md5($str_good); // produces 1f3870be274f6c49b3e31a0c6728957f 
echo "<br>"; 
echo md5($str_bad); // produces cb2a3d3161fcc99dcf5e4ccd3bfbb14c 
echo "<br>"; 

if (md5($str_good) === '1f3870be274f6c49b3e31a0c6728957f') { 
    echo "Would you like a green or red apple?"; 
} 

あなたは追加. "\n <BR>"なしの割り当てが他とは異なる値を生成することがわかります。

  • これは、ここでコードに起こっているのと同じことです。

"私は何をしないのですか?"

  • 質問が不足しているものについてではなく、多すぎるかについて。

修正は、「何があまりにも多いのですか」という. "\n <BR>"を削除するだけで簡単です。

+0

ありがとうございます。 PHPは が
エコーこの行を解釈する方法についてはそれ\ nは
「 "$ハッシュ= password_hash($ passwdを、PASSWORD_DEFAULT)。"; 私はどういたしまして@Dragonet心 – Dragonet

+0

に維持されます、あなたがマークしたい場合。 –

+0

done 私は、この行のコード '
'を解釈したことを知りました。$ hash = password_hash($ passwd、PASSWORD_DEFAULT)。 "\ n
"; 'code'としての 'code' $ hash = password_hash($ passwd、PASSWORD_DEFAULT)。 "\ n
'code' not 'code' $ hash = password_hash($ passwd、PASSWORD_DEFAULT) 'code' – Dragonet

0

ときecho内部$hash変数が正しく設定されません。これを使用してください:

$passwd = $_POST['passwd']; 
$hash = password_hash($passwd, PASSWORD_DEFAULT); 
echo "Password : <BR>".$passwd."\n <BR>" ; 
echo "Hash  : <BR>".$hash. "\n <BR>"; 

if (password_verify($passwd, $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 
+1

これは私のdownvoteではありませんが、おそらくあなたはそれについて確信が持たれていない、そして/または "これを試してください"あなたの答えはここで問題を解決していますが(私は理由を知っていますが)、OPや他の人にとっては、あなたが答えを説明するならば、推測や、あなたがしたことを尋ねる人はいないでしょうコードを修正する –

+0

ありがとう@紳士マックス。 'コード' 'コード' $ハッシュ= password_hashとして(; 私はちょうどPHPは 'コード'
"。$ハッシュ= password_hash($ passwdを、PASSWORD_DEFAULT)" \ nは
」この行を解釈することを学びました$ passwd、PASSWORD_DEFAULT) "\ n
'コード' 'コード' $ hash = password_hash($ passwd、PASSWORD_DEFAULT) 'コード' – Dragonet