[Laravel] Pwnedを使って安全なパスワードを利用する
サービスを利用する際にアカウントに設定する「パスワード」はとても重要です。他のサービスと同じパスワードの使い回しや、簡単なパスワードを利用したことによるアカウントの乗っ取り(不正アクセス)の危険があります。
Pwned Passwordsは過去に漏洩した膨大なデータを収集して、利用するパスワードが過去に何らかの形で漏洩したパスワードかどうかを確認できます。
このサービスをLaravelのユーザー登録時のValidationとして使ってみましょう。
パッケージのインストール
valorin/pwned-validatorをインストールします。
shell
$ composer require valorin/pwned-validatorLaravelの5.4未満を利用している場合は下記をconfig/app.phpへ追記します。
php
'providers' => [
Valorin\Pwned\ServiceProvider::class,
],バリデーションの設定
Laravelの認証システムを利用できるようにしておきましょう。
shell
$ php artisan make:auth
App\Http\Controllers\Auth\RegisterControllerのvalidatorメソッドのpasswordにpwnedルールを追加します。
php
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|pwned|confirmed',
]);/registerのURLへアクセスして、パスワード情報に12345678といった簡易なものを入力してみましょう。バリデーションに引っかかります。
※ 作成時点では12345678のパスワードは過去に2,680,521回漏洩しています。
バリデーションの際のメッセージを変更する場合はresources/lang/{言語}/validation.phpに追加しましょう。
また、pwnedのデフォルトの漏洩回数は1回です。
この値を変更する場合は下記のように記述します。
php
// 100回以上漏洩しているパスワードをチェック
'password' => 'required|string|min:6|pwned:100|confirmed',Laravelの5.5で追加されたRuleクラスでの利用も可能です。
php
// 150回以上漏洩しているパスワードをチェック
'password' => ['required', 'string', 'min:6', new \Valorin\Pwned\Pwned(150), 'confirmed'],