2009-03-16 2 views
1

私のサイトでは簡単なログインフォームがあります。ページはHTTP経由で提供されますが、フォームのPOST URLはHTTPSです。httpsフォームへのPOSTは常に動作しているとは限りません

通常の方法は、ユーザーがユーザー名/パスワードを入力し、フォームが(同じサイトの完全修飾HTTPS URLに)送信された後、POST処理がユーザーのホームページに303リダイレクトされます。しかし時々これは起こらない。

サイクル(これは100%の再現性であるが)これです:

  1. ログインログインフォーム、詳細を記入して、ログインスクリプトが呼び出されるサーバで
  2. を提出し、データを検証し、その後、すべてがうまくいけば、ユーザーのホームページに303リダイレクトされます。
  3. ログアウトをクリックしてからログインをクリックすると、ログインフォームに戻されます
  4. 私の詳細をもう一度入力して、submitを押してください。
  5. 今回はログインロジックが実行されません(手順2でログインしたデバッグコードは呼び出されません)。しかし、まだユーザーのホームページにリダイレクトされています。しかし、私は正常にログインしていないので、私はフロントページに追い出される...

なぜ、POSTは常にログインフォームを呼び出さないのですか?私は303がキャッシュされているとは思っていません(それは仕様通りではありません)...

サーバのHTTPSログを見ると、login.phpoが初めて呼び出されていますが二ません....

編集:

OK、我々は問題を解決してきました。興味のある方:

このサイトは、ロードバランサの背後にある2つのWebサーバ上で実行されます。ユーザーセッションは「固定的」です。つまり、ユーザーが1つのWebサーバーをブラウズすると、LBはそのサーバーに「接続」された状態になります。これはクッキーを介して行われます。しかし、いったんHTTPSに切り替えると、ブラウザとWebサーバーの間で接続が暗号化されるため、LBはCookieを読み取ることができません。だから、それはサーバ間で交代していた。 WWeにはWebサーバー間でログイン認証を伝播するコードがありますが、これは十分速くは起こっていませんでした。だから何が起こっていたことだった:サーバAへ

  1. ユーザーのブラウザ、「Aの上に私を保つ」と言ってクッキーを取得し、自分のログイン資格情報とヒットを埋めるにはHTTPSトラフィックを解読できないこと、
  2. LBを提出します(したがってクッキー)を送信し、時間の50%をBに送信します。B
  3. Bはログインを検証し、セッションで認証されるようにユーザーを設定します。
  4. ホームページは非httpsであれば、LBはクッキーを読み取り、それをAに送ります。これはBから十分に速く伝播していないので、認証の何も知らない...

解決策は、LBがHTTPSトラフィックを復号化できるようにすることで、HTTP/HTTPSの遷移に関係なく、ユーザーが実際に1つのWebサーバーに留まることを保証しました。

+0

コードを投稿することができれば確かに役に立ちます。 – Seb

答えて

0

キャッシングの問題であるように思えます。ページにヘッダーを設定して、明示的に何もキャッシュしていないようにして、その動作を確認します。

第2の推測では、セッション/クッキーの問題があることが考えられます(これはどういう仕組みか考えていないことは間違いありません)。ログアウトページで、セッション(およびクライアント上の永続的でないクッキー)を明示的に破棄しますか?

最後に、サーバー側のキャッシュを使用していますか?私はPHPのopcodeキャッシュがこの動作をするとは思わないが、私はmemcacheで見知らぬものを見たことがある(そして、フレームワークを使用している場合は、各フレームワークのキャッシュが少し異なっている)。

1

どのようにログアウトしますかキャッシュをクリアして残っているセッション変数がそれを投げ捨てているかどうか確認しましたか? Firefoxので

:ツール - >プライバシー情報の消去 - >チェックキャッシュ、クッキー、および認証されたセッション

1

私は(仕様によると、それがはずの)303がキャッシュされていると思ういけません。..

いいえ、303はブラウザではキャッシュされませんが、他のレベルではキャッシュされている可能性があります。また、ログイン状態を保存するためにCookieを使用していると仮定すると、サイトのさまざまな部分に複数の影付きのコピーではなく、同じCookieが設定され、削除されるように、 'path'と 'domain' 。

診断にもっとコードが必要です。

ページはHTTP経由で提供されますが、フォームのPOST URLはHTTPSです。

しないでください。ユーザーは手動でソースを調べることなく(そして参照されているすべてのスクリプトをチェックすることなく) 'アクション' URLがHTTPSになることを知らせる方法がなく、これは起こりません。

したがって、man-in-the-middle攻撃者は、ログインフォームを使用して最初のHTTPページを変更するだけで、認証の詳細を取得できます。これにより、POST受信機の保護が完全に無効になります。

ログインプロセスを含むすべてのページ(ログインフォームを含むページ)は、HTTPS上にある必要があります。

関連する問題