1. ホーム
  2. php

セッションハイジャックを防止する

2023-11-16 15:10:49

質問

複数のクライアントが同じセッション ID を使用するのを防ぐにはどうすればよいですか。私の Web サイトでセッション ハイジャックを防止するために、セキュリティの追加レイヤーを追加したいので、これを質問しています。ハッカーが何らかの方法で他のユーザーのセッション ID を見つけ出し、その SID でリクエストを行う場合、サーバー上で 1 つの SID を共有する異なるクライアントが存在することをどのように検出し、ハイジャックの試みを拒否できるでしょうか。

EDIT

の制約上、私の求めていることは不可能であるという認識に至ったので、熟考の末、ガンボさんの回答を受け入れました。 ステートレス HTTP プロトコル

. 私は、おそらく HTTP の最も基本的な原則であることを忘れており、今考えると、この質問は少し些細なことのように思われます。

私が言いたいことを詳しく説明します。

ユーザー A が example.com にログインした後、簡単のために 'abc123' とする、いくつかのランダムなセッション ID が与えられます。このセッション ID はクライアント側の Cookie として保存され、サーバー側のセッションで検証され、ログインしたユーザーがある Web ページから別の Web ページに移動してもログインしたままであることを保証するために使用されます。もちろん、HTTPがステートレスでなければ、このクッキーは存在する必要がない。そのため、もしユーザーBがユーザーAのSIDを盗み、彼のコンピュータに「abc123」という値のクッキーを作成すると、彼はユーザーAのセッションを乗っ取ることに成功しますが、サーバーがユーザーBのリクエストがユーザーAのリクエストと異なることを正当に認識する方法がないため、サーバーにはリクエストを拒否する理由がないだけなのです。たとえ、サーバ上で既にアクティブになっているセッションをリストアップし、誰かが既にアクティブになっているセッションにアクセスしているかどうかを確認しようとしたとしても、それがセッションに不正にアクセスしている別のユーザであって、既にセッションIDでログインしていて、単にそれを使って別のリクエストをしようとしている(すなわち別のウェブページに移動する)同じユーザではないことをどうやって判断するのでしょうか? できません。ユーザーエージェントをチェックする?なりすましの可能性はありますが、それでも深層防護対策としては有効です。IPアドレスは?しかし、IP アドレスをまったくチェックしないのではなく、IP の最初の 2 オクテットをチェックすることをお勧めします。データプラン ネットワークのユーザーで、完全に正当な理由で常に IP を変更している場合でも、通常は IP の最後の 2 オクテットが変更されるだけです。

結論として、ステートレス HTTP は、セッションの乗っ取りから Web サイトを完全に保護することはできませんが、(Gumbo が提供したような)優れた実践は、セッション攻撃の大部分を防ぐのに十分でしょう。同じ SID の複数のリクエストを拒否することによってセッションをハイジャックから保護しようとすることは、単に馬鹿げており、セッションの目的全体を破壊することになります。

どのように解決するのですか?

残念ながら、本物のリクエストとは逆に、攻撃者から発信されたリクエストを明確に識別する効果的な方法はありません。なぜなら、IP アドレスやユーザー エージェントの特性など、対策がチェックするほとんどの特性は信頼できないか (IP アドレスは複数のリクエストの間で変わる可能性があります)、簡単に偽造できる (例. ユーザーエージェント リクエストヘッダなど) のようなほとんどの特性は信頼できないか、あるいは簡単に偽造できるため、望ましくない偽陽性 (つまり本物のユーザが IP アドレスを交換した) や偽陰性 (つまり攻撃者が同じ ユーザーエージェント ).

そのため、セッションハイジャックを防ぐ最良の方法は、攻撃者が他のユーザーのセッションIDを知ることができないようにすることです。これは、(1) 攻撃者が十分なエントロピーを使用して有効なセッション ID を推測できないように、また (2) ネットワーク通信のスニッフィング、クロスサイトスクリプティング、 を介した漏洩などの既知の攻撃/脆弱性によって攻撃者が有効なセッション ID を取得する他の方法がないようにアプリケーションとそのセッション管理を設計しなければならないということを意味します。 リファラー など。

とはいえ、そうすべきです。

それ以外にも、古いセッションIDを無効にしながら、セッションIDを再生成する必要があります( session_regenerate_id 機能 を追加して、セッションハイジャック攻撃の成功までの時間を短縮することができます。