2017-03-05 2 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(); 
}  

내 이해 방법 내 쿼리는 이와 같은 작업을 수행합니다.

첫 번째 입력 예 : "123"그러면 hashed_password는 입력 내용이 예 : "$2y$10$BvFW3ott5f7JvZ4rCa"으로 바뀌고 내 쿼리가 이와 같은 작업을 수행합니다.

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

하지만 여전히 로그인 양식으로 돌아가는 대신 내 사용자가 로그인합니다.

내가 뭘 잘못하고 있니?

+0

로그인시 SELECT에는 password_hash()가 아니라 password_verify()가 필요합니다. –

+0

더하기, 비밀번호 열 길이가 너무 짧습니다. 가장 좋은 방법은 매뉴얼을 읽고 "편지로"문법을 따르는 것입니다. –

+0

'password_hash()'는 패스워드가 같을 때마다 사용할 때마다 다른 해시를 생성합니다. 사용자 이름에 대한 암호 해시를 가져와야하고 언급 된 다른 주석과 마찬가지로 코드에서'password_verify()'로 확인해야합니다. –

답변

1

좋아 내가 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 내 질문에 대한 답변이었습니다.