コンテンツ セキュリティ ポリシー (CSP) を使用して Spring Boot でクロスサイト スクリプティング (XSS) を防止する

概要

Web アプリケーションを使用する際のユーザーとその個人データのセキュリティは最優先事項です。 この基本原則は Web 開発の初期段階から認められていますが、悪意のある人物がアプリケーションの抜け穴を見つけて、ユーザーを悪用する可能性があります。

多くの「標準的な」攻撃はよく知られており、文書化されており、それらからの保護は難しくありません。 開発者がセキュリティ プラクティス自体を実装する負担を軽減するために、Spring Boot などのフレームワークはさまざまなセキュリティ対策を抽象化し、アプリケーションにセキュリティ フィルターを適用するだけでよく知られている攻撃を防ぐことができます。

この短いガイドでは、クロスサイト スクリプティング (XSS) とは何か、誰かが自分のアプリケーションに対してこの攻撃を実行する方法、Spring Boot で簡単に防ぐ方法を見ていきます。

クロスサイト スクリプティング (XSS) とは何ですか?

クロスサイト スクリプティングは、悪意のあるアクターが Web アプリケーションにスクリプトを挿入する、広く普及しているよく知られたエクスプロイトです。

通常、同一生成元ポリシーは Web アプリケーションに適用されます。これにより、生成元が一致しない場合に、Web ページ内のスクリプトがソースからのデータにアクセスすることが制限されます。 同一生成元ポリシーの下で – からのページの場合 信頼できるウェブサイト ユーザーとやり取りするデータ (たとえば Cookie など) にアクセスする可能性があり、同じオリジンの他のページも同様にアクセスする可能性があります。 この形式のアクセス制御は、当時 Web アプリケーション上のデータの整合性を保護するのに十分に思えました。

クロスサイト スクリプティングは同一生成元ポリシーを回避します、信頼できる Web サイトのページに悪意のあるスクリプトを挿入します。 スクリプトは信頼できる Web サイトから実行されるため、信頼できるスクリプトとして実行されます。 悪意のあるスクリプトと悪意のないスクリプトを区別する明確な方法がなかったため、クロスサイト スクリプティングによって任意のコードが実行される可能性がありました。 これは、迷惑なアラートの挿入から、ソーシャル エンジニアリング攻撃、ユーザー情報の密かに収集、信頼できる Web サイトの一部であるかのように見えるフィッシング ページにユーザーをリダイレクトすることまで、さまざまです。

その他にもたくさんのグーグルの Web サイトはクロスサイト スクリプティング攻撃の影響を受けやすく、このタイプのエクスプロイトは 90 年代から知られていましたが、今日でも一般的な攻撃です。

Content-Security Policy (CSP) を使用した Spring Boot アプリケーションでの XSS の防止

Spring Boot はセキュリティを真剣に考えており、Spring のセキュリティ モジュールは柔軟で強力なセキュリティ プラクティスを実装しているため、開発者はセキュリティに関して懸念を最小限に抑えることができます。これには、多くの場合、Web でメッセージが交換される方法の原則について低レベルの理解が必要です。応用。

デフォルトでは、Spring Boot はいくつかのセキュリティ ヘッダーを実装します。

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

X-XSS-Protection はデフォルトで含まれています! このセキュリティ ヘッダーは、 検出 XSS が試行し、それらをブロックします。 ただし、これは確実なプロセスではなく、ブラウザによって検出器の実装が異なります。 Chrome などの一部のブラウザでは、 XSS 監査人を削除しました. さらに、自動検出は次の場合に機能します 反射型 XSS 攻撃、他のタイプの攻撃も存在します。

X-XSS-Protection のより最新の代替手段は、 コンテンツセキュリティポリシー (CSP) は、主に、どのリソースをどのオリジンから、どのエンドポイントでロードできるかに関するポリシーを扱います。 2022 年現在、CSP は XSS、クリックジャッキング、およびその他の種類の攻撃に対する最善の防御策です。 すべてのブラウザーが CSP を実装しているわけではないため、既定ではセキュリティ ヘッダーに含まれていません。

注: CSP が導入されていても、常に検証することが最善の方法です どれか コード インジェクションを防ぐために、システムを使用して安全に処理できることを確認してください。

Spring Boot では、カスタム Web セキュリティ対策を構成するには、通常、 WebSecurityConfigurerAdapter クラスをオーバーライドし、 configure() 方法:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
	.headers()
		.contentSecurityPolicy("csp-directives");
    }
}

コンテンツ セキュリティ ポリシー ディレクティブ ( ;-separated string) ユースケースと信頼するソースによって異なります。

Content-Security Policy: directive1; directive2; directive3; ... directiveN;

たとえば、Web アプリケーションは、スクリプトを読み込むことができる信頼できる Web サイトを一覧表示できます。

script-src https://trusted.com;

または、サードパーティの Web サイトの信頼をスキップできます。

script-src self;

同様に、アプリケーションはプラグインを信頼できます。

object-src https://trusted.com

次のようなさまざまなディレクティブを指定できます。

  • default-src – デフォルトのフォールバック
  • child-src – 有効な Web ワーカー ソース
  • frame-src – 有効な情報源 s
  • img-src – 画像の有効なソース
  • media-src – 有効な情報源 , & タグ
  • script-src – 有効なスクリプト ソース (XSS の防止に役立ちます)
  • style-src – 有効な情報源 要素は
  • base-uri – からアクセスできるリソースを制限します 素子
  • frame-ancestors – の有効な親 , , などの要素
  • 等々

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

たとえば、これはポリシー ディレクティブの安全なセットです。

script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:;
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
report-uri https://csp.example.com;

これらを Spring Boot アプリケーションに追加しましょう。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
	.headers()
		.contentSecurityPolicy("script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:; object-src 'none'; base-uri 'none'; require-trusted-types-for 'script'; report-uri https://csp.example.com;");
    }
}

あなたが使用することができます CSP-評価者 CSP ディレクティブが有効かどうかを評価する & 安全であり、どのディレクティブが簡単に悪用できるかを指摘します。 Google API を許可する CSP ディレクティブは次のとおりです。

default-src 'self';
object-src 'none';
frame-src 'self' data:; 
script-src 'self' 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' https://storage.googleapis.com; 
style-src 'self' 'unsafe-inline'; 
img-src 'self' data:; 
font-src 'self' data:;
base-uri 'self'

まとめ

この短いガイドでは、クロスサイト スクリプティング (XSS) とは何か、そしてそれが全体的なレベルでどのように機能するかを見ていきました。 次に、アプリケーションを安全にするために Spring Boot で簡単に実装できるいくつかの XSS 防止策を検討し、 コンテンツセキュリティポリシー (CSP)。

最後に、CSP ディレクティブを調査し、いくつかの異なる安全なポリシーを調べました。

タイムスタンプ:

より多くの スタックアバス