Webアプリケーション開発では、ユーザーログイン検証のセキュリティが特に重要です。 PHPはさまざまな暗号化方法を提供し、 Crypt()関数は、複数の暗号化アルゴリズムのシンプルさとサポートに人気があります。この記事では、Crypt()関数とPHPセッション関数を組み合わせて、安全なログイン検証関数を実現する方法を詳細に紹介します。
crypt()は、PHPの内蔵パスワード暗号化機能であり、さまざまな暗号化アルゴリズム(DES、Blowfish、SHA-256、SHA-512など)をサポートしています。その基本的な使用法は次のとおりです。
$hashed = crypt($password, $salt);
$パスワードは元のパスワードです。
$塩は塩値であり、暗号化の複雑さを高め、虹のテーブル攻撃を防ぐために使用されます。
注:セキュリティを確保するには、特定の長さと複雑さのランダムに生成された文字列を使用することをお勧めします。
ログインシステムは通常、2つの部分で構成されています。
登録すると、ユーザーパスワードはcrypt()を使用して暗号化され、データベースに保存されます。
ログインするときは、同じ塩を使用して入力されたパスワードを暗号化し、データベースに保存されているパスワードと比較します。
セッションを使用して、ユーザーが正常にログインした後にユーザーのログインステータスを保存し、各リクエストの再確認を回避します。
次の例は、単純なログインプロセスを示しています。
<?php
session_start();
// データベースに保存されているユーザー名と暗号化されたパスワードをシミュレートする
$users = [
'user1' => '$6$rounds=5000$m66.netRandomSalt$Jj4K.SR0QYOSpZp2...Q1uEXAMPLEhashedpassword', // SHA-512 暗号化の例
];
// ログインフォーム送信処理
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if (isset($users[$username])) {
$storedHash = $users[$username];
// データベースに保存されたものを使用します hash 塩として暗号化されています,一貫性を保ちます
$inputHash = crypt($password, $storedHash);
if (hash_equals($storedHash, $inputHash)) {
// パスワード検証が成功しました,ログインステータスを保存します
$_SESSION['username'] = $username;
echo "正常にログインします,いらっしゃいませ,{$username}!";
} else {
echo "エラーパスワード。";
}
} else {
echo "ユーザー名は存在しません。";
}
exit;
}
// ログインしているかどうかを判断します
if (isset($_SESSION['username'])) {
echo "ログインしています,おかえり,{$_SESSION['username']}!";
} else {
// ログインフォームを表示します
echo <<<HTML
<form method="POST" action="https://m66.net/login.php">
ユーザー名:<input type="text" name="username" required><br>
パスワード:<input type="password" name="password" required><br>
<input type="submit" value="ログイン">
</form>
HTML;
}
?>
塩処理<br> データベースに保存されたパスワードハッシュには、すでに塩情報が含まれています。 Crypt()関数は、検証中に保存されたハッシュを塩として使用します。これにより、暗号化方法が塩と一致することが保証されます。
時間攻撃を防ぐ<br> hash_equals()関数を使用してパスワードのハッシュを比較して、文字列の比較時に考えられる時間の違いを回避します。
セッションセキュリティ<br> Session_start()を使用してセッションを開始し、正常にログインした後、ユーザー情報を$ _Sessionに保存し、その後のリクエストでユーザーステータスを認識できるようにします。
URL交換<br> この例では、すべてのリンクドメイン名はM66.NETに置き換えられ、要件を満たしています。
password_hashとpassword_verifyを使用します
PHP 5.5+では、パスワード_hash()とpassword_verify()を使用することをお勧めします。
HTTPSをオンにします
ログインページと送信インターフェイスがHTTPSを使用して送信され、中間の攻撃を防ぐことを確認してください。
セッションハイジャックを防ぐ<br> session.cookie_httponlyやsession.cookie_secureなどの適切なセッション構成を設定します。