अक्सर डेवलपर्स एक लॉगिन पासवर्ड के सत्यापन के साथ संघर्ष करते हैं, क्योंकि वे सुनिश्चित नहीं हैं कि संग्रहीत पासवर्ड हैश को कैसे संभालना है। वे जानते हैं कि पासवर्ड को password_hash( )
, और उन्हें varchar(255)
. में स्टोर करें फ़ील्ड:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
लॉग इन फॉर्म में, हम पासवर्ड को सीधे SQL से सत्यापित नहीं कर सकते हैं, न ही हम इसकी खोज कर सकते हैं, क्योंकि संग्रहीत हैश नमकीन हैं। इसके बजाय हम...
- डेटाबेस से पासवर्ड-हैश पढ़ना है, उपयोगकर्ता आईडी द्वारा खोजना है
- और बाद में पासवर्ड_सत्यापन () समारोह।
नीचे आपको mysqli . के साथ पासवर्ड सत्यापन कैसे करना है, यह दिखाते हुए कुछ उदाहरण कोड मिल सकते हैं कनेक्शन। कोड को पठनीय बनाने के लिए कोई त्रुटि जाँच नहीं है:
/**
* mysqli example for a login with a stored password-hash
*/
$mysqli = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
$mysqli->set_charset('utf8');
// Find the stored password hash in the db, searching by username
$sql = 'SELECT password FROM users WHERE username = ?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $_POST['username']); // it is safe to pass the user input unescaped
$stmt->execute();
// If this user exists, fetch the password-hash and check it
$isPasswordCorrect = false;
$stmt->bind_result($hashFromDb);
if ($stmt->fetch() === true)
{
// Check whether the entered password matches the stored hash.
// The salt and the cost factor will be extracted from $hashFromDb.
$isPasswordCorrect = password_verify($_POST['password'], $hashFromDb);
}
ध्यान दें कि उदाहरण SQL-इंजेक्शन से बचने के लिए तैयार किए गए कथनों का उपयोग करता है, भागना आवश्यक नहीं है इस मामले में। pdo . से पढ़ने के लिए एक समान उदाहरण कनेक्शन इस तरह दिख सकता है:
/**
* pdo example for a login with a stored password-hash
*/
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
$pdo = new PDO($dsn, $dbUser, $dbPassword);
// Find the stored password hash in the db, searching by username
$sql = 'SELECT password FROM users WHERE username = ?';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $_POST['username'], PDO::PARAM_STR); // it is safe to pass the user input unescaped
$stmt->execute();
// If this user exists, fetch the password hash and check it
$isPasswordCorrect = false;
if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false)
{
$hashFromDb = $row['password'];
// Check whether the entered password matches the stored hash.
// The salt and the cost factor will be extracted from $hashFromDb.
$isPasswordCorrect = password_verify($_POST['password'], $hashFromDb);
}