CSRF対応におけるGCの削除タイミングについて
…と言う作業を職場で受け、何言ってんだかさっぱりわからん!
と思って調べました。
まずCSRF。クロスサイトリクエストフォージュリー。
これはセキュリティホールで、入力フォームの完了画面のURLにパラメタを直接
送ると、
入力画面を経由せずに登録出来たりするやつです。
対応としては、入力画面でセッションを作成してクッキーに入れる&hiddenで引
き渡し、
完了画面でセッションとクッキーとhidden値とを突合させて、一致してたら処理
実行する、と。
で、GC。ガベージコレクション。
これは、溜まったセッションを削除する処理です。
CSRF対応で作られたセッションを完了画面で削除するプログラムは入れるものの、
入力画面でブラウザを閉じたりするとそのまま残っていしまいます。
残ってしまったセッションを削除する処理がGCです。
GCはphpで設定してあげれば自動でやってくれます。便利だね!
***
ちなみに・・・セッションファイルの格納場所はsession.save_path で設定できるので
すが、
この配下が多重階層になった場合は、GCは効かないみたいで削除バッチを作成す
る必要があるそうです。
バグなのかな?
セッションが大量に増えるから多重階層にしないとやばい!とかの場合は注意。
***
session.gc_maxlifetime 2440
session.gc_probability 1
session.gc_divisor 100
これは、2440秒以上たったセッションは、session_start()されるタイミングで1
/100の確率で削除される。
を意味します。
例えば
Aさんが入力フォームに入る
↓
session_start() 発行
↓
Aさん入力画面で2440秒放置
↓
Bさんが入力フォームに入る
↓
session_start() 発行
↓
1/100の確率でAさんのgcは削除される
↓
削除された場合、AさんはCSRFにひっかかり、完了画面にはいけない
みたいな感じです。
***
ちなみに・・・GCの設定値はphp.iniじゃなくてphpファイルに直接書けるので、
「このページは2440秒だけど、このページは43200秒にしたい!」とかも対応で
きます。
***
参考にしたサイト
http://d.hatena.ne.jp/Leila/20080618/1213757481
http://monolog.spanstyle.com/2005/07/session.html
http://php.net/manual/ja/session.configuration.php