3

バックグラウンド:

Web サーバーに定期的に接続し、特定のページの情報が変更されたかどうかを確認するスクリプトを作成しようとしています。bash (スクリプト用)、curl (実際の接続用)、および crontab (スケジューリング用) の組み合わせを使用して、既にこれを機能させています。

サーバーは認証を必要とするため、最初に curl を使用して、ログイン ページで資格情報を使用して POST 要求を実行し、Cookie ファイル (PHPSESSID を含む) を保存しました。チェックしたい実際のWebページのリクエストを行うときに、Cookieファイルを使用できるようになりました。

質問:

  1. サーバーが最初のリクエストで設定した PHPSESSID を実際にクリアするのはいつですか? いつかこれを行う必要があると思います。そうしないと、これまでに開始されたすべてのセッションに関する情報を保存し続けるため、クラッシュします。

  2. ブラウザを閉じるときにPHPSESSIDがクリアされている場合、curlを使用してもそれをシミュレートできる方法はありますか?

4

2 に答える 2

7

「クリアしたとき」よりも少し複雑です

PHP では、セッションには有効期間があります。デフォルトは 24 分です。つまり、Web サイトに接続した後、セッションは有効になるまで有効です。

  • ブラウザーを閉じます (Cookie をドロップしない限り、cURL でシミュレートされません)。

    また

  • 24分経過

ページをロードし、サーバーがsession_start()その有効期限を呼び出すたびに、有効期限がさらに 24 分延長されます (技術的に言えば、呼び出されたページでのスクリプト実行の最後で実際には 24 分延長されますsession_start())。

その Cookie が実際に期限切れに$_SESSIONなると、セッションは無効になり、サーバー側で空になります。ただし、次回サーバーがセッション ガベージ コレクション サイクルを実行して期限切れのセッションをクリアするまで、データはサーバー上に残ります。サーバーで使用されているセッション ハンドラーによっては、実際にデータが削除される場合とされない場合があります。たとえば、銀行は、記録が必要になった場合に備えて、データをアーカイブ サーバーに送信する場合があります。

于 2013-02-20T13:54:11.880 に答える
3

最後のリクエストからセッション タイムアウト時間が経過すると、サーバーはセッションを削除します。これはデフォルトで 1440 秒 (24 分) ですが、php.ini ファイルで変更できます。

ブラウザを閉じてもセッションはサーバー側でフラッシュされませんが、ブラウザがセッションのローカル メモリを削除するため、クライアントはセッション データを失います。ただし、セッションIDを安全な場所に保管しておくと、もちろんタイムアウトフレーム内に留まれば、後で再び使用できます。

これはまさにセッション ハイジャックのしくみです。何らかの方法でセッション ID を取得し、このセッション ID を自分のマシンに設定して、セッションを続行できます。

于 2013-02-20T14:00:29.083 に答える