PHPでユーザーのパスワードが正しいことを確認する推奨された最も安全な方法の1つは、Password_verify()関数を使用することです。この関数はPHP 5.5で導入され、 password_hash()によって暗号化されたパスワードを処理するように設計されています。 Password_verify()は、 Bcryptやその他のより強力なハッシュアルゴリズムをサポートするため、初期の平文比較またはMD5/SHA1ハッシュを使用するよりも安全です。
Password_verify()である典型的なシナリオは、ユーザーが入力したパスワードを、ログイン時にデータベースに保存されたパスワードハッシュと比較します。基本的な例は次のとおりです。
<code> <?php //ユーザーが入力したパスワード$ inputpassword = $ _post ['password']; //データベースから取得したハッシュパスワード(たとえば、登録時にpassword_hash()によって生成されます)
$ storedhash = '$ 2y $ 10 $ $ nouis5kj7natutfkby1veuevs1zrwgfzktfz7vf6hg8nqz5u2yfhy';
if(password_verify($ inputpassword、$ storedhash)){
エコー「パスワードは正しい、ログインを許可する」;
} それ以外 {
エコー「パスワードエラー」;
}
?>
</code>
実際のアプリケーションでは、パスワードハッシュは通常、データベースに保存されます。確認中、データベースからユーザーの対応するハッシュを読み取り、ユーザーのパスワードと比較する必要があります。
<code> <?php //ユーザー名とパスワードがpost $ $ username = $ _post ['username']; $ password = $ _post ['password']; //データベース接続(例のPDOを使用)
$ pdo = new PDO( 'mysql:host = localhost; dbname = myApp'、 'dbuser'、 'dbpass');
//ユーザーパスワードハッシュをクエリします
$ stmt = $ pdo-> prepare( "username =??");
$ stmt-> execute([$ username]);
$ hash = $ stmt-> fetchcolumn();
if($ hash && password_verify($ password、$ hash)){
エコー「ログインに正常に」。
} それ以外 {
エコー「ユーザー名またはパスワードのエラー」;
}
?>
</code>
password_verify()を使用する場合、古いハッシュアルゴリズムが推奨されなくなった場合(たとえば、パラメーターが期限切れになる)、 password_needs_rehash()でパスワードハッシュを自動的にアップグレードできます。
<code> <?php $ options = ['cost' => 12]; if(password_verify($ password、$ hash)){if(password_needs_rehash($ hash、password_default、$ options)){$ newhash = password_hash($ password、password_default、$ options); //データベースでユーザーのハッシュを更新します$ stmt = $ pdo-> prepare( "ユーザーを更新するset password_hash =?where username =??"); $ stmt-> execute([$ newhash、$ username]); } echo "ログインに成功し、パスワードハッシュが更新されました"。 } else {echo "password error"; }?> </code>プロジェクトの保守性については、パスワード検証ロジックを別のメソッドまたはクラスにカプセル化して、パスワード処理ポリシーを中央に管理することをお勧めします。例えば:
<Code> <?PHP Class Auth {public static Function verifypassword($ inputPassword、$ storedhash):bool {return password_verify($ inputpassword、$ storedhash); }}?> </code>通話方法:
<code> <?php if(auth :: verifypassword($ _ post ['password']、$ storedhash)){echo "検証済み"; } else {echo "検証に失敗した"; }?> </code>ユーザーが手動で入力したパスワードを手動で入力してから、データベースと比較してください。塩値とハッシュアルゴリズムは、Password_verify()によって内部的に処理されます。
MD5()やSHA1()などの古いハッシュ関数を使用しないでください。これは、最新の攻撃方法に直面しても安全ではありません。
ハッシュ文字列は不可逆的であり、元のパスワードを復元するために使用することはできません。
password_hash()を使用して生成されたハッシュは毎回異なりますが、 password_verify()で検証できます。
Password_verify()を使用することは、安全なユーザー認証を実装する上で重要なリンクの1つです。最新のハッシュアルゴリズムを使用するだけでなく、開発者の検証ロジックを簡素化し、パスワードハッシュアップグレードを容易にします。実際のプロジェクトでは、データベース操作、カプセル化ロジック、自動再構成メカニズムと組み合わせて、強固なパスワード検証システムを構築することをお勧めします。
password_verify()とパスワード処理に関するベストプラクティスについては、公式ドキュメントを参照するか、 https://gitbox.net/docs/php-password-securityにアクセスしてください。