2017-08-26 89 views
2

我想通過使用password_hash和PDO準備語句來防止SQL注入來提高我的安全性。我已經使用MySQLi OOP和Procedural。我正在嘗試轉向PDO並想學習。 所以我創建了一個使用PDO的註冊表單,它已經在工作,密碼的加密也在工作。但是,即使使用正確的用戶名和密碼登錄,我也無法登錄。Php註冊和登錄password_hash密碼默認使用pdo

這是我用來在註冊表單中填入密碼的代碼。

$password = $_POST['password']; 
$hash = password_hash($password, PASSWORD_DEFAULT); 

然後我用準備好的語句執行它。所以在這裏沒有錯誤一切正常。

但是,當我嘗試登錄時,它不會將我重定向到它應該在的着陸頁。

因此,這裏的代碼將我登錄

<?php 
session_start(); 
$host = "localhost"; 
$username = "root"; 
$password = ""; 
$database = "PDOtesting"; 
$message = ""; 
try 
{ 
     $connect = new PDO("mysql:host=$host; dbname=$database", $username, $password); 
     $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     if(isset($_POST["login"])) 
     { 
      if(empty($_POST["username"]) || empty($_POST["password"])) 
      { 
       $message = '<label>All fields are required</label>'; 
      } 
      else 
      { 
       $query = "SELECT * FROM users WHERE username = :username AND password = :password"; 
       $statement = $connect->prepare($query); 
       $statement->execute( 
        array( 
          'username'  =>  $_POST["username"], 
          'password'  =>  $_POST["password"] 
        ) 
       ); 
       $count = $statement->rowCount(); 
       if($count > 0) 
       { 
        $_SESSION["username"] = $_POST["username"]; 
        header("location:login_success.php"); 
       } 
       else 
       { 
        $message = '<label>Wrong Data</label>'; 
       } 
      } 
     } 
} 
catch(PDOException $error) 
{ 
     $message = $error->getMessage(); 
} 
?> 

我應該也包括我把它在註冊的password_hash功能?我應該在哪裏放置代碼。 尋求幫助。 在此先感謝。

+0

查詢用戶僅;得到你的查詢結果並使用'password_verify'函數比較它,如果它工作的話讓它成功,否則它不是......''password_hash'在每次使用它時會爲同一個字符串生成不同的密碼,因爲它每次產生隨機鹽正在使用 – ahmad

回答

4

不要試圖在查詢中匹配密碼,選擇用戶,返回,然後在結果上使用password_verify

更新:通過用戶名

<?php 
... 
try 
{ 
     $connect = new PDO("mysql:host=$host; dbname=$database", $username, $password); 
     $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     if(isset($_POST["login"])) 
     { 
      if(empty($_POST["username"]) || empty($_POST["password"])) 
      { 
       $message = '<label>All fields are required</label>'; 
      } 
      else 
      { 
       $query = "SELECT * FROM users WHERE username = :username LIMIT 1"; 
       $statement = $connect->prepare($query); 
       $statement->execute( 
        array( 
          'username'  =>  $_POST["username"] 
        ) 
       ); 
       $count = $statement->rowCount(); 
       if($count > 0) 
       { 
        $result = $statement->fetch(); 

        //check password 
        if (password_verify($_POST["password"], $result['password'])) { 
         $_SESSION["username"] = $_POST["username"]; 
         exit(header("location:login_success.php")); 
        } else { 
         $message = '<label>Wrong Data</label>'; 
        } 
       } 
       else 
       { 
        $message = '<label>Wrong Data</label>'; 
       } 
      } 
     } 
} 
catch(PDOException $error) 
{ 
     $message = $error->getMessage(); 
} 
?> 
+0

這樣的? password_varify($ _ POST [「password」],PASSWORD_DEFAULT)糾正我,如果我錯了 –

+0

Na'password_varify($ _ POST [「password」],$ result-> password)','$ result-> password'被存儲散列在分貝。 –

+0

它不會爲我工作,你可以發佈它就像代碼中的查詢?對於這種干擾,我很抱歉:( –