前回の続きからです。
今回の記事を書くにあたっての経緯などです。
ASVSとは
本記事で紹介している内容(各No)は自分で作った資料のNoをもとにしています。
##V3:セッション管理に関する検証要件
ウェブアプリケーションではほぼ必需品とも呼べる機能です。
だからこそちゃんとした使用方法を分かっておきたい。
###No.1 セッションマネージャーを独自実装していない,または独自実装のセッションマネージャーはあらゆる一般的セッション管理攻撃に耐えられる
セッションを独自実装することは珍しいかと思います。
素直にフレームワークの機構を使いましょう。
###No.2 ユーザがログアウトするとセッションが無効になる
ログアウト処理に以下の処理を加える
// セッション変数を全て解除する
$_SESSION = array();
// セッションを切断するにはセッションクッキーも削除する。
// Note: セッション情報だけでなくセッションを破壊する。
if (isset($_COOKIE[session_name()])) {
// 有効期限に意図的に切れさすことによりクッキーを削除できる。
setcookie(session_name(), '', time()-42000, '/');
}
// 最終的に、セッションを破壊する
session_destroy();
###No.3 一定期間非アクティブ状態が続くとセッションがタイムアウトする
無操作状態でセッションがタイムアウトしないとセッションの乗っ取り・重要情報の盗難に遭う危険性が高まります。
セッションのタイムアウトを設定する方法は以下を参照(PHPの場合)
php.iniで以下を設定
//有効期限の秒数を設定する
session.gc_maxlifetime = 18000//5時間の場合
ただし上記設定はアプリケーション全体の設定となるため、
個別で設定したい場合はプログラム上で以下を行う。
//セッションの保存場所を変更
ini_set( 'session.save_path', 'ディレクトリ(フルパス)' );
//有効期限を設定(5時間)
ini_set( 'session.gc_maxlifetime', 18000);
セッションの保存先を変更する理由は
注意: 異なる値を session.gc_maxlifetime に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。このような場合には、 お互いに session.save_path を使用します。
###No.4 管理者が設定可能な上限時間を超えると,ユーザのアクティビティに関係なくセッションがタイムアウトになる(絶対タイムアウト機能)
レベル2の項目です。
管理画面では特に重要情報を扱うことが多いので、
操作状態関係なくセッションのタイムアウトを行うことが望ましいです。
ユーザビリティは多少は悪くなりますが、リスクを考えれば当然ともいえる対策だと思います。
また、望ましい時間は「30分~1時間」(個人的に)
操作毎に有効期限を延長させないようにしてください。
###No.5 認証を必要とするすべてのページに,見やすくて分かりやすいログアウト機能がある
No.3~4の設定しておけば時間経過でログアウトされますが、
自発的にログアウトできないとユーザー側に不信感を与えてしまいます。
共通的なヘッダーやフッター、サイドメニューに設置するのがベストです。
###No.6 セッションIDがURLやエラーメッセージ,ログを通じて漏洩しない.またセッションクッキーによるURL書換えをサポートしない
セッションIDは画面やログに表示するものではありません。
セッションハイジャックの危険性が高まります。
PHPでデフォルトの設定でセッションIDをクッキーにする設定となっていますが、
以下の設定項目が該当の項目となります。
//URLにセッションIDを付加しない(デフォルト:0)。
session.use_trans_sid = 0
//セッションIDの保存にcookieを使用する(デフォルト:1)。
session.use_cookies = 1
//セッションIDの保存にcookieのみを使用することを指定(デフォルト:1)。
session.use_only_cookies = 1
//HTMLの自動書き換え機能(デフォルト:a=href,area=href,frame=src,input=src,form=)
url_rewriter.tags = ''
HTMLの自動書き換え機能はブラウザの設定によりクッキーが無効となっている場合の代替機能ですが、
HTML上にセッションIDが表示されるため無効としています。
詳しくはoutput_add_rewrite_var()を参照
###No.7 認証と再認証の成功時に必ず新たなセッションとセッションIDが生成される
ログイン時にセッションIDの再生成を行う。
session_regenerate_id(true);
ただ、一つ注意点があります。
「session_regenerate_id」ですが、短い間隔で連続で呼ばれると「セッションが切れる」事象が発生します。
原因は諸説ありますが、セッションIDの再生成中に再度生成処理が加わることにより、
うまくセッション情報が引き渡されないのが原因だとか。
なので、以下の点に気を付けて実装を行うこと。
・JavaScriptなどで連続クリックの対応
・リダイレクトが入る処理はリダイレクト後に再生成を行う
V3の後半は次回とします!
▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽▼▽
ASVS 3.0.1まとめ - Google スプレッドシート
▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△▲△