2017-05-15 7 views
0

私はログイン/登録プロジェクトを学校(初心者)にビルドしています。ユーザー登録時にユーザーを塩漬けにしました。しかし、ハッシュ/塩でログイン情報を確認したいときは、それを取り除くことはできません。データベースからの塩を確認する

マイレジスタのコードは次のとおりです。

$localhost="host"; 
$user="user"; 
$password="password"; 
$database="database"; 
$email =$_POST['email']; 
$passwords =$_POST['passwords']; 

$conn =new mysqli($localhost, $user, $password, $database); 
$error =$conn->connect_error; 
if($error){ 
    $code = $conn->connect_errno; 
    die("Error: ($code) $error"); 
    } 

    $email = mysqli_real_escape_string($conn, $_POST['email']); 
    $passwordFromPost = $_POST['passwords']; 
    $salt = password_hash($passwordFromPost, PASSWORD_BCRYPT); 
    $passwords = mysqli_real_escape_string($conn, $_POST['passwords']); 


    $sql = "INSERT INTO Users (email, passwords, salt) 
    VALUES('$email','$passwords','$salt')"; 
    $result= $conn->query($sql); 


    $conn->close(); 

私はここに別のポストにそれについて少し読んで、私は$passwordCorrect = password_verify("password", $hashPassword);

とPWを復号化することができるはずだと思うけど実装する方法イムわかりませんそれはPHPコードでそれを確認するユーザーを確認します。 次のステップとして何をすべきかについてのヒントを教えてください。

答えて

1

塩を実際に作成していない場合はit is included as part of the hashとなり、password_hash()機能を使用してパスワードを確認します。あなたは決して復号化この機能でパスワードを、あなたはハッシュが正しいことを確認するだけです。

この行の$salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);は、実際には塩を作成しません。パスワードハッシュが作成されます。

あなたはこのような関数を使用すること正しいです:パスワードが確認された場合$passwordCorrecttrueなります

$passwordCorrect = password_verify("password", $hashPassword); 

。そうでない場合、それはfalseになります:あなたのコードで

if($passwordCorrect) { 
    // allow login 
} else { 
    // do not allow login 
} 

あなたには、いくつかのラインを取り除くと、これに変更することができます。

$email = mysqli_real_escape_string($conn, $_POST['email']); 
$passwordFromPost = $_POST['passwords']; 
$password = password_hash($passwordFromPost, PASSWORD_BCRYPT); 

を今あなたがしなければならないすべては、パスワードや電子メールを保存しています他のデータはありません。

さて、データベースを照会:

$stmt = $conn->prepare('SELECT * FROM Users WHERE email = ?'); 
$stmt->bind_param("s", $_POST['email']); 
$result = $stmt->execute(); 

は今、ユーザーのパスワードは、結果の配列であると$_POST['password']と比較することができます。

5.5より小さいPHPバージョンを使用している場合は、password_hash()compatibility packを使用できます。 ハッシュする前に、escape passwordsのいずれかの洗浄機構を使用する必要はありません。そうするとはパスワードをに変更し、不要な追加のコーディングを引き起こします。また

Little Bobbyyour script is at risk for SQL Injection Attacks.を言うがMySQLiprepared文をご覧ください。でもescaping the stringは安全ではありません!

+0

ありがとうございます、あなたは何を取り除いていいのですか? – Hippimaster

+0

パスワードをエスケープする行は必要ありません@Hippimaster –

0

最初からベストプラクティスに慣れさせるために、クエリでは実際のエスケープ文字列ではなく、準備されたステートメントを使用します。

パスワードは保存しないでください。ハッシュのみを保存してください。だから、
$salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);
$password = password_hash($passwordFromPost, PASSWORD_BCRYPT);

だけ
へのストアメールアドレスを変更し、パスワードをハッシュ化されました。次に、ログインを確認する際に、email =提供された電子メールのパスワードを選択し、password_verify( 'login from password'、 'db from password')を使用すると、パスワードが一致すると結果がtrueになります。

関連する問題