2009-06-15 17 views
2

私が問題を抱えているアプリケーションは、一般的なWebアプリケーションです...ユーザーを処理する方法について特別なものはありません。つまり、セッション変数でユーザー情報を処理し、セッションはクッキーによって管理されます。PHPユーザーセッション '迷うようになる'

私のクライアントは、ユーザーがログインしている間に毎回異なるユーザーのページが表示されるという問題が発生しています(これは、ユーザーの名前が各ページの先頭にあるため)。彼らが「ホーム」リンクをクリックすると、すべてのことがもう一度うまくいきます。

私のPHP知識に関する限り、この種のものを混ぜるのには多少の努力が必要でしょうか?私の開発環境で問題を再現することはできません。私が言うように、この種のセッション情報を実際に共有するには多少の努力が必要です...

私の質問起こりうる問題は何でしょうか?私がこれを経験するたびに、「誤動作している」プロキシサーバーが原因だったのですが、リクエストをプロキシしていないことを彼らに伝えています。

他にも何かがありますか?これには他の理由が考えられます(当然のことながら、これには自分のコードに関する問題が含まれる可能性があります)。

おかげで...

答えて

2

は、だから、この状況は、少なくとも、かなり変わり者だったの最終的な結果ということが判明しました。

クライアントがハンドヘルドコンピュータを使用してアプリケーションにアクセスし、バッテリを平らにしていたことがわかりました。この特定のデバイスは、バッテリが最終的に充電されたときに時計を2005年にリセットし、ブラウザからキャッシュから特定のページを読み取るようになったようです。

デバイスのクロックが正しく設定されるとすぐに問題は解決しました。

ありがとうございました:これらのキャッシュタイプの問題をデバッグしようとするのは嫌です。私は、データをキャッシュするこれらのハンドヘルドを試して停止するために、いくつかのヘッダーを追加するべきだと思います。

0

あなたがそれらにセッションIDを持っているリンク(またはパラメータとしてセッションIDを取る他の要求)をユーザーに提示していますか?

+0

目的ではありません。ブラウザがクッキーを受け取っていないのであれば、それはデフォルトになります。要求のセッションIDを持つことで、状況が良くなるか悪いと思いますか? – Narcissus

+0

さらに悪いことに、session_idを使ってユーザー間でリンクを共有し、そのアカウントにログインすることができるためです。それが私が考えていることです。あなたの知識(またはユーザ)がセッションidまたは何かを尋ねる何らかのajaxクエリーを実行しているかもしれません。 –

2

あなたのクライアントがあなたに保証しているにもかかわらず、それは私のプロキシやキャッシングの問題のようです。可能であれば、リクエストが最新であることを確認するために、ユーザーフィールドの近くのページが生成されたときにタイムスタンプのようなものを追加することができます。

このようにページが壊れた場合、ページが以前に生成されて途中で何かによって保存されたかどうかがわかります。あなたのajaxの結果がブラウザによってキャッシュされていて、クライアントが同じWebブラウザ上に複数の人を持っている場合、異様な結果を得るためにプロキシは必要ありません。

この問題を攻撃するもう1つの方法は、クライアントからの要求をログに記録し、何も見逃していないかどうかを確認することです。要求を再生すると、同じ結果が得られますか?

ユーザーAとしてログインしてセッションクッキーを置き忘れた(削除した)場合でも、必要な情報にアクセスできることを確認できますか?もしそうなら、認証が処理される方法に何らかの問題があるかもしれません。

希望すると便利です。

+0

私はページフォーム上のタイムスタンプのアイデアが好きです。ちょうど「情報提供」目的のためです。これは間違いなく私が考えるのを助けたでしょう。 – Narcissus

1

セッションにIPアドレスを格納し、セッション内のアドレスと現在のユーザーのIPが一致しない場合など、セッションの検証を行うことを検討してください。

もちろん、それを破壊するのではなく、IPが一致しない場合にユーザーに新しいセッションを強制することができます。私はこのような何かがうまくいくと思う

session_start(); 

if (isset($_SESSION['ip'])) { 
    if ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) { 
     session_regenerate_id(); 
     session_destroy(); 
     session_start(); 
     $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
    } 
} else { 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
} 
関連する問題