CSRF 攻撃防御戦略と実装方法
ネットワーク技術の継続的な発展に伴い、ネットワーク セキュリティのリスクも増大しています。クロスサイト リクエスト フォージェリ (CSRF) 攻撃は、現在のインターネット アプリケーションが直面する主要な脅威の 1 つとなっています。この記事では、CSRF 攻撃の基本原理と一般的に使用される防御方法を紹介し、関連するコード例を使用してその実装方法をさらに説明します。
CSRF 攻撃は、ユーザーの認証されたセッションを使用して悪意のある操作を実行します。攻撃者は、ユーザーに悪意のあるリンクをクリックさせたり、悪意のある Web サイトにアクセスさせたりして、被害者の知らないうちに偽のリクエストを送信させます。ユーザーが信頼できる Web サイトにログインして認証に成功すると、ブラウザーはリクエストの送信時に対応する ID 資格情報を自動的に送信するため、攻撃者がユーザーになりすましてリクエストを送信し、悪意のある操作を実行することが可能になります。
(1) 同一発信元検出
オリジナル検出は、CSRF 攻撃に対する防御の一般的な手段の 1 つです。 requested 送信元アドレスと宛先アドレスが同じドメイン名に属しているかどうかを判断する方法は、リクエストの正当性を判断することです。検証はサーバー側で実行され、ソース ドメイン名とターゲット ドメイン名が一致しない場合、リクエストは拒否されます。
サンプルコード:
@RequestMapping("/transfer") public String transferMoney(HttpServletRequest request) { String origin = request.getHeader("Referer"); String target = request.getServerName(); if(!origin.equals(target)) { return "Illegal Request"; } // 业务逻辑处理... return "Transfer Successful"; }
(2) CSRFトークンの追加
CSRFトークンの追加もよく使われる防御方法の1つです。サーバーは HTML ページを返すと、一意のトークンを生成してフォームに埋め込むか、Cookie としてクライアントに送信します。フォームが送信されると、トークンがサーバーに送信されます。サーバーはトークンが一致するかどうかを確認し、一致しない場合はリクエストを拒否します。
サンプルコード:
@RequestMapping("/transfer") public String transferMoney(HttpServletRequest request, @RequestParam("csrfToken") String csrfToken) { HttpSession session = request.getSession(); String storedToken = (String) session.getAttribute("csrfToken"); if (!csrfToken.equals(storedToken)) { return "Invalid Token"; } // 业务逻辑处理... return "Transfer Successful"; }
(3) 同期リクエストと非同期リクエスト
非同期リクエストは、AJAX などの技術を使用して、ページを更新せずにサーバーにリクエストを送信します。これにより、CSRF 攻撃を防ぐことが困難になります。したがって、機密性の高い操作を伴うリクエストの場合は、サーバーとの間でより信頼性の高いセッションを確立できるように、同期リクエストを使用することが最善です。
(1)リクエスト元の確認とオリジン検出の追加
バックエンドサービスで、リクエスト元のRefererフィールドを取得します。リクエスト ヘッダー。バックグラウンド ロジックに基づいてリクエストが正当かどうかを判断します。リクエストのソースがターゲットと一致しない場合、リクエストは拒否されます。
サンプルコード:
@RequestMapping("/transfer") public String transferMoney(HttpServletRequest request) { String origin = request.getHeader("Referer"); String target = request.getServerName(); if(!origin.equals(target)) { return "Illegal Request"; } // 业务逻辑处理... return "Transfer Successful"; }
(2) CSRFトークンの追加
HTMLページをフロントエンドに送信する際に、一意のトークンを生成し、フォームに埋め込むか送信します。 Cookieとしてクライアントに送信されます。フロントエンドがリクエストを送信すると、トークンがサーバーに送信され、サーバーはトークンが一致するかどうかを検証してリクエストの正当性を判断します。
サンプル コード:
@RequestMapping("/transfer") public String transferMoney(HttpServletRequest request, @RequestParam("csrfToken") String csrfToken) { HttpSession session = request.getSession(); String storedToken = (String) session.getAttribute("csrfToken"); if (!csrfToken.equals(storedToken)) { return "Invalid Token"; } // 业务逻辑处理... return "Transfer Successful"; }
CSRF 攻撃は一般的で有害な攻撃方法ですが、いくつかの効果的な防御戦略を使用することで、アプリケーションのセキュリティを向上させることができます。この記事では、一般的に使用される 2 つの防御方法、つまり発信元検出と CSRF トークンの追加を紹介し、実装方法のサンプル コードも示します。アプリケーションを開発するときは、ユーザーデータのセキュリティを確保するために、特定の状況に基づいて適切な防御戦略を選択し、それらを正しく実装する必要があります。
以上がCSRF攻撃の防御戦略と実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。