CSRF攻撃の防御戦略と実装方法

WBOY
リリース: 2023-08-10 18:50:01
オリジナル
1264 人が閲覧しました

CSRF攻撃の防御戦略と実装方法

CSRF 攻撃防御戦略と実装方法

ネットワーク技術の継続的な発展に伴い、ネットワーク セキュリティのリスクも増大しています。クロスサイト リクエスト フォージェリ (CSRF) 攻撃は、現在のインターネット アプリケーションが直面する主要な脅威の 1 つとなっています。この記事では、CSRF 攻撃の基本原理と一般的に使用される防御方法を紹介し、関連するコード例を使用してその実装方法をさらに説明します。

  1. CSRF 攻撃の原理

CSRF 攻撃は、ユーザーの認証されたセッションを使用して悪意のある操作を実行します。攻撃者は、ユーザーに悪意のあるリンクをクリックさせたり、悪意のある Web サイトにアクセスさせたりして、被害者の知らないうちに偽のリクエストを送信させます。ユーザーが信頼できる Web サイトにログインして認証に成功すると、ブラウザーはリクエストの送信時に対応する ID 資格情報を自動的に送信するため、攻撃者がユーザーになりすましてリクエストを送信し、悪意のある操作を実行することが可能になります。

  1. 防御戦略

(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. 実装方法

(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";
}
ログイン後にコピー
ログイン後にコピー
  1. 概要

CSRF 攻撃は一般的で有害な攻撃方法ですが、いくつかの効果的な防御戦略を使用することで、アプリケーションのセキュリティを向上させることができます。この記事では、一般的に使用される 2 つの防御方法、つまり発信元検出と CSRF トークンの追加を紹介し、実装方法のサンプル コードも示します。アプリケーションを開発するときは、ユーザーデータのセキュリティを確保するために、特定の状況に基づいて適切な防御戦略を選択し、それらを正しく実装する必要があります。

以上がCSRF攻撃の防御戦略と実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート