セキュリティの設定
以下の目的で、 Program.cs 上で HTTP レスポンスヘッダーを設定します。
Program.cs が冗長になることを防止するため、ミドルウェア を作成します。
セキュリティ設定を 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 レスポンスヘッダーが以下のように設定されます。

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