7

私はこの PHP Web アプリケーションを開発し、現在数か月間実行しています。突然、ユーザーの 1 人が、ログインできたと不満を漏らしましたが、ボタンをクリックするとすぐにセッションが終了しました。異なるブラウザで同じ問題が発生しました。

いくつかのテストの後、おそらく元のセッションの有効期限が切れたため、ユーザーがボタンをクリックするたびに新しいセッション ID が作成されることがわかりました。

なんらかの理由で、ユーザーのコンピューターの時計をちらりと見たところ、驚きました。彼の時計は3ヶ月先でした!それが故障に関係しているかどうかはわかりませんでしたが、時計を修理しました。それでもうまくいきませんでした。すべての Cookie を消去しました。まだ何もありません。それで、ブラウザを再起動しました-そして、再び動作し始めました!

この問題について私が得た最も近い情報は、この質問に対する Shimon Amit の回答でした。これで、時計の「設定ミス」が原因であることがわかりました。問題は... すべての顧客のコンピュータ クロックを制御できるわけではありません。それらの一部は、将来的にコンピューターの時計が設定される可能性があります。

私の質問:これに対する解決策はありますか? 何かトリック?(ある意味では) 私のせいではありませんが、顧客が「不自由」だと感じて、アプリケーションに対する信頼を失う可能性があるため、このようなエラーに直面することは望ましくありません。

4

5 に答える 5

5

セッション Cookie (すべての Cookie と同様) は、クライアント ブラウザーによって期限切れになると制御され、削除されます。有効期限をかなり先に設定したとしても (これはやりたくないかもしれません)、クライアントが行う必要があるのは、時計をさらに進めることだけで、有効期限が切れます。

于 2012-10-31T15:30:18.340 に答える
2

セッション タイムアウトを後の日付に延長できます。おそらく、有効期限のない Cookie を使用できます (セッションはクライアント側の Cookie に関連しています)。

編集: Javascript オプション

これは完全なハックですが、javascript を使用してクライアント マシンの現在の時刻を取得し、それをサーバーに送り返し、セッション cookie のタイムアウトを調整して、その 3 か月後に有効期限が切れるようにすることができます。http://www.w3schools.com/jsref/jsref_gettime.aspを参照してください。

クライアント時間を取得したら、session_cache_expire() を使用してセッションの有効期限をリセットできます。 http://www.php.net/manual/en/function.session-cache-expire.php

編集: 100% サーバー側オプション

私が考えたもう 1 つのオプションは、有効期限のないセッション cookie を設定することですが、cookie がサーバー上で設定された時間を追跡することです。たとえば、MySQL テーブルです。また、最後のアクティビティを追跡する必要があります。ログインしたユーザーがリクエストを行うたびに、セッションの開始時刻と最後のアクティビティを確認できます。現在の時間がこれらのいずれかの許容可能なタイムアウトよりも大きい場合は、セッション サーバー側を破棄し、ログイン ページに戻します。セッションがまだ問題ない場合は、そのユーザーに関連付けられた最後のアクティビティを更新して、次のリクエストで比較できるようにします。クライアント側のコードは必要ありません。

于 2012-10-31T15:30:48.877 に答える
2

ユーザーのマシンがどれほどひどく誤って構成されているかについて責任を負うことはできないという@MarcBのコメントに完全に同意します。この点で本当に違いを生み出したい場合は、PHP を使用して、サーバー上の時間を含む JavaScript の小さなスニペットを出力することをお勧めします。このスニペットは、その時刻をクライアント コンピューターの時刻と比較し、時刻がサーバーと X を超えて異なる場合にアラートを生成します。[たとえば、24 時間程度]

于 2012-10-31T15:39:48.053 に答える
1

何かトリック?

セッション Cookie を使用します。PHP セッションの意味でのセッションではなく、ブラウザ セッションです。セッション Cookieは、ユーザーがブラウザを閉じるまで保存されます。ユーザーがコンピュータに設定した時計の影響を受けません。ブラウザが閉じられるまで持続します。

これは通常、PHP セッション関連の Cookie に適しています。

PHP の場合、セッション Cookie パラメータの有効期間0がセッション開始前に設定されていることを確認する必要があります。それは、ini 設定session.cookie_lifetimeまたは関数の呼び出しのいずれかsession_set_cookie_paramsです。

Cookie パラメータの詳細については、setcookie関数のドキュメントを参照してください。

トリックの 2 番目の部分は、セッション開始のタイムスタンプと最後のアクティビティのタイムスタンプを PHP に配置すること$_SESSIONです。これらはサーバーベースであるため、常に同じベースを持っています。

それらを確認してください。たとえば、セッションが古すぎる場合、最後のアクティビティが古すぎる場合などは、セッションを破棄し、ユーザーに再度ログインを強制します。

トリックの 2 番目の部分を使用して、10 年後に有効期限が切れる Cookie と組み合わせることもできます (ブラウザはそれを好まないかもしれません。3 か月が必要な場合もあります)。

于 2012-10-31T15:39:38.517 に答える
-1

セッション タイムアウトを無効にするか、少なくともかなり先に設定してみてください。これでうまくいくはずです。

于 2012-10-31T15:29:55.880 に答える