【Laravel】パスワードのバリデーションルール作成方法!オブジェクトやHIBPとは?
この記事からわかること
- Laravelのバリデーションルール
- パスワードの安全なルール
- 「大文字小文字数字記号8文字以上」のようなルールの作成方法
- 「Have I Been Pwned?(HIBP)」とは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelを使ってWebアプリなどを作成中ユーザー登録時のパスワードのバリデーション(ルール)をどうやって作るか悩みました。
今回はパスワードのバリデーション方法とセキュリティ面が高い「大文字小文字数字記号8文字以上」のようなルールの作成方法をまとめていきます。
Laravelでのパスワードのバリデーション
フォーム要素から入力されたパスワードを検証して、セキュリティ的に安心できるレベルのパスワード意外はエラーを起こすようにしていきたいと思います。
Laravelでは簡単に入力値のバリデーションが行えるようにリクエストオブジェクトにvalidateメソッドが用意されています。
$request->validate([
'name' => 'required',
'email' => 'required|email',
'name属性' => 'ルール',
]);
使い方は簡単でinput
要素のname
属性をキー値として値に適応させたいルールを記述した連続配列をvalidate
メソッドの引数に渡すだけです。
おすすめ記事:【まとめ】Laravel-バリデーションルール一覧
検証ルールに違反した場合は自動で直前のURLにリダイレクトしてくれるので希望通りの形式に当てはまった入力値のみを受け入れることができるようになります。
今回のパスワードを検証するルール作成もこの連想配列の値部分に記述していきます。
正規表現を使ったバリデーション
ルールには正規表現を使った検証をすることもできます。正規表現を使うにはルール部分にregex:正規表現パターンの形式
で記述します。
$request->validate([
'password' => 'regex:/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z\-]{8,24}$/',
]);
以下の部分がパスワードの「半角英数字(A~Z,a~z,0~9)最低1つずつ含めた8文字以上24文字以内(記号はハイフンのみ)」という制限を表す正規表現パターンです。
/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z\-]{8,24}$/
正規表現の記述方法は以下の記事を参考にしてください。
Passwordルールオブジェクトを使用する
ルールにPasswordルールオブジェクトを使えばより簡単で初心者でも組み込みやすい方法でバリデーションが可能になります。
使用するにはuse文
でオブジェクトが使えるように読み込みをしておきます。
use Illuminate\Validation\Rules\Password;
使い方はPasswordオブジェクトの静的メソッド(::)やメソッドをルール部分に記述するだけです。
定義されているルールの種類
// 8文字以上
Password::min(8)
// 8文字以上で必須項目
Password::min(8)->required()
// 8文字以上かつ文字が1文字以上
Password::min(8)->letters()
// 8文字以上かつ大文字小文字が1文字以上
Password::min(8)->mixedCase()
// 8文字以上かつ数字が1文字以上
Password::min(8)->numbers()
// 8文字以上かつ記号が1文字以上
Password::min(8)->symbols()
定義済みのルールはメソッドチェーンで複数重ねることも可能です。これを使えば簡単に「半角英数字(A~Z,a~z,0~9)最低1つずつ含めた8文字以上」のルールを定義することができます。
Password::min(8)
->letters()
->mixedCase()
->numbers()
実際のvalidateメソッドの引数への渡し方
$request->validate([
'password' => Password::min(8)->letters()->mixedCase()->numbers(),
]);
複数のルールと一緒の場合の渡し方
$request->validate([
'password' => 'required',Password::min(8)->letters()->mixedCase()->numbers(),
]);
uncompromisedメソッドの意味と使い方
Password::min(8)->uncompromised()
用意されているメソッドの中のuncompromised
メソッドは入力されたパスワードが漏洩していないかを検証してくれるメソッドです。
どうやって漏洩しているかを識別しているかというと外部サイトである「Have I Been Pwned? (HIBP)」という個人情報やパスワード漏洩を確認することができるサービスを利用しています。
Password::min(8)->uncompromised(2)
uncompromised
メソッドの引数には数値を指定でき、漏洩データの中に入力値が出現している回数を何回まで許容するかを指定することができます。
「Have I Been Pwned? (HIBP)」とは?
「Have I Been Pwned? (HIBP)」とは個人情報やパスワード漏洩を確認することができるサイトです。
2022年3月現在登録されているリークアカウント情報は117億件にまで登っています。
普通に使用することも可能でトップページの入力欄に電話番号またはメールアドレスを入力し「pwned?」をクリックするだけです。Good news — no pwnage found!
と出ていればHIBP上に漏洩情報はなく、Oh no — pwned!
と出ると下に漏洩件数と流出元、日時などの情報を取得することができます。
HIBPの安全性が気になりますが作成者はセキュリティに関する賞を受賞しているすごい人のようです。
作成者の自己紹介とサイト運営方針まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。