2017-10-22 2 views
0

기본 질문이지만 계속 실패하고 있습니다. 유사한 주제를 체크 아웃했지만 솔루션에 더 가까이 가지 않았으므로 나에게 리디렉션하지 마십시오. 빠진 부분을 지적하십시오. 고맙습니다.php password_hash 및 password_verify fail

<?php 

$hashed_password = ""; 
$con = mysqli_connect("localhost", "root", "", "testTable"); 

if (isset($_POST["reg_button"])){ 

$password = ($_POST["reg_password"]); 

$hashed_password = password_hash($password, PASSWORD_DEFAULT); 

$query = mysqli_query($con, "INSERT INTO user VALUES('', '$hashed_password')"); 

} 
?> 

<!DOCTYPE html> 
<html> 
<head> 
    <title>register</title> 
</head> 
<body> 
    <form action="register.php" method="POST"> 
     <input type="password" name="reg_password" placeholder="Password"> 
     <br><br> 
     <input type="submit" name="reg_button" value="Register"> 
    </form> 
    <br> 
    <form action="login.php" method="POST"> 
     <input type="password" name="login_password" placeholder="Password"> 
     <br><br> 
     <input type="submit" name="login_button" value="Login"> 
    </form> 
</body> 
</html> 

이것은 등록 부분이며 완벽하게 작동합니다. 제공된 암호가 해킹되어 DB에 저장됩니다.

<?php 

include "register.php"; 

$con = mysqli_connect("localhost", "root", "", "testTable"); 

if(isset($_POST["login_button"])){ 

    $password = password_verify($_POST["login_password"], $hashed_password); 

    $checkDB = mysqli_query($con, "SELECT * FROM user WHERE password = '$password'"); 

    $checkLogin = mysqli_num_rows($checkDB); 

    if($checkLogin == 1){ 
     $row = mysqli_fetch_array($checkDB); 

     echo "Welcome"; 
    } 

    else { 
     echo "Password incorrect"; 
    } 
} 
?> 

이것은 로그인 부분이며 항상 실패합니다. 다음 발췌 문장이 범인 것으로 의심됩니다.

$password = password_verify($_POST["login_password"], $hashed_password); 

그러나 수정 방법은 모릅니다.

도움이 될 것입니다. 고맙습니다!

업데이트 된 코드 :

register.php :

<?php 

$hashed_password = ""; 
$name = ""; 
$con = mysqli_connect("localhost", "root", "", "testTable"); 

if (isset($_POST["reg_button"])){ 

    $password = ($_POST["reg_password"]); 
    $name = ($_POST["reg_name"]); 

    $hashed_password = password_hash($password, PASSWORD_DEFAULT); 

    $query = mysqli_query($con, "INSERT INTO user VALUES('', '$name','$hashed_password')"); 

} 
?> 

<!DOCTYPE html> 
<html> 
<head> 
    <title>register</title> 
</head> 
<body> 
    <form action="register.php" method="POST"> 
     <input type="text" name="reg_name" placeholder="Name"> 
     <br><br> 
     <input type="password" name="reg_password" placeholder="Password"> 
     <br><br> 
     <input type="submit" name="reg_button" value="Register"> 
    </form> 
    <br> 
    <form action="login.php" method="POST"> 
     <input type="text" name="login_name" placeholder="Name"> 
     <br><br> 
     <input type="password" name="login_password" placeholder="Password"> 
     <br><br> 
     <input type="submit" name="login_button" value="Login"> 
    </form> 
</body> 
</html> 

login.php?

당신이 hashed_password $합니까 곳에서 아래
<?php 

include "register.php"; 

$con = mysqli_connect("localhost", "root", "", "testTable"); 

if(isset($_POST["login_button"])){ 

    $name = $_POST['login_name']; 
    $password = $_POST['login_password']; 

    $checkDB = mysqli_query($con, "SELECT * FROM user WHERE name = '$name'"); 

    $passwordField = null; 

    while($getRow = mysqli_num_rows($checkDB)){ 
     $passwordField = $getRow['password']; // Get hashed password 
    } 

    if(password_verify($password, $passwordField)){ 
     echo('Correct'); 
    }else{ 
     echo('Wrong'); 
    } 
} 
?> 

답변

0

while 루프와 mysqli_fetch_array()를 통해이를 수행 할 수 있습니다. 그것은 당신의 문제를 해결해야합니다. : [업데이트 됨]

<?php 

$con = mysqli_connect("localhost", "root", "", "testtable"); 

if(isset($_POST["login_button"])){ 

    // $password = password_verify($_POST["login_password"], $hashed_password); 
    $password = $_POST['password']; 
    $checkDB = mysqli_query($con, "SELECT * FROM user"); 

    while($getRow = mysqli_fetch_array($checkDB)){ 
     $passwordRow = $getRow['password']; 
    } 

    if(password_verify($password, $passwordRow) === TRUE){ 
     echo('Welcome'); 
    }else{ 
    echo('Wrong credentials'); 
    } 
} 
?> 
+0

답변 해 주셔서 감사합니다. 귀하의 코드를 사용하려고, 잘 작동하지만 로그인이 오면 내가 겪어야 할 문제입니다. 치명적인 오류 : 30 초의 최대 실행 시간이 C : \ xampp \ htdocs \ test \ login.php의 16 행을 초과했습니다. 분명히 'while'으로 인해 충돌이 발생합니다 – idontgetit

+0

양식에 필드 (암호)가 하나만 있습니까? – Sanjay

+0

아니요, '이름'입력란도 추가했습니다. 위의 업데이트 된 코드를 참조하십시오. – idontgetit

1

당신이 register.php를 포함하더라도, 그 값들이 설정되지 않았기 때문에 아무 일도하지 않습니다.

$password = password_verify($_POST["login_password"], $hashed_password); 

먼저 db에서 가져와야합니다.

두 번째로 password_verify은 true 또는 false를 반환하므로 $ hashed_password가 설정되어 있어도 $ password는 부울 값이됩니다.

+0

나는 "register.php"를 포함 시키면 $ hashed_password를 얻었을 것이라고 생각했습니다. 그렇지 않습니까? 그러면 어떻게 가치를 부여해야합니까? – idontgetit

+0

@idontgetit 로그인 할 수없고 동시에 등록 할 수 있습니다. 데이터베이스에서 해시를 가져옵니다. 'SELECT pass_column FROM ... WHERE username = ..' – Mihai

+0

감사합니다. Mihai – idontgetit