2017-01-28 4 views
-2

パスワードのハッシュ(b-crypt)に問題があります。私はユーザ登録時にこの機能をうまく遂げました:$hashed = password_hash($password, PASSWORD_DEFAULT);。しかし私はコードのこの行を実装する方法を私のコードにpassword_verify($password, $hashed_password)知らない。Password_verify、PDO

これは、クラスのユーザーのセグメントである:

class User{ 
    private $db; 
    public function __construct() { 
     $this->db = new Database(); 
    } 

public function getLoginUser($email, $password){ 
     $sql = "SELECT * FROM tbl_user WHERE email = :email AND password = :password LIMIT 1"; 
     $query = $this->db->pdo->prepare($sql); 
     $query->bindValue(':email', $email); 
     $query->bindValue(':password', $password); 
     $query->execute(); 
     $result = $query->fetch(PDO::FETCH_OBJ); 
     return $result; 
    } 

    public function userLogin($data){ 
     $email = $data['email']; 
     $password = $data['password']; 
     $chk_email = $this->emailCheck($email); 

     if ($email == "" OR $password == "") { 
      $msg = "<div class='alert alert-danger'><strong>Error! </strong>Field must not be Empty!</div>"; 
      return $msg; 
     } 

     if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
      $msg = "<div class='alert alert-danger'><strong>Error! </strong>The E-mail address is not valid!</div>"; 
      return $msg; 
     } 

     if ($chk_email == false) { 
      $msg = "<div class='alert alert-danger'><strong>Error! </strong>The E-mail address Not Exist!</div>"; 
      return $msg; 
     } 

     if (password_verify('password', $hashed)) { 
      echo 'Password is valid!'; 
     } else { 
      echo 'Invalid password.'; 
     } 

     $result = $this->getLoginUser($email, $password); 

     if ($result) { 
      Session::init(); 
      Session::set("login", true); 
      Session::set("id", $result->id); 
      Session::set("name", $result->name); 
      Session::set("username", $result->username); 
      Session::set("loginmsg", "<div class='alert alert-success'><strong>Success! </strong>You are Logged In!</div>"); 
      header("Location: index.php"); 
     } else { 
      $msg = "<div class='alert alert-danger'><strong>Error! </strong>Data not found!</div>"; 
      return $msg; 
     } 
    } 

そして、これは、関数userloginの($ _ POST)と私のlogin.phpです。 。

<?php 
$user = new User(); 
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['login'])) { 
    $usrLogin = $user->userLogin($_POST); 
} 

誰かがこの問題を教えてくれますか?それは私のためにそのコード(セグメント)を書くことができれば役に立ちます。

ありがとうございました

リエード!

+0

'$ hashed'はどこでどのように定義されていますか?パスワード列の長さは何ですか? –

+0

あなたの問題は、SQL文がパスワードをチェックすることですが、これは不可能です。なぜなら、パスワードハッシュは塩漬けで検索可能ではないからです。私は別の[回答](http://stackoverflow.com/a/38422760/575765)で適切な処理を説明しようとしました。 – martinstoeckli

答えて

0

は、あなたは、ユーザーのメールに基づいて、データベースから古いハッシュされたパスワードを取得し、掲示パスワードなどのに対してそれをチェックする必要があり、あなたのログインページでデータベース

$hashed = password_hash($password, PASSWORD_DEFAULT); 

にハッシュされたパスワードを保存するためにpassword_hashを使用しますこの

$password = $_POST['password']; 
if (password_verify($password, $hashed_password_from_database)) { 
    // login 
} else { 
    // error login failed 
}