・ログイン機能のセキュリティの実装ポイント
・コードに対するセキュリティチェック
・ログインチェック + 権限チェック + Referer(リファラー)チェック
・保存には暗号化・送信にはHTTPS・パスワードはハッシュ化
・XSS (Cross-Site Scripting) 対策済み
・CSRF (Cross-Site Request Forgery) 対策済み
・SQLインジェクション対策済み
ログイン機能のセキュリティの実装ポイント | |
① パスワードは「そのまま」保存しません | パスワードはハッシュ化という技術で暗号のように変換して保存しています。 万が一データベースが盗まれても、元のパスワードはわかりません。 |
② パスワードの照合も安全に行っています | 入力されたパスワードと保存されたデータは、安全な比較関数でチェックされます(password_verify という技術)。 「似ているだけ」のパスワードでは絶対に通りません。 |
③ ログイン成功時には「セッション」という一時的な鍵を発行 | なりすまし防止のため、ログイン成功時には「セッション」という一時的な鍵を発行しています。 一度ログインすると、そのユーザーの識別情報をセキュリティ上の安全な方法で一時保存します(サーバーだけが知っている仕組みです)。 |
④ ログイン後は、管理ページを勝手に見られることはない | ログイン後は、役割(管理者・一般ユーザー)に応じて、見ることができる画面を分けています。 管理ページを勝手に見られることはありません。 |
⑤ 攻撃者の不正入力対策をしています | 悪意のある攻撃者が不正な入力をしても、システムに影響が出ないように対策しています。 ログイン失敗時も「どちらが間違っているか(IDかパスワードか)」を伝えず、攻撃者のヒントにならないようにしています。 |
⑥ エラーメッセージも慎重に扱っています | 万が一ログインに失敗しても「どちらが間違っているか(IDかパスワードか)」を伝えず、攻撃者のヒントにならないようにしています。 |
コードに対するセキュリティチェック | |
① セッション固定攻撃対策(ログイン時にIDを再生成) | セッション保存の前にセッションIDを再生成(セッションハイジャック防止)。 攻撃者がセッションIDを盗んだ場合のなりすましを防止します。 |
② パスワード照合のタイミングを限定する | 不要なタイミングでのパスワード検証を避け、最小限で行います。 |
③ エラーメッセージを統一して情報漏れを防ぐ | ユーザー名が存在していなくても、パスワードが違っていても「ユーザー名またはパスワードが違います。」と同じメッセージを返しています。 |
④ ログイン試行回数制限(ブルートフォース対策) | IPアドレスまたはセッション単位でログイン試行回数を制限。 3回失敗したら、3分間ロックする仕組みを採用しています。 |
⑤ XSS(クロスサイトスクリプティング)対策 |
・出力時にHTMLエスケープ処理を実施(例: htmlspecialchars() )・ユーザー入力をそのままHTMLに埋め込まない ・JavaScript内や属性値内でも適切なエスケープを実施 ・HTTPヘッダで Content-Security-Policy (CSP)ヘッダを設定
|
⑥ CSRF(クロスサイトリクエストフォージェリ)対策 |
・フォームにCSRFトークン(ワンタイムトークン)を埋め込み、サーバー側で検証 ・POSTリクエストに対してだけ処理を行う(GETは情報取得専用に限定) ・セッション内に発行済みトークンを保存して照合 ・重要操作は二段階確認(例:再認証・確認ダイアログ)を導入 |
⑦ SQLインジェクション対策 |
・プリペアドステートメント(PDO::prepare() など)を使用・直接SQLに文字列結合しない ・DBエラーメッセージを外部に表示しない |
⑧ ディレクトリトラバーサル対策 |
・ファイルパスにユーザー入力を使用しない、使用する場合は検証・制限 ・ファイル名をID等に置き換えて管理 ・PHP関数 basename() やホワイトリストを使用
|
⑭ HTTPヘッダーのセキュリティ設定 |
・X-Content-Type-Options: nosniff ・ X-Frame-Options: DENY or SAMEORIGIN ・ Strict-Transport-Security (HSTS) の設定
|
ログインチェック + 権限チェック + Referer(リファラー)チェック | |
① ログインチェック | IDとパスワードで本人確認をします。 |
② 権限チェック | 管理者・モデレーター・一般ユーザーの権限をチェックし、未ログイン・不正ユーザーをブロックします。 これにより、不正アクセスは拒否されます。 |
③ Referer(リファラー)チェック | 管理画面にアクセスする「経路」を制限することで補強防御が可能です。 例:adminログイン済みでも、外部リンクや他ドメイン・直リンクではアクセスできない。 つまり「正しいページの流れでしか入れない」ようにします。 |
保存には暗号化・送信にはHTTPS・パスワードはハッシュ化 | |
① Web通信(画面⇔サーバ) | HTTPS(TLS/SSL)により通信中の盗聴や改ざんを防ぎます。 |
② 個人情報の保存 | 暗号化(例:OpenSSL)で保存。後で中身を読み出す必要がある情報は復号可能な形式で暗号化します。 |
③ パスワードなど | ハッシュ化(例:password_hash)により、比較のみ可能な安全な形式で保存します。 復元不可能な一方向性の暗号化です。 |