セッションハイジャックを防止する
質問
複数のクライアントが同じセッション 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 を生成するために十分なランダム入力を使用する ( session.entropy_file , session.entropy_length であり、かつ session.hash_function )
- HTTPS を使用して、送信中のセッション ID を保護します。
- セッション ID を URL ではなくクッキーに保存し、漏洩を防ぐ。 リファラー を使うことができます (参照 セッション.use_only_cookies )
-
でクッキーを設定します。
HttpOnly
とSecure
属性は、JavaScript経由のアクセス(XSS脆弱性の場合)と安全でない経路での送信を禁止するためのものです(詳しくは セッション.cookie_httponly そして セッション.クッキー.セキュア )
それ以外にも、古いセッションIDを無効にしながら、セッションIDを再生成する必要があります(
session_regenerate_id
機能
を追加して、セッションハイジャック攻撃の成功までの時間を短縮することができます。
関連
-
[解決済み] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given [重複] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.
-
[解決済み】DateTimeクラスのオブジェクトを文字列に変換できない
-
[解決済み】PHPの予期しないT_VARIABLEとは何ですか?
-
[解決済み] $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて
-
[解決済み] PHPのセッションを30分後に失効させるにはどうしたらいいですか?
-
[解決済み] JSONウェブトークンの無効化
-
[解決済み] なぜCSRF防止トークンをクッキーに入れるのが一般的なのですか?
-
[解決済み】「ログインしたままにする」 - 最適な方法とは?
-
[解決済み】JWTをブラウザに保存する場所は?CSRFから保護する方法は?
-
[解決済み】セッションは本当にRESTfulnessに違反するのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み】Fatal error: 未定義の関数 sqlsrv_connect() を呼び出した。
-
[解決済み】PHPで空の値からデフォルトオブジェクトを作成する?
-
[解決済み】++と*+の意味は何ですか?
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: バインドされた変数の数が102行目のトークンの数と一致しない [終了]
-
[解決済み】count()パラメータは配列かlaravelのcountableを実装したオブジェクトでなければならない
-
[解決済み] [Solved] Fatal error: 非オブジェクトのメンバ関数fetch_assoc()の呼び出し [重複]。
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?
-
[解決済み】警告: file_get_contents(): https:// ラッパーがサーバー構成ですべて無効になっています。