2017-05-07 4 views
0

私はより安全なページを私にしようとしています。私はその一部を暗号化するパスワードを使い始めました。私はpassword_hash + password verifyを実装しようとしていますが、これまでのところ全部の作業を成功させるには失敗しました。だから、私のログインエリアにあります:PHP password_verifyがデータベースに対して機能していない

$username = mysqli_real_escape_string($connection, $_POST['username']); 

$password = mysqli_real_escape_string($connection, $_POST['password']); 

$query = "SELECT username, password FROM `users` WHERE username='$username' and user_enabled='1'"; 
$result = mysqli_query($connection, $query) or die(mysqli_error($connection)); 
if($row = mysqli_fetch_assoc($result)) { $dbpassword = $row['password']; } 

if(password_verify($password, $dbpassword)) { 
    echo "Successful login"; 
}else{ 
    echo "Invalid Login Credentials."; 
} 

私はいつも無効なログイン資格情報を取得します。私は、ユーザーの新しいパスワードを変更すると

、私がやって次のデータベースで

$pass = mysqli_real_escape_string($connection, $_POST['password']); 
$options = [ 'cost' => 10, 
      'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), 
      ]; 
$password = password_hash($pass, PASSWORD_BCRYPT, $options)."\n"; 

$query = "UPDATE users 
      SET `password` = '".$password."' 
      WHERE id = ".$_POST['user_id']." 
      "; 

$result = mysqli_query($connection, $query) or die(mysqli_error($connection)); 

パスワードはVARCHAR(255)であり、それはのようなものを記憶している。

$2y$10$Y5HIyAsLMfkXIFSJONPsfO3Gxx3b46H.8/WFdLVH3Fqk2XNfy2Uaq 

私はここで間違って何をしていますか?

+0

途中でデバッグします。 'var_dump($ password)'をハッシュした直後にデータベースでチェックし、データベースから取り出した後にチェックしてください。どの段階でもそれはまったく変わるのですか...?確認しようとしているパスワードと同じ操作を行います。 – deceze

+2

SQLインジェクションが頻繁な文字列連結の代わりに、プリペアドステートメントとバインドされたパラメータを使用する方法を学んでください。 – deceze

+0

私は、データベースを更新する前に作成したパスワードとデータベースに保存したパスワードが同じで、ログイン時にデータベースから取得したパスワードが同じであることを確認しました。 – cbarg

答えて

6

次の行の\nには、改行記号(編集:ユーザが入力したパスワードに含めることができないもの)が埋め込まれています

$password = password_hash($pass, PASSWORD_BCRYPT, $options)."\n"; 

となります。削除して新しいハッシュで再起動する必要があります。

Jay BlanchardここでStack submitted a noteのメンバーについてはpassword_hash()マニュアルにも長すぎず、これは彼と私が実際に話したことです。

すなわち、ハッシュの最後に改行文字\nを連結ドキュメントからの例を使用する場合は注意して:

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";

を人々はとのハッシュを格納しています連結された改行と結果としてpassword_verify()は失敗します。

もう1つのオプションはtrim()です。それは(ハッシングの瞬間に)動作します。

$password = password_hash($pass, PASSWORD_BCRYPT, $options)."\n"; 
$password = trim($password); 
// Store in db after 

まだ古いハッシュを消去して新しいハッシュを作成する必要があります。

パスワードをエスケープしないでください。

123'\abc(完全に有効)などは、123\'\abcreal_escape_string()に変更されます。それは必要ではありません。 password_verify()がそれをセキュリティで保護します。

+0

うわー、コインの上に!私はそのコメントを見たことがありません。ありがとうございます@Fred -ii- – cbarg

+1

@cbargようこそ。ジェイはあまりにもずっと前にそのメモを提出した。彼と私はメモを提出するように言ったので、彼は先に進み、それをしました。これはしばしば見落とされるものです。マニュアルのhttp://php.net/manual/enで[Jay's note](http://php.net/manual/en/function.password-hash.php#121017)をupvoteできれば助けになります/function.password-hash.php - そのメモは長引いていました。うまくいけば、他の人がユーザーが投稿したメモを読むことになります。 *乾杯* –

+0

改行を追加するだけであれば、データベースの 'REPLACE()'はそれを修正できるはずです。ハッシュ自体は正しいです。 – tadman

関連する問題