ネットワークテクノロジーの継続的な開発により、ネットワークセキュリティのリスクも増加しています。クロスサイトリクエストフォーファリー(CSRF)攻撃は、現在のインターネットアプリケーションが直面している主な脅威の1つになりました。この記事では、CSRF攻撃の基本原則と一般的に使用される防御方法を紹介し、その実装方法をさらに説明し、関連するコードの例を添付します。
CSRF攻撃は、ユーザーの認証されたセッションを使用して悪意のある操作を実行します。攻撃者は、ユーザーに悪意のあるリンクをクリックするか、悪意のあるWebサイトにアクセスするように誘導し、被害者の知識なしに偽のリクエストを送信します。ユーザーが信頼できるWebサイトでログインして認証されると、ブラウザはリクエストを送信するときに対応するID資格情報を自動的に運びます。その結果、攻撃者はユーザーになりすましてリクエストを送信して悪意のある操作を実行できます。
相同性検出は、CSRF攻撃から防御する一般的な方法の1つです。リクエストのソースとターゲットアドレスが同じドメイン名に属するかどうかを比較することにより、リクエストの正当性を判断します。検証はサーバー側で実行され、ソースドメイン名とターゲットドメイン名が一貫性がない場合、リクエストは拒否されます。
@RequestMapping( "/transfer") public string transfermoney(httpservletrequestリクエスト){ string rigin = request.getheader( "参照"); 文字列ターゲット= request.getServername(); if(!origin.equals(ターゲット)){ 「違法リクエスト」を戻るします。 } //ビジネスロジック処理... 「転送成功」を戻るします。 }
CSRFトークンの追加は、一般的に使用される防御方法の1つでもあります。サーバーがHTMLページを返すと、一意のトークンを生成し、フォームに埋め込むか、クッキーとしてクライアントに送信します。フォームを送信するときは、トークンをサーバー側に送信します。サーバーは、トークンが一致することを確認し、一致しない場合、リクエストは拒否されます。
@RequestMapping( "/transfer") public String TransferMoney(httpservletrequestリクエスト、@RequestParam( "csrftoken")string csrftoken){ httpsession session = request.getSession(); string storedtoken =(string)session.getAttribute( "csrftoken"); if(!csrftoken.equals(storedtoken)){ 「無効なトークン」を戻るします。 } //ビジネスロジック処理... 「転送成功」を戻るします。 }
非同期リクエストは、Ajaxなどのテクノロジーを使用して、ページを更新せずにサーバーにリクエストを送信するため、CSRF攻撃を停止することが困難になります。したがって、機密操作を含むリクエストの場合、同期リクエストを使用して、より信頼性の高いセッションをサーバーで確立できるようにすることをお勧めします。
バックエンドサービスでは、リクエストヘッダーの参照フィールドを取得することにより、バックグラウンドロジックに基づいてリクエストが合法かどうかが判断されます。要求ソースがターゲットと矛盾している場合、リクエストは拒否されます。
@RequestMapping( "/transfer") public string transfermoney(httpservletrequestリクエスト){ string rigin = request.getheader( "参照"); 文字列ターゲット= request.getServername(); if(!origin.equals(ターゲット)){ 「違法リクエスト」を戻るします。 } //ビジネスロジック処理... 「転送成功」を戻るします。 }
HTMLページをフロントエンドに送信すると、ユニークなトークンが生成され、フォームに埋め込まれているか、クッキーとしてクライアントに送信されます。フロントエンドがリクエストを送信すると、トークンをサーバーに送信します。サーバーは、トークンがリクエストの正当性を一致させ、判断するかどうかを確認します。
@RequestMapping( "/transfer") public String TransferMoney(httpservletrequestリクエスト、@RequestParam( "csrftoken")string csrftoken){ httpsession session = request.getSession(); string storedtoken =(string)session.getAttribute( "csrftoken"); if(!csrftoken.equals(storedtoken)){ 「無効なトークン」を戻るします。 } //ビジネスロジック処理... 「転送成功」を戻るします。 }
CSRF攻撃は一般的で有害な攻撃方法ですが、いくつかの効果的な防衛戦略はアプリケーションのセキュリティを改善できます。この記事では、一般的に使用される2つの防御方法、相同検出とCSRFトークンの追加を紹介し、実装方法のサンプルコードも提供します。アプリケーションを開発するときは、特定の状況に基づいて適切な防衛ポリシーを選択し、ユーザーデータのセキュリティを確保するためにそれらを正しく実装する必要があります。