2017-03-05 11 views
-1

私は、登録システムとログインシステムでpassword_hashを使う方法を理解しようとしています。password_hashの使い方登録とログイン

現在、私はこのようにpassword_hashを使用してユーザーを登録しています。

$pass = $_POST['Pass']; 
$hashed_password = password_hash($pass, PASSWORD_DEFAULT); 

$stmt = $conn->prepare("INSERT INTO `usuario`(`Nick`, `Nombre_u`, `Apellidos`, `e-mail`, `Password`, `Domicilio`, `Colonia`, `Codigo_Postal`, `Cuidad`, `Estado`, `Telefono`) VALUES (?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?)"); 
$stmt->bind_param("sssssssisss", $nick, $nombre, $apellidos, $mail, $hashed_password, $domicilio, $colonia, $cp, $cuidad, $estado, $telefono); 
$stmt->execute(); 
header("Location: ../Registrado.php?Done=Welcome"); 

私はこの方法でユーザーをログオンしています。

$usuario = $_POST["Nick"]; 
$contra = $_POST["Pass"]; 
$hashed_password = password_hash($contra, PASSWORD_DEFAULT); 
$stmt = $conn->prepare("SELECT Nick, Password FROM usuario WHERE Nick = ? AND Password= ?"); 
$stmt->bind_param("ss", $usuario, $hashed_password); 
$stmt->execute(); 
$stmt->store_result(); 
$stmt->bind_result($a, $b); 
if($stmt->fetch() == 0){ 
    header("Location: ../Entrar.php?message=Error"); 
    exit(); 
} 
else { 
    session_start(); 
    $_SESSION['Usuario'] = $a; 
    $_SESSION['estado'] = 'Autenticado'; 
    header("Location: ../../Index.php"); 
    exit(); 
}  

私が理解していることそれは私のクエリがこのようなことをするということです。

最初に私の入力Egを受け取ります: "123"、その後hashed_pa​​sswordは私の入力を "$2y$10$BvFW3ott5f7JvZ4rCa"に変換します。そして、私のクエリはこのような仕事をします。

SELECT Nick, Password FROM usuario WHERE Nick = 'User' AND Password= '$2y$10$BvFW3ott5f7JvZ4rCa' 

しかし、私はまだログインフォームに戻り、代わりにユーザーにログインします。

私は間違っていますか?

+0

ログイン時にSELECTにはpassword_verify()とpassword_hash()が必要です。 –

+0

さらに、パスワード列の長さが短すぎます。最善の方法は、マニュアルを読んで、その構文を "手紙に"従うことです。 –

+0

'password_hash()'は、同じパスワードであっても、使用するたびに異なるハッシュを生成します。ユーザー名のパスワードハッシュを取得してから、前述の他のコメントと同様に、代わりにあなたのコードの 'password_verify()'で確認する必要があります。 –

答えて

1

[OK]を私はpassword_verify()

$usuario = $_POST["Nick"]; 
$contra = $_POST["Pass"]; 
$stmt = $conn->prepare("SELECT Nick, Password FROM usuario WHERE Nick = ?"); 
$stmt->bind_param("s", $usuario); 
$stmt->execute(); 
$stmt->store_result(); 
$stmt->bind_result($a, $b); 

if($stmt->fetch() == 0){ 
    header("Location: ../Entrar.php?message=Error"); 
    exit(); 
} 
else { 
    if(password_verify($contra, $b)) { 
     session_start(); 
     $_SESSION['Usuario'] = $a; 
     $_SESSION['estado'] = 'Autenticado'; 
     header("Location: ../../Index.php"); 
     exit; 
    } 
    else{ 
     header("Location: ../Entrar.php?message=Error"); 
     exit; 
    } 
} 

で、この作品を作ったすべてのそれらのコメントをいただき、ありがとうございます。 そしてはいmartinstoeckli私の質問への回答ありがとう

関連する問題