多くの場合、開発者は、保存されているパスワードハッシュの処理方法がわからないため、ログインパスワードの検証に苦労します。彼らは、パスワードを 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で直接パスワードを確認したり、パスワードを検索したりすることはできません。代わりに...
- ユーザーIDで検索して、データベースからパスワードハッシュを読み取る必要があります
- その後、 password_verify() 機能。
以下に、 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);
}