リプレイ攻撃との戦い:簡単な方法トークンベースのアプローチ
攻撃者は、攻撃者が属していないネットワークパケットを傍受して再送信する攻撃を非常に危険であり、深刻な損害を引き起こすことさえあります。暗号化された通信チャネルでさえ、攻撃者は復号化キーにアクセスすることなくそのような攻撃を開始する場合があります。攻撃者はあなたのラインを単に盗聴し、特定のパケットセットによって実行されるタスクを大まかに理解し、それらのパケットまたはリクエストを控えることにより、通信を中断したり、より深刻な損害を引き起こす可能性があります。
この記事では、ウェブサイトが攻撃を再生するのを防ぐためのシンプルで使いやすい基本方法を紹介します。また、混乱したユーザーが間違った時間中に最後のPOSTリクエストを繰り返し繰り返すことを防ぎます。
これは完全な解決策とはほど遠いものです。解決すべき欠陥と問題がありますが、トークンとシンプルなプロトコルがWebサイトのセキュリティをどのように強化できるかについての大まかなアイデアを提供します。サンプルコードと実装は、ASP.NETとC#を使用して行われますが、コンセプトは他のプラットフォームまたはプログラミング言語に展開できます。
一度限りのトークンの概念この記事で提供されるソリューションの中心的なアイデアは、次のPOSTリクエストにのみ有効なトークン文字列に各HTTP応答をバインドすることです。関連する手順の簡単な内訳は次のとおりです。
クライアントは、URLまたはページを入力するか、リンクをクリックしてGETリクエストを行います。
<input type="hidden">
バックグラウンドコードは、送信時間とテキストボックスに含まれるデータを示す単純なスニペットになります。
これは、最初のGetリクエスト後のページの出力です:
ページを送信した後、出力は次のようになります:
問題は、ページを更新すると、データを再発行して最後のリクエストを繰り返すことです。サーバーは問題なく処理することです。 1,000,000ドルのキー取引をして、キーボードのF5キーを誤って押しただけで想像してみてください。さらに悪いことに、一部の悪意のあるユーザーはあなたの要求を傍受し、それが支払い取引であることを見つけ、それを繰り返してあなたの資金を盗み、あなたに対して報復します。
solution
[投稿]リクエストの重複を防ぐために、タグを更新して、トークンを保存する隠されたフィールドを追加します。
次に、ランダムなトークンを生成し、隠しフィールドとセッションコレクションの両方に埋め込む関数を作成します。
の後、公開されたトークンがセッションに保存されているトークンに等しい場合にのみ、公開されたデータが表示されるように、page_load()関数を変更します。
最後に、最終出力がクライアントに送信される前に、onprerender()関数をオーバーライドして新しいトークンを生成します。これが、新しいリクエストが送信されるたびに更新されるため、1回限りのトークンになります。
ボタンをクリックしてフォームを送信すると、以前と同じように機能します。ただし、ページを更新してリプレイ攻撃をシミュレートしようとすると、フォームで送信されたトークンがサーバーに保存されているトークンに等しくないため、次のエラーが表示されます。
この方法では、有効なボタンクリックの送信とエラーが繰り返されるリクエストを区別できます。
コードを改善します
このコードはページのリプレイ攻撃の問題を解決しますが、解決する必要がある問題がいくつかあります。
すべてのページで繰り返す必要があります
それをより良くする
このコードの1つの問題は、ブラウザに同じページを指す2つのタブがある場合、1つのタブを公開すると、同じセッショントークンキーを使用するため、他のタブのトークンが無効になることです。これは、トークンIDを追加することで解決できます。これにより、1つのタブで発生する各リクエスト応答シーケンスが独自の一意のトークンセットを使用し、同じページの他のリクエストを妨げないようにします。最初に行うことは、TokenizedPageクラスを返してtokenidプロパティを追加することです。このプロパティは、初期のGet Requestで呼び出されたときにランダムIDを生成し、将来の再利用のためにViewStateコレクションに保存します。
次に、sessionhiddentokenプロパティを変更して、page.titleプロパティを使用する代わりにtokenidプロパティを使用します。
素晴らしいことは、抽象化とカプセル化の原則を使用しているため(OOPの利点に感謝します)、他の変更を加える必要はなく、新しいメカニズムは派生したすべてのページで機能することですtokenizedPage。
残りの質問
これは、1回限りのトークンモードに関するものです。残っている質問は2つあります
Webサイトのリプレイ攻撃の防止(FAQ)
FAQ
リプレイ攻撃とは何ですか?それはどのように機能しますか?リプレイ攻撃を検出する方法は?
リプレイ攻撃の結果は何ですか?
私のウェブサイトがリプレイされないようにする方法は?
乱数は、通信セッションで1回しか使用されていないランダムまたは擬似ランダム数です。同じデータが複数回送信されたとしても、各データ転送が一意であることを保証することにより、再生攻撃を防ぎます。これにより、攻撃者がデータの送信を正常に再生することができなくなります。
SSL(セキュアソケット層)およびTLS(輸送層セキュリティ)は、ネットワーク安全な通信を提供する暗号化プロトコルです。送信されるデータを暗号化し、シーケンス番号とタイムスタンプの組み合わせを使用して、各データ送信の独自性を確保することにより、リプレイ攻撃を防ぎます。
タイムスタンプは、リプレイ攻撃の防止に重要な役割を果たすことができます。各データ転送にタイムスタンプを追加することにより、各転送が一意であり、正常に再生できないことを確認できます。再生伝送が検出された場合、タイムスタンプに基づいて簡単に識別および破棄できます。
はい、リプレイ攻撃は、適切なセキュリティ対策なしにWebサイトで実施される場合があります。ただし、財務データや個人情報などの機密情報を送信するWebサイトは、攻撃に対して特に脆弱です。
他の種類のサイバー攻撃ほど一般的ではありませんが、リプレイ攻撃が発生し、深刻な結果をもたらす可能性があります。したがって、それらを防ぐための措置を講じることが非常に重要です。
リプレイ攻撃を防ぐためのいくつかのベストプラクティスには、安全な通信プロトコルの使用、タイムスタンプまたはシリアル番号の実施、1回限りのパスワードまたは乱数の使用、ネットワークトラフィックの定期的な監視と監査が含まれます。さらに、セキュリティの重要性についてユーザーを教育し、安全なパスワードの使用を奨励することも、リプレイ攻撃を防ぐのに役立ちます。
この改訂された出力は、異なる文言と文の構造を使用しながら、元の意味を維持します
以上があなたのウェブサイトでのリプレイ攻撃を防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。