web-dev-qa-db-ja.com

trueパラメータなしのsession_regenerate_id()はセキュリティを向上させますか?ログインの直前に使用する必要がありますか?

セッション固定攻撃の脆弱性を減らしたいので、ログイン前にsession_regenerate_id()を使用しました。どういうわけか私は今暗闇にあり、以下の質問に対する正しい答えがわかりません:

  • FunctionパラメータをTRUEに設定しない場合、古いファイルは削除されません。古いセッションにアクセスできる場合、これは安全ですか?攻撃者は古いセッションを使用してセッションを固定できますか?
  • ログイン前にこの機能を使用する必要がありますか?

  • パラメータをtrueに設定する必要がありますか?

8
ALH

セッションの固定を回避する解決策は、単純なセッションIDの変更です。

bool session_regenerate_id([bool $delOldSession = false])は、現在のセッションIDを新しいものに置き換え、現在のセッション情報を保持します。パラメータtruesession_regenerate_id(true)を追加すると、古いセッションが削除されます。古いセッションを削除しないと、Webアプリケーションがセッションハイジャックに対して脆弱になります。/tmpディレクトリ内に古いが有効なセッションを残します。これの意味は:

  • 共有Webホスティングサーバーでは、一部のユーザーは引き続きそれらにアクセスできます
  • 有効なセッションIDを推測する機会が増える

古いセッションは常にsession_regenerate_id(true)またはsession_destroy()で破棄する必要があります。

ただし、session_regenerate_id(true)のパフォーマンスに注意する必要があります。最小限の要件は、ユーザーの権限(ログイン、ログアウトなど)を変更するときに使用することです。頻繁に使用すると、セッションで「奇妙な」ことに気づくでしょう。 PHPは、実行中の1つのタスクのみのセッションへのアクセスに制限があります。複数のリクエストがキューに入れられます。リクエストを高速に送信すると、次のようになります。

  • 最初のリクエストはセッションIDを変更し、古いセッションを削除します。

  • 2番目の要求には(まだ)古いセッションIDが含まれており、それに対して何らかの操作を実行しようとします。

  • この古いセッションIDが存在しないため、新しいセッションが作成されています-これにより、ユーザーがログアウトします。
9
p____h