2017-05-04 24 views
0

我正在爲登錄頁面編寫一個API,其中密碼被加密並存儲在數據庫中,如下所示:「$ 2y $ 08 $ NwjkR19Vafs28PuSmVrd6OIpL2ix2hUZn4cFwwJqseUQJZqJIXpia」。 如何驗證這個打擊通過使用SQL查詢中輸入密碼,下面是我的API代碼:如何通過API驗證在移動應用程序中輸入的密碼

if (isset($postdata)) { 

    $request = json_decode($postdata); 

    $username = $request->username; 
    $password = $request->password; 

    if($username === NULL && $password === NULL) { 
     $json = array("status" => 0, "message" => "Please enter username and password"); 
    } 
    else { 

     $select_sql = "SELECT `id`, `first_name`, `last_name`, `email`, `phone`, `username`, `password`, `created_on`, `active`, `activation_code` FROM `users` WHERE `email` = '".$username."' AND `password` = '".$password."';"; 
     $select_query = mysqli_query($con,$select_sql); 
     $count = mysqli_num_rows($select_query); 
     $fetch_obj = mysqli_fetch_array($select_query,MYSQLI_BOTH); 
     if($count>0) { 

      $userId = $fetch_obj["id"]; 
      $userEmail = $fetch_obj["email"]; 
      $userDisplayName = $fetch_obj["first_name"]." ".$fetch_obj["last_name"]; 
      $userPhone = $fetch_obj["phone"]; 
      $userName = $fetch_obj["username"]; 
      $userPass = $fetch_obj["password"]; 
      $userCreatedOn = $fetch_obj["created_on"]; 
      $userActive = $fetch_obj["active"]; 
      $userActivationCode = $fetch_obj["activation_code"]; 

      $userDetails = array("UserID" => "$userId", "UserDisplayName" => "$userDisplayName", "UserEmail" => "$userEmail", "UserPhone" => "$userPhone", "UserName" => "$userName", "UserPassword" => "$userPass", "UserCreatedOn" => "$userCreatedOn","UserActive" => "$userActive", "UserActivationCode" => "$userActivationCode"); 

      $json = array("status" => 1, "message" => "Login success.", "UserDetails" => $userDetails); 
     } 
     else { 
      $json = array("status" => 0, "message" => "Invalid username or password.", "query" => $select_sql); 
     } 
    } 
} 
mysqli_close($con); 

我曾嘗試使用下面的代碼嘗試,但無論我在這裏輸入什麼密碼,如有效的密碼,

<?php 

    echo $password = "[email protected]"; 
    echo $hash = password_hash($password, PASSWORD_BCRYPT); 
    if (password_verify($password, $hash)) { 
    echo 'Password is valid!'; 
    } else { 
    echo 'Invalid password.'; 
    } 
    ?> 

有什麼方法可以檢查輸入的密碼,然後將用戶重定向到主頁? 請幫助我,我過去兩天一直堅持這一點。在此先感謝

+0

什麼是您用來加密密碼的加密方法? – ashanrupasinghe

+1

**警告**:編寫自己的訪問控制層並不容易,並且有很多機會使其嚴重錯誤。請不要在[Laravel](http://laravel.com/)等任何現代開發框架(http://codegeekz.com/best-php-frameworks-for-developers/)上編寫自己的認證系統,內置了強大的[認證系統](https://laravel.com/docs/5.4/authentication)。 – tadman

+0

**警告**:使用'mysqli'時,您應該使用[參數化查詢](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)將用戶數據添加到您的查詢中。 **不要**使用字符串插值或連接來完成此操作,因爲您創建了嚴重的[SQL注入漏洞](http://bobby-tables.com/)。 **不要**將'$ _POST','$ _GET'或**任何**用戶數據直接放入查詢中,如果有人試圖利用您的錯誤,這可能會非常有害。 – tadman

回答

1

請下次更好地格式化您的代碼。

此功能

<?php 
echo $password = "[email protected]"; 
echo $hash = password_hash($password, PASSWORD_BCRYPT); 
if (password_verify($password, $hash)) { 
    echo 'Password is valid!'; 
} else { 
    echo 'Invalid password.'; 
} 
?> 

總是表現出有效的密碼,因爲你設置基於密碼的哈希,並驗證其結果的哈希密碼。 如果你希望它返回無效的密碼,將其設置爲別的東西,像這樣的

echo $password = "Wrong Password"; 
echo $hash = password_hash("[email protected]", PASSWORD_BCRYPT); 

對於你的第一個代碼塊中,$密碼是您存儲在數據庫中的哈希,$爲userpass是密碼用戶進入表單,你需要驗證它。這裏是檢查它是否是有效密碼的代碼。

if (password_verify($userPass, $password)) { 
    echo "Correct Password"; 
} else { 
    echo "Invalid Password"; 
} 
+0

@Nguyen所以,你意思是,$ userPass對應於用戶在應用程序中輸入的密碼(例如,例如:「Pass1234」是輸入的密碼),那麼它將如何等於存儲在數據庫中的哈希值$ password字段?很抱歉,如果這讓您感到困惑 –

+0

$ userPass不會等於您存儲在數據庫中的$密碼字段。這就是爲什麼您需要使用password_verify函數來檢查用戶輸入字符串($ userPass)是否與哈希字符串($ password)相比是正確的密碼。 –