[英]PHP PDO Error when fetching hashed strings from SQL table
當我將MySQLi
更改為PDO
,從我的users
表中獲取散列字符串時遇到錯誤。
這是我之前使用的代碼:
CheckPassword
使用MYSQLI
驗證有效
$mysqli = new mysqli("localhost","_USER_","_PASS_","_DB_");
$username = '_USERNAME_';
$pass = '_PASSWORD_';
$sql = "SELECT * FROM `users` WHERE username='$username' LIMIT 1";
$result = $mysqli->query($sql);
if($assoc = $result->fetch_assoc()){
$db_pass = $assoc['userpass'];
require 'PasswordHash.php';
$hash_cost_log2 = 8;
$hash_portable = FALSE;
$hasher = new PasswordHash($hash_cost_log2, $hash_portable);
if($hasher->CheckPassword($pass, $db_pass)) {
echo "valid"; // VERIFIES VALID
} else {
echo "invalid";
}
}
我切換到PDO
的原因是為了防止SQL 注入。
但現在: CheckPassword
VERIFIES INVALID USING PDO
$pdo = new PDO('mysql:dbname=_DB_;host=localhost', '_USER_', '_PASS_',
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$username = '_USERNAME_';
$pass = '_PASSWORD_';
$stmt = $pdo->prepare('SELECT * FROM `users` WHERE username = :u LIMIT 1');
$stmt->bindParam(':u', $username);
$stmt->execute();
if($fetch = $stmt->fetch(PDO::FETCH_ASSOC)){
$db_pass = $fetch['userpass'];
require 'PasswordHash.php';
$hash_cost_log2 = 8;
$hash_portable = FALSE;
$hasher = new PasswordHash($hash_cost_log2, $hash_portable);
if($hasher->CheckPassword($pass, $db_pass)) {
echo "valid";
} else {
echo "invalid"; // VERIFIES INVALID
}
}
}
怎么會這樣; MySQLi
獲取與PDO
不同的散列字符串? 無論何種加密我使用散列密碼,使用取當它不能驗證他們作為真正的PDO
,但使用只讀取時MySQLi
?
原因是因為當你比較用戶輸入的密碼和數據庫中的密碼時,不同的是,用戶輸入的登錄他的帳戶的密碼不是散列的,而數據庫中的密碼是散列的,所以我們需要一個散列輸入的通行證並使用數據庫中已散列的通行證對其進行驗證的方法。 怎么做 ? 這里
這是我在控制面板中使用的代碼示例:
<?php
// connect to your database
if(isset($_POST['btn-login']))
{
$User_name = $_POST['userlogin'];
$password_user = $_POST['pass'];
$FetchUserData = $conn->prepare("SELECT * FROM users WHERE userlogin = ?");
$FetchUserData->execute(array($User_name));
$FetchedData = $FetchUserData->fetch(PDO::FETCH_ASSOC);
if ($FetchedData)
{
$password = $FetchedData['userpassword']; // Save the fetched password inside variable
$isPasswordCorrect = password_verify($password_user, $password);
if( $password_user == $isPasswordCorrect )
{
$_SESSION['login_user']=$User_name;
header("location: home.php");
}
else
{
echo "Password is wrong":
}
}
else
{
echo "User is not exist ";
}
}
?>
此代碼行是用於將輸入的傳遞與數據庫中的存在傳遞散列的代碼:
$isPasswordCorrect = password_verify($password_user, $password);
小解釋:
password_verify(parameterA,parameterB)
parameterA :您希望對其進行驗證的密碼。
參數B:您希望使用它進行驗證的密碼。(存儲在數據庫中的數據庫)
希望這個回答對你有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.