2014-04-26 27 views
-1

我試圖檢查用戶散列的密碼與我在數據庫中保存的密碼。這與this guy幾乎是相同的問題,但我試圖用PDO來做到這一點,我不確定如何從數據庫獲取散列密碼來檢查它。這裏是我目前登錄頁面的代碼:如何使用PDO和Phpass檢查數據庫的登錄信息

<?php 
ini_set('display_errors', 1); 
error_reporting(E_ALL); ini_set('display_errors', 1); 

require_once "/home/carlton/public_html/PHPproject/includes/PasswordHash.php"; 

if ($_POST){ 
$form = $_POST; 
$username = $form['username']; 
$password = $form['password']; 


try{ 
    $db = new PDO('mysql:host=localhost;dbname=phpproject', 'root', 'pdt1848!'); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
    catch(PODException $e){ 
     echo "Can't connect to the database"; 
    } 
$sql = "SELECT * FROM users WHERE username=:username"; 
$query = $db->prepare($sql); 
$query->execute(array(':username'=>$username, ':password'=>$stored_hash)); 
$results = $query->fetchAll(PDO::FETCH_ASSOC); 


$check = $hash_obj->CheckPassword($password, $stored_hash); 
if($check){ 
    print_r("Registered user"); 
} 
else{ 
    print_r("Not a registered user"); 
} 


//login here 
} 
else{ 
?> 
<form name="login" action="login.php" method="POST"> 
<label for "username">Username: </label> 
<input type="text" name="username"/><br /> 
<label for "password">Password: </label> 
<input type="password" name="password"/><br /> 
<button type="submit">Submit</button> 
<button type="reset">Reset Form</button> 
</form> 
<?php 
} 
?> 
+1

您可以爲「phpproject」數據庫創建一個單獨的mysql用戶,而不是使用root用戶,從而最大限度地減少應用程序被黑客入侵時其他數據庫的暴露。 – MattBianco

回答

0

僞代碼:

$q=$db->prepare('SELECT * FROM usertable WHERE username=? AND passwordhash=?'); 

$thehashvalue=calc_hash_of_password_according_to_your_agorithm($params); 
$theusername=the_username_that_was_posted(); 

$q->execute(array($theusername, $thehashvalue)); 

$lastlogin=null; 
while($r=$q->fetch(PDO::FETCH_ASSOC)) { 
    # successfully authenticated 
    $lastlogin=$r['lastlogin']; ## example. assumes a "lastlogin" column on "usertable" 
} 

if(!empty($lastlogin)) { 
    # user is logged in 
}else{ 
    # login failed 
} 

散列計算功能可以像md5($posted_passwd)簡單,但它是很好的做法,鹽哈希所以相同的密碼可以爲不同用戶和/或在不同的系統不同的哈希值。只要確保在將密碼哈希存儲在數據庫中時使用相同的哈希函數。

1

這很簡單。

您必須先選擇存儲的密碼,然後進行驗證。

-1

這是我的登錄工作代碼,以防其他人遇到類似的問題。我正在尋找的信息在第20行,從$響應開始。這使我可以從數據庫中獲取密碼,我將其設置爲$ stored_hash。然後我可以使用PHPass中的CheckPassword函數進行比較。

<?php 
session_start(); 
ini_set('display_errors', 1); 
error_reporting(E_ALL); ini_set('display_errors', 1); 

require "/home/carlton/public_html/PHPproject/includes/PasswordHash.php"; 

if ($_POST){ 
    $form = $_POST; 
    $username = $form['username']; 
    $password = $form['password']; 
    $hash_obj = new PasswordHash(8, false); 

    try{ 
     $db = new PDO('mysql:host=localhost;dbname=phpproject', 'carl', 'pdt1848?'); 
     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
     catch(PODException $e){ 
      echo "Can't connect to the database"; 
     } 
    $response = $db->query("SELECT password FROM users WHERE username='$username'"); 
    $data=$response->fetch(); 
    $stored_hash = $data['password']; 

    $check = $hash_obj->CheckPassword($password, $stored_hash); 
    if($check){ 
     echo "Login successful!"; 
     $_SESSION['logged_in'] = true; 
    } 
    else{ 
     echo "Authentication failed. Please try again."; 
    } 


    //login here 
} 
else{ 
?> 
<form name="login" action="login.php" method="POST"> 
    <label for "username">Username: </label> 
    <input type="text" name="username"/><br /> 
    <label for "password">Password: </label> 
    <input type="password" name="password"/><br /> 
    <button type="submit">Submit</button> 
    <button type="reset">Reset Form</button> 
</form> 
<?php 
} 
?> 
0

你真的只是比較你的數據庫中的散列密碼與輸入的密碼相匹配,一旦它也被類似的散列。

  • 首先,不要使用root帳戶來訪問您的數據庫
  • 儘量避免SELECT * - 只需選擇你真正需要的列。
  • 令牌數(:username)必須等於查詢中的綁定參數數(':username'=>$username)。否則PDO會拋出一個錯誤。
  • 您還沒有發佈處理密碼驗證本身的類,但它基本上只是對輸入進行散列處理並將兩者進行比較,並返回一個布爾值。
  • 順便提一句,print_r是回顯變量,特別是數組的值。如果你只是迴應一個字符串作爲迴應,那麼只需printecho就可以了。
相關問題