2014-10-23 3 views
6

내 등록 스크립트는 사용자의 암호를 허용 한 다음 PHP의 password_hash 함수를 사용하여 암호를 암호화 한 다음 데이터베이스에 저장합니다. 방금 만든 사용자를 사용하여 로그인 할 때 암호가 같거나 같은지 확인하는 오류가 발생합니다. 내 경우 엔 그렇지 않아. 로그인 스크립트에서 password_verify 함수를 호출 할 때 내가 뭘 잘못하고 있니?PHP password_hash(), password_verify()

string(1) "1" string(16) "$2y$10$0aysCso3b" 

는 그래서 명확하게, 암호가 일치되지 않는 :

REGISTER

if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    function secure($data){ 
     $data = trim($data); 
     $data = stripslashes($data); 
     $data = htmlspecialchars($data); 
     return($data); 
    } 

    $p_num = secure($_POST["p_number"]); 
    $first_name = secure($_POST["first_name"]); 
    $last_name = secure($_POST["last_name"]); 
    $email = secure($_POST["email"]); 
    $password = secure($_POST["pw"]); 
    $verify_password = secure($_POST["pw_verify"]); 
    $program = secure($_POST["program"]); 
    $role = secure($_POST["role"]); 
    $logged_in = 0; 
    $registered = 0; 
    $image = "../images/profile_placeholder.png"; 

    if($password != $verify_password){ 
     echo "Nope. Passwords"; 
    } 
    else{ 
     $registered = 1; 
     $password = password_hash($password, PASSWORD_DEFAULT); 
     $insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')"; 
     $query = mysqli_query($connect, $insert); 
     echo "Success!"; 
    } 
} 

LOGIN 여기

if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    $p_num = $_POST["username"]; 
    $pwd = $_POST["password"]; 

    $query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'"; 
    $result = mysqli_query($connect, $query); 
    while($row = mysqli_fetch_assoc($result)){ 
     $user_id = "{$row['user_id']}"; 
     $first_name = "{$row['first_name']}"; 
     $last_name = "{$row['last_name']}"; 
     $user_name = $first_name ." " .$last_name; 
     $password = "{$row['password']}"; 
     $image = "{$row['image']}"; 
     $email = "{$row['email']}"; 
     $program = "{$row['program']}"; 
     $role = "{$row['role']}"; 
     $status = "{$row['logged_in']}"; 
     $registered = "{$row['registered']}"; 
     if(($user_id == $p_num) && (password_verify($pwd, $password))){ 
      $_SESSION["id"] = $user_id; 
      $_SESSION["user"] = $user_name; 
      $_SESSION["program"] = $program; 
      $_SESSION["pass"] = $password; 
      $_SESSION["image"] = $image; 
      $_SESSION["email"] = $email; 
      $_SESSION["role"] = $role; 
      $_SESSION["status"] = $status; 
      $_SESSION["registered"] = $registered; 
      $loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'"; 
     } 
    var_dump($pwd); 
    var_dump($password); 
} 

내가 위해서 var_dump를 수행 할 때 내가 무엇을 얻을 toget 그녀. 따라서 등록 스크립트에서 비밀번호가 해시되어 데이터베이스로 전송됩니다. 그런 다음 사용자가 로그인 할 때 로그인 스크립트는 사용자가 로그인하기 위해 입력 한 비밀번호를 확인한 다음 password_verify를 사용하여 데이터베이스의 해시 된 비밀번호와 대조합니다. 그러나 해시 된 암호는 해시되지 않은 암호를 일치로 허용하지 않습니다. 내가 이해하지 못하는 것은, 왜?

+0

로그인 스크립트에서'$ pwd'와'$ password'는 어디에 있습니까? –

+0

아, 모든 걸 복사 한 것 같아. 질문에 추가되었습니다. –

+0

Sidenote : 각 헤더 뒤에'exit;'를 추가해야합니다. I : .:'header ("Location : ../pages/denied_login.php"); exit;' –

답변

10

여기는 password_hashpassword_verify에 사용하는 내용입니다. 서면으로 시험해 보면 성공하면 코드의 나머지 부분을 추가 할 수 있습니다.

수정할 테이블과 열 이름을 지정하십시오.

N.B .: 이것은 기본적인 삽입 방법입니다. 대신 prepared statements을 사용하는 것이 좋습니다.

시드 : 비밀번호 열은 해시가 VARCHAR(255)이 될만큼 충분히 길어야합니다. "각주"를 참조하십시오.

INSERT 파일

<?php 
$DB_HOST = 'xxx'; 
$DB_USER = 'xxx'; 
$DB_PASS = 'xxx'; 
$DB_NAME = 'xxx'; 

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($conn->connect_errno > 0) { 
die('Connection failed [' . $conn->connect_error . ']'); 
} 

$password = "rasmuslerdorf"; 
$first_name = "john"; 
$password = password_hash($password, PASSWORD_DEFAULT); 

$sql = "INSERT INTO users (`name`, `password`) VALUES ('" .$first_name ."', '" .$password ."')"; 

    $query = mysqli_query($conn, $sql); 
    if($query) 

{ 
    echo "Success!"; 
} 

else{ 
    // echo "Error"; 
    die('There was an error running the query [' . $conn->error . ']'); 
} 

LOGIN 파일

<?php 
// session_start(); 

$DB_HOST = 'xxx'; 
$DB_USER = 'xxx'; 
$DB_PASS = 'xxx'; 
$DB_NAME = 'xxx'; 

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($conn->connect_errno > 0) { 
    die('Connection failed [' . $conn->connect_error . ']'); 
} 

$pwd = "rasmuslerdorf"; 
$first_name = "john"; 

//$sql = "SELECT * FROM users WHERE id = 1"; 

     $sql = "SELECT * FROM users WHERE name='$first_name'"; 
     $result = $conn->query($sql); 
     if ($result->num_rows === 1) { 
      $row = $result->fetch_array(MYSQLI_ASSOC); 
      if (password_verify($pwd, $row['password'])) { 

       //Password matches, so create the session 
       // $_SESSION['user'] = $row['user_id']; 
       // header("Location: http://www.example.com/logged_in.php"); 

echo "Match"; 

      }else{ 
       echo "The username or password do not match"; 
      } 

} 

mysqli_close($conn); 

각주 :

암호 열이 해시를 저장하기에 충분히 길어야한다.

"PHP 5.5로 bcrypt 알고리즘 (기본값을 사용하여 긴 72 해시 문자 길이에 생산, 아직 수동이 255

가 참조 제안 것입니다 이 상수는 새롭고 강력한 알고리즘이 PHP에 추가되면서 시간이 지남에 따라 변경되도록 설계되었으므로이 식별자를 사용하여 얻은 결과의 길이는 시간이 지남에 따라 변경 될 수 있습니다. 데이터를 얻는다. 60 자 이상으로 확장 할 수있는 기본 열 (255자를 선택하는 것이 좋음)."

+2

데이터베이스 필드 길이를 확인해 주셔서 감사합니다. 그것은 255가 아니 었습니다. 이 문제를 해결해 주셔서 감사합니다. 나는 준비된 문장을 조사하고 있는데, SQL 인젝션을 수동으로 막는 데 너무 익숙하다. 최근까지는 들어 보지 못했지만, 지금까지 본 것에서부터 꽤 직설적이다. 도움에 다시 한번 감사드립니다. –

+1

@ 로버트 로버트를 매우 환영합니다. 해결되었음을 기쁘게 생각합니다. * 환호 * :) –

+1

왜 당신은 준비된 진술을 사용하지 않습니까? 코드가 프로젝트로 복사되고 변수가'$ _POST [ 'user']'등으로 대체 될 위험이 항상 있습니다. –

1

친구는 우리가 로그인에 대한 고유 한 이름을 사용하는 등, 그래서 우리는 사용자 이름을 사용하여 데이터베이스에서 암호/데이터를 가져 오기해야 만

예 :. 그것은 나를 위해 노력하고 있습니다

<?php 
    $connect = mysqli_connect($localhost, $username, $pwd, $database) or die("Opps some thing went wrong"); 

    if (isset($_POST['submit'])) { 
     extract($_POST); 

    // Get Old Password from Database which is having unique userName 
    $sqlQuery = mysqli_query($connect, "select * from loginTable where User='$username'"); 
    $res = mysqli_fetch_array($sqlQuery); 
    $current_password = $res['userPassword']; 

    if (password_verify($enteredPassword, $current_password)) { 
     /* If Password is valid!! */ 
     $_SESSION['id'] = $res['id']; 
     header("location: home.php"); 
    } 
    else { 
     /* If Invalid password Entered */ 
     $alt = "Login Failed! Wrong user ID or Password"; 
     header("location: index.php?m=$alt"); 
    } 
    } 
?> 

... 데이터베이스에서 암호를 가져오고 입력 된 암호와 비교합니다 PHP API 사용하기 password_verify ($ enteredPassword, $ current_password)

관련 문제