Zend_Sessionでセッションデータの検証
Zend_Session_Validateなる存在をみなさんご存知ですか?Zend Frameworkのマニュアルには載っていないのですがZend_Session_Validateを使用する事でZend_Session::start()時にセッションデータの検証を行う事が出来るのです。Zend_Sessionのソースを覗いている時に偶然発見してしまいました。たまにはソースも覗いてみるべきですね!
Zend_Session_Validatorの処理としてはZend_Session::registerValidator()で検証すべきデータをセッションに格納し、Zend_Session::start()の時にセッションデータの検証を行います。で、その検証に失敗するとZend_Session_Exceptionが返されますのでtry~catchで受け取り適切な処理を記述する形になります。
最新版Zned Framework(1.7.1)で組み込まれているZend_Session_ValidateはZend_Session_Validator_HttpUserAgentだけですので、とりあえずこれを実装してみます。
try {
Zend_Session::start();
} catch (Zend_Session_Exception $e) {
throw $e;
}
Zend_Session::registerValidator(new Zend_Session_Validator_HttpUserAgent());
これで前回セッションを使用した時とUserAgentの変更があればセッションデータを破棄することができます。携帯サイト等でこのコードを実装すると多少問題が出ることもありそうですが、PCサイトであれば多少なりとも安全になりますのでオススメです。
あと注意点として”Zend_Session::start()の後にZend_Session::registerValidator()を行う事”を挙げておきます。処理を理解すると当然なんですが、何となく逆にしてしまいがちなので。
2008/12/15 追記:ZJ吉田さんがコメントされた内容
早速バグとして報告をあげておきました。
がどうしても気になったのでメールで確認してみたところ、『マニュアルにZend_Session_Validatorの記述が無い』というバグでした。バグはプログラムの方だと思い込んでいたのでマニュアルのバグとは気付きませんでした。ZJ吉田さんのおかげでZend Frameworkに貢献でき大変感謝です!!
2009/02/23 追記
サンプルソースに間違いがありましたので訂正いたしました。
Zend_Session::start()に失敗した場合、Zend_Session::destroy()を行なってsessionを破棄しようとしていましたが、startに失敗しているのに破棄できる訳がなくWarningメッセージ(Trying to destroy uninitialized session)をはいておりました。
こんにちは
Zend Frameworkについて調査中に当件を拝見いたしました。
早速バグとして報告をあげておきました。
ありがとうございます
コメントありがとうございます!
しかし、当エントリーでバグに対する記述は一つもないのですがどのような報告をされたのでしょうか?それともZend_Session_Validatorの挙動としてこれは間違い??