コンテンツにスキップ

セキュリティの設定⚓︎

以下の目的で、 Program.cs 上で HTTP レスポンスヘッダーを設定します。

Program.cs が冗長になることを防止するため、ミドルウェア 1 を作成します。

セキュリティ設定を HTTP レスポンスヘッダーに設定するミドルウェア
HttpSecurityHeadersMiddleware.cs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
namespace DresscaCMS.Web.Extensions;

/// <summary>
/// HTTP レスポンスヘッダーにセキュリティ関連の設定を追加するミドルウェアです。
/// </summary>
public class HttpSecurityHeadersMiddleware
{
    private readonly RequestDelegate next;

    /// <summary>
    /// <see cref="HttpSecurityHeadersMiddleware"/> クラスの新しいインスタンスを生成します。
    /// </summary>
    /// <param name="next">HTTP 要求を処理できる delegate</param>
    public HttpSecurityHeadersMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    /// <summary>
    /// <see cref="HttpSecurityHeadersMiddleware"/> のメイン ロジックを実行します。
    /// </summary>
    /// <param name="context">HTTP コンテキスト</param>
    /// <returns>パイプラインの次の処理</returns>
    public async Task InvokeAsync(HttpContext context)
    {
        context.Response.OnStarting(() =>
        {
            // コンテンツタイプを誤認識しないよう、HTTPレスポンスヘッダに「X-Content-Type-Options: nosniff」の設定を追加
            context.Response.Headers["X-Content-Type-Options"] = "nosniff";

            // レガシーブラウザー向けのクリックジャッキング攻撃への対策として、HTTP レスポンスヘッダに、「X-FRAME-OPTIONS」を「DENY」に設定
            context.Response.Headers["X-Frame-Options"] = "DENY";

            return Task.CompletedTask;
        });

        await this.next(context);
    }
}
HttpSecurityHeadersMiddlewareExtensions.cs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
namespace DresscaCMS.Web.Extensions;

/// <summary>
/// <see cref="IApplicationBuilder"/> の拡張メソッドを提供します。
/// </summary>
public static class HttpSecurityHeadersMiddlewareExtensions
{
    /// <summary>
    /// <see cref="HttpSecurityHeadersMiddleware"/> を使用します。
    /// </summary>
    /// <param name="builder">アプリケーションの要求(HTTP リクエスト)処理パイプラインを構成(設定)するための仕組みを提供するクラス</param>
    /// <returns><see cref="IApplicationBuilder"/> のインスタンス</returns>
    public static IApplicationBuilder UseSecuritySettings(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<HttpSecurityHeadersMiddleware>();
    }
}

作成したミドルウェアを Program.cs から呼び出します。また、モダンブラウザー向けのクリックジャッキング対策はミドルウェア経由ではなく Program.cs 上で直接呼び出します。

Program.cs の実装
Program.cs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
using DresscaCMS.Web.Extensions; // その他の using は省略

var builder = WebApplication.CreateBuilder(args);

// 省略

var app = builder.Build();

// クリックジャッキング攻撃への対策として、 CSP frame-ancestors を設定
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode(o => o.ContentSecurityFrameAncestorsPolicy = "'none'");

// HTTP レスポンスヘッダーにセキュリティ関連の設定を追加するミドルウェアを使用
app.UseSecuritySettings();

app.Run();

HTTP レスポンスヘッダーが以下のように設定されます。

セキュリティ設定後の HTTP レスポンスヘッダー

Blazor Web アプリでのクリックジャッキング対策について

上の「 Program.cs の実装」に示すとおり、 Blazor Web アプリでは frame-ancestors 'none' の設定を、対話型サーバー側レンダリング(対話型 SSR )を構成する AddInteractiveServerRenderMode メソッド内で行います。 Blazor Web アプリでは応答ヘッダーの Content-Security-Policy に既定で frame-ancestors 'self' が設定されますが、 AddInteractiveServerRenderMode 内で設定を変更することにより、この設定を無効にできます。


  1. ここで言う「ミドルウェア」は、 ASP.NET Core のミドルウェアを指します。 ASP.NET Core のミドルウェアとは、リクエストとレスポンスを処理するために、アプリのパイプラインに組み込まれたソフトウェアのことです( 詳細 )。