5.1 認証
認証
認証の種類
・ HTTP認証 ： Basic認証、NTLM認証、Digest認証
・ フォーム認証・ クライアント認証
不正ログインの原因となるセキュリティバグ
・ SQLインジェクション
・ セッションIDの固定化
・ クッキーのセキュア属性不備
・ オープンリダイレクト脆弱性
・ HTTPヘッダ・インジェクション
パスワードに関するセキュリティ要件● 文字種 ： 英数字（大文字、小文字を区別）
桁数： ８桁まで入力可能制約が厳しすぎる● パスフレーズ（文の形をした長いパスワード）が有効● パスワードポリシーのチェック

文字種 ： ＵＳ-ＡＳＣＩＩ文字すべて（０Ｘ２０～０Ｘ７E）
桁数： １２８桁以下

andesudetaberukusamochiisveryhappy(アンデスで食べる草餅 is very happy ）基本的なアカウントロック① パスワード間違いの回数、３回では少なすぎで、１０回程度が良い② アカウントロックした場合にはメールなどで、対象利用者と管理者に通知する③ アカウントロックから３０分経過した場合、自動的に再有効化する
管理者が何らかの方法で本人確認した後に再有効化するパスワード攻撃
・ 辞書攻撃・ ジョーアカウント探索
・ リバースブルートフォース攻撃・ パスワードスプレー攻撃・ パスワードリスト攻撃
パスワード攻撃に対する対策※ adobe社サイトからの漏洩パスワードの統計では、123456というパスワードは集計対象の５％だった
IDとPWが同じID、PWとも固定しないで、少数のパスワード候補をIDを変えながら試していく攻撃
成功率は高い場合には、数％から１０％を超える場合があり、高い成功率※ adobe社サイトからの漏洩パスワードの統計では、123456というパスワードは集計対象の５％だった① ２段階認証の実装

利用者の負荷が高い

認証タイミング調整② 積極的なパスワードチェック③ ログイン失敗率の監視

実装が簡単だが、十分ではない監視人員が必要で、コストが高い①初回ログイン時のみ２段階認証を行い、その後は一定期間一段階の認証とする②利用者の通常の使い方から外れたログイン（地域、時間帯、ブラウザなど） ： リスクベース認証③決済やパスワード変更などの重要な処理の時メッセージダイジェストによるパスワード保護のために必要なハッシュ関数の要件
・現像計算困難性
・第２現像計算困難性
・衝突困難性

一方向性弱衝突耐性
強衝突耐性※ GPUを使った総当たり攻撃の結果、８桁で英数字・数字・記号を使った総当たり攻撃は、MD5で約１４分、SHA-1で約３９分で完了する

パスワードのメッセージダイジェストに対する攻撃● オフラインブルートフォース攻撃

GPUを使った総当たり攻撃の結果、８桁で英数字・数字・記号を使った総当たり攻撃は、MD5で約１４分、SHA-1で約３９分で完了する。

● レインボーテーブル

RainbowCrack ProjectのWebサイトには、８文字までのUS-ASCII文字全部に対応したMD5用テーブルや１０文字までの英小文字と数字に対応したSHA-1用テーブルが売られています。
単純なハッシュ関数による保存パスワードは市販レインボーテーブルで解読されます。

● ユーザDB内にパスワード辞書を作られる

Webアプリに多数のユーザ、パスワードを登録し、同じハッシュ値を持つデータから元パスワードを突き止める。

パスワードのメッセージダイジェスト攻撃に対する対策
・ ソルト
・ ストレッチング
・ 処理速度の遅いハッシュ関数を使用する
自動ログインの安全な実装
・ セッションの寿命を延ばす・ トークンを利用する（セッション寿命を延ばせない場合）
・ 認証チケットを利用する（Kerberos認証、ASP.NETのフォーム認証、複数サーバまたがった認証の場合には、SSO製品、OpenID Connectなどのオープンな認証基盤の利用）
ログアウト機能の要件
・ ログアウト処理は副作用があるので、POSTメソッドでリクエストする・ ログアウト処理ではセッションを破棄する
・ 必要な場合、CSRF対策を実施する

5.2 アカウント管理
認証
メールアカウントの受信確認（実際にメールを送信して確認）① メールにトークンつきURLを添付して、そのURLから処理を継続する② メールアドレスを入力後、トークン（確認番号）入力画面に遷移する（トークンは指定したメールアドレスにメール送信する）

メール送信→メールのURLをクリック→URLのページから登録を再開 （利用者にメールURLを閲覧させるのは好ましくない習慣）
メールアドレス入力→トークン番号入力→その他の登録内容入力（推奨）（トークン番号・メール送信）

ユーザIDの重複
・ パスワードが違えば同じIDで登録できるサイト
・ ユーザIDに一意制約をつけられないサイト
ユーザIDの自動登録への対処
・ CAPTCHA reCAPTCHA
パスワード変更● パスワード変更時に、現在のパスワードを入力し確認する● パスワード変更時にはメールで通知する● パスワード変更機能に生じやすい脆弱性①セッションハイジャック対策②CSRF脆弱性対策①SQLインジェクション脆弱性 ②CSRF脆弱性

メールアドレス変更
メールアドレス変更時には、新旧両方のメールアドレスに通知します。
・ 旧アドレスに送るのは、不正変更では正規ユーザのアドレスは元アドレスになるから・ 旧アドレスは既に受信できない場合があるので、受信確認までは行わない
パスワードリセット

パスワードリマインダ←現在のパスワードを教える

パスワードリセット←リセットしたものを教えるか、パスワード変更を利用者にさせる● 管理者向けパスワードリセット機能①問合せを受け、利用者の本人確認を行う②パスワード変更だけができる仮パスワードをメールで発行● 利用者向けパスワードリセット機能①現在のパスワードをメールで通知
盗聴リスク②パスワード変更画面のURLをメールで通知
フィッシング被害に会いやすい習慣③ メールアドレス入力→スマホアプリ数値の２段階認証→登録メールアドレスに仮パスワードを送信
パスワード変更通知で不正利用された場合にも気が付く。
スマホアプリ数値の２段階認証によって、不正にパスワード無効されることを防ぐ。
仮パスワードと本番パスワードは別管理で、仮パスワード発行後も元パスワードでログインできるようにすべき。
④ メールアドレス入力→トークン確認番号を登録メールアドレスに送信→トークン確認番号を画面から入力→スマホアプリ数値の２段階認証→新しいパスワードを画面から入力
トークンのブルートフォース攻撃のために、回数制限を設け、アカウントロックするか、パスワードリセット機能を一定期間ロックする旨、メール通知します53 認可認可
認可不備
情報リソースのＵＲＬを知っていると認証なしで情報を閲覧できる。
情報リソースのＩＤを変更すると権限外の情報が参照できる。
メニューの表示・非表示だけで制御している。
hiddenパラメータ、クッキーに権限情報を保持している。
⇒
ＵＲＬやhiddenパラメータ、クッキーを書き換えると権限を不正利用できてしまう。
認可不備の対策
権限情報をセッション変数に保持することで、書き換えできないようにし、処理や表示の直前に権限の確認を行う。

51-001:パスワードのメッセージダイジェスト

【サーバ： 51/51-001.php 】

【ブラウザ→サーバ： リクエスト 51/51-001.php → レスポンス 】

51-002:自動ログイン【サーバ： 51/51-002.php 】セッションの有効期間を１週間にクッキーのExpireｓ属性

本番ソースではログイン中ユーザIDセットタイムアウト時間タイムアウト期間【サーバ： 51/51-003.php 】

IDがセットされていない場合タイムアウトしている場合セッション破棄

タイムアウト時刻を更新

【ブラウザ→サーバ： リクエスト 51/51-002.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 51/51-003.php → レスポンス 】

51-010:ログアウト確認のためのログイン画面

【サーバ： 51/51-010.php 】【サーバ： 51/51-011.php 】【サーバ： 51/51-012.php 】

【ブラウザ→サーバ： リクエスト 51/51-010.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 51/51-011.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 51/51-012.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 51/51-011.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 51/51-010.php → レスポンス 】