mk_5884 Programming

自分で調べたIT関連のことなどを書いています

CSRF対応におけるGCの削除タイミングについて

…と言う作業を職場で受け、何言ってんだかさっぱりわからん!

と思って調べました。

まずCSRF。クロスサイトリクエストフォージュリー。
これはセキュリティホールで、入力フォームの完了画面のURLにパラメタを直接
送ると、
入力画面を経由せずに登録出来たりするやつです。
対応としては、入力画面でセッションを作成してクッキーに入れる&hiddenで引
き渡し、
完了画面でセッションとクッキーとhidden値とを突合させて、一致してたら処理
実行する、と。

で、GCガベージコレクション
これは、溜まったセッションを削除する処理です。
CSRF対応で作られたセッションを完了画面で削除するプログラムは入れるものの、
入力画面でブラウザを閉じたりするとそのまま残っていしまいます。
残ってしまったセッションを削除する処理がGCです。
GCphpで設定してあげれば自動でやってくれます。便利だね!

***

ちなみに・・・セッションファイルの格納場所はsession.save_path で設定できるので
すが、
この配下が多重階層になった場合は、GCは効かないみたいで削除バッチを作成す
る必要があるそうです。

バグなのかな?
セッションが大量に増えるから多重階層にしないとやばい!とかの場合は注意。

***


php.iniで、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