パスワードのハッシュをデータベースに保存しているようですが、他の読者の利益のために、決して パスワードをプレーンテキストでデータベースに保存します。 Monster.com.uk のように !
MD5()
よりも強力なハッシュ関数を使用する必要があります 。理想的には、SHA256を使用する必要があります。このハッシュメソッドは、 hash()
を使用してPHPで使用できます。
機能。
また、ランダムなソルト を適用する必要があります。 パスワードに。ユーザーのアカウントごとに異なるソルト値を保存します。これは、辞書攻撃とレインボーテーブル を打ち負かすのに役立ちます 攻撃。
mysqli の使用方法を学ぶ必要があります 古いmysql拡張機能の代わりに拡張機能。 Mysqliはパラメータ化されたクエリをサポートしているため、一部のSQLインジェクション攻撃に対する脆弱性を減らすことができます。
これがいくつかのサンプルコードです。私はそれをテストしていませんが、動作にかなり近いはずです:
$input_login = $_POST['login'];
$input_password = $_POST['password'];
$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);
while ($stmt->fetch()) {
$input_password_hash = hash('sha256', $input_password . $salt);
if ($input_password_hash == $password_hash) {
return true;
}
// You may want to log failed password attempts here,
// for security auditing or to lock an account with
// too many attempts within a short time.
}
$stmt->close();
// No rows matched $input_login, or else password did not match
return false;
他の何人かの人々は、クエリがlogin = ? AND password = ?
しかし、私はそれをするのが好きではありません。これを行うと、ログインが存在しなかったため、またはユーザーが間違ったパスワードを入力したためにルックアップが失敗したかどうかを知ることができません。
もちろん、ログイン試行の失敗の原因をユーザーに明らかにするべきではありませんが、 疑わしいアクティビティをログに記録できるように、知る必要があるかもしれません。
@Javierは、彼の回答の中で、データベースからパスワード(この場合はパスワードハッシュ)を取得するべきではないと述べています。同意しません。
ハビエルはmd5()
の呼び出しを示しています PHPコードで、結果のハッシュ文字列をデータベースに送信します。ただし、これはパスワードのソルトを簡単にサポートしていません。 PHPでハッシュを実行する前に、このユーザーのソルトを取得するために別のクエリを実行する必要があります。
別の方法は、平文を送信することです。 PHPアプリからデータベースサーバーへのネットワーク経由のパスワード。ネットワークを盗聴する人は誰でもこのパスワードを見ることができます。 SQLクエリがログに記録されている場合、ログにアクセスできる人は誰でもパスワードを見ることができます。やる気のあるハッカーは、ゴミ箱に飛び込んで古いファイルシステムのバックアップメディアを見つけることさえでき、その方法でログファイルを読み取る可能性があります!
リスクが少ないのは、データベースからPHPアプリにパスワードハッシュ文字列をフェッチし、それをユーザーの入力のハッシュ(これもPHPコード内)と比較してから、これらの変数を破棄することです。