2012年12月19日水曜日

(PHP) httpsなページとhttpなページとの間を移動したときセッション情報が消えてしまう・・・suhosinのせいだった

PHPで、ずいぶんと悩んだ、という話。



httpsでアクセスしたページでセッション情報を設定して、その後、httpでアクセスするページへ移動したら、セッション情報が消えてしまいました。
試してみたところ、httpからhttpsへの遷移でも、セッション情報が消えてしまう。



これまで使っていたサーバではそんなことはなくて、ある特定のサーバ1つでだけ、このセッション情報が消えてしまう現象が発生。



なんでだろう?と1日悩んで、やっと原因を発見しました。



suhosinでした。



ネット検索して見つけた、これらの情報が参考になりました。



http://www.yireo.com/blog/798-switch-between-http-and-https-looses-php-session
http://stackoverflow.com/questions/441496/session-lost-when-switching-from-http-to-https-in-php
http://www.hardened-php.net/suhosin/configuration.html



php.iniに
suhosin.session.encrypt=Off
を書き足したところ、無事に、セッション情報が保持されるようになりました。



suhosinが有効になっている場合、セッション関係の情報が暗号化されているらしく、そのcrypt keyに、DocumentRootを使うらしい。ただ、今回のサーバでは、httpとhttpsとでDocumentRootが違っていて、そのせいで、セッション情報がうまく保持されなかったのではないか?ということ。



上記の設定だと、せっかくのセキュリティ対策機能がゆるゆるになりそうなので、今回の場合では
suhosin.session.cryptdocroot=Off
とすることで十分でした。





ちなみに、ほかのサーバではsuhosinを使っていなかったので(インストールはされていたけど有効になっていなかったり[E:coldsweats01])、問題が起きなかった、というだけでした。







20121218



写真は本文と関係ありません。







0 件のコメント:

コメントを投稿