2011-11-01 14 views
19

私のCakePHPアプリケーションに問題があります。これはIEでのみ起こっているようですが、特定のコンピュータでのみ発生します。それは起こっているコンピュータ上で一貫しています。CakePHP Cookie /セッションの問題

問題1: ユーザーがログインしていて、ページhttps://example.com/users/viewにログアウトしています。ユーザーはhttp://example.comにリダイレクトされ、ユーザーが別のhttpsページにアクセスし、ログインしている間はログアウトされているように見えます。ログアウトは何度でもクリックできますが、常にhttpsにログインしてログアウトしますhttp。

問題2:。彼らはhttp://example.comにリダイレクトされ、今で記録されているように見えているhttps://example.com/users/signinの中 ユーザーがログインユーザは、(https://example.com/admin/slidesに行くと、まだそれを知らないが、今、他のページをクリックすると、ログアウトされますまたは現在のページを更新するだけで)再度ログインするように求められます。

何が起こっているのか分かりません。私はこれらの似たような問題の両方に記載された解決策を読んで試しました:Session not saving when moving from ssl to non-sslCookie not renewing/overwriting in IEしかし、私はまだ同じ問題を抱えています。私は返すread()はHTTPページ常に唯一の$ this - >セッション - >を上の両方$_SESSION$this->Session->read()をデバッグするとき

私がこれまでに気づいた唯一の手掛かり、(これは何を意味している場合、私は知らない)があります値。 HTTPSページでは、常に両方とも同じ値を返しますが、他のものは常に$ this-> Session-> read()の値を返します。

たとえば、http://example.comhttps://example.com/usersは$ _SESSIONを認識しません。https://example.com/cartsは常に$ _SESSIONを表示します。私は確信していませんが、セキュリティで保護されたページが見えるはずですが、何かが間違っているとは考えられないかもしれないと思っていますが、コードを調べると、 t。

さらに、$this->Session->destroy()をAppControllerのbeforeFilterに追加すると、HTTPでもすべてのページに$ _SESSIONが表示されます。私は実際に私のアプリケーションで$ _SESSIONを使用していない、私はちょうどこれが間違って何かの手掛かりかもしれないと思った。


UPDATE

私はグスタフ・バートラムのアドバイスをtookedし、ユーザーエージェント文字列を見ました。私は、問題を抱えていなかったコンピュータ上でIEに問題を抱えていたコンピュータでIEとユーザーエージェントの文字列を比較しました。彼らは、問題を抱えていたものを除き、ユーザーエージェント文字列に "google chrome frame"があることを除いて同じでした。そのコンピュータからGoogle Chrome Frameをアンインストールして再起動し、もう一度試してみると問題は解決したようです。

これが真の原因ならば、単純な解決策はユーザーにChromeフレームをアンインストールさせることです。しかし、私は彼らがクロムフレームをインストールして、まだ動作するようにする回避策があるのだろうかと思います。

+0

(私はあなたが通常のキャッシングの容疑者をノックアウトしたと推測します)どのバージョンのIEですか?ページヘッダー(キャッシュ制御など - http://support.microsoft.com/kb/234067を参照)で微妙な影響がありますか? – OpenSorceress

+0

セッションの内容がスクランブルされていますか?セキュリティオプションがあります。 – Dunhamzzz

+0

ページにはフラッシュコンテンツがありますか?セッションセキュリティをHIGHからLOWに変更しようとしましたか? – binoy

答えて

16

してみてください。これにより、httpとhttpsでCookieを保持できるようにPHPとCakePHPの両方の設定が行われます。

+0

私はこれらがCakePHP 2.0のパラメータだと言います。 1.3で少し違いますが、ログインしている間にhttpとhttpsの間を移動することができます。 –

+0

1.3と同じ構文で、1.3で動作し、エラーなしです。 :)これはクロムフレームがインストールされている場合でも問題を解決するようです。ケーキが最初にエージェントをチェックしていた理由を知っていますか?申し訳ありませんが、私はすでに賞金を払っていました。 –

+0

セキュリティ対策です。私は、デフォルトでは、セキュアな接続でのみ有効なクッキーを安全なものにしたいと考えています。あなたがhttpに行くと、もう安全ではありません。ここでは、基本的にはそれをオフにしています。恩恵の心配はありません。あなたはそれが働いてうれしい! –

6

あなたの提案は、パケットを直接見て、クッキーに何が起こっているかを見ることです。

クライアントマシンにWiresharkをインストールし、リモートWebサーバーに接続します。 (Wiresharkはlocalhostのトラフィックを無視します)

私の疑問は、あなたのクッキーがマングルされているということです(私はかつてPHPによっていくつかのクッキーを手に入れました!)またはスタックされている(これはIEの欠陥です)。いずれにせよ、あなたは何がうまくいかないのかについてより多くの情報を得るでしょう。

最後の手段として、コード内のユーザーエージェント文字列をチェックして、違反/サポートされていないバージョンのIEを確認し、アップグレードを促します。

+0

私はあなたの提案以来、恩恵を授与しています。ユーザーエージェントを見ることが、私にクロムフレームの問題を発見させてくれました。私はまだそれがインストールされたクロムフレームで動作するようになる方法を理解したいと思います。 –

+0

[Google ChromeでChromeレンダリングエンジンを使用するように強制する]タグを挿入することができます(http://www.zdnet.com/blog/google/google-chrome-frame-hijacks-ie-and-is-現在は安定している/ 2485)。それがあなたに喜びを与えないなら、それはバグレポートの時間かもしれません。 –

-1

php?>タグを閉じた後にスペースや改行がないことを確認しましたか?おそらくそれはあなたがチェックした最初のものでしたが、経験から私はひどく閉じたphpタグがPHPセッション処理に散発的な問題を引き起こすことを知っています。

0

これをAppControllerのbeforeFilterに入れて、それが何かをしているかどうか確認してください。私は、あなたが必要とするようにクッキーの設定が構成されていないと感じています。詳細についてはSee hereをご覧ください。これらのパラメータもGoogle Chromeのフレームを通じて持続するクッキーを強制すべきである

Configure::write('Session.checkAgent', false); 
Configure::write('Session.ini',array('session.cookie_secure' => false, 'session.referer_check' => false)); 

:あなたのcore.phpのファイルに次を追加

function beforeFilter() { 
    $this->Cookie->domain = '.example.com'; 
    $this->Cookie->secure = false; 
}