質問: こんにちは、いつもお世話になっております。 SSLと非SSLのページでのセッションのやりとりができずに困っています。 それぞれURLはこんな風になっております。 http://ドメイン/hoge.php https://ドメイン.ssl-xserver.jp/fuga.php やりたいのは非SSLのページで保存していた$_SESSION['hogehoge']をSSLのページでも使用したいということなのですが、SSLのページで$_SESSION['hogehoge']は取得できていませんでした。 そこでsession_idを確認したところ違うものが入っていたので、非SSLからSSLに行くときにpostでsession_idを渡たし、SSLページに非SSLと同じsesstion_idを設定することができました。 しかしまだSSLページで$_SESSION['hogehoge']は取得できませんでした。 このような場合何が原因として考えられますか?また、私がやろうとしていることはそもそも不可能なのでしょうか? 文字ばかりでわかりにくいかもしれませんが、よろしくおねがいします! ご指摘をいただきました。hoge.phpとfuga.phpは同じサーバー内にあります。
回答: 外から与えられたセッション ID を使う、という設計はセッション固定攻撃の隙を作りますし、そもそも筋が悪いのでやめたほうがいいと思います。 商品を渡すときの引換券を、お店が発行したものではなく、来店してきた人が勝手に作ってきたものを有効と認めるような話ですから。 SSL ページと非 SSL ページが同一サーバ内という追加情報を得て、の追記です。 PHP の (組み込みの) セッションは、セッション ID を cookie で受け渡す仕組みですから、ドメインが異なっても同じセッション ID を送る、というのは無理でしょう。 こういうときに PHP でやる定石みたいのはありそうですが、私が今思いつくのは、http と https のどちらからも共有できる情報の領域を確保し、どちらからも使うものはいわゆるセッションではなく、その領域に格納する、という方法かな、と。http, https それぞれのいわゆるセッションの関連付けは、http から https に遷移する際に推測困難なトークンを渡す、とかで行うとして。