36 lines
1.3 KiB
C#
36 lines
1.3 KiB
C#
namespace Backend.Security;
|
|
|
|
public sealed class SecurityHeadersMiddleware(RequestDelegate next)
|
|
{
|
|
public async Task InvokeAsync(HttpContext context)
|
|
{
|
|
context.Response.OnStarting(() =>
|
|
{
|
|
var headers = context.Response.Headers;
|
|
headers["X-Content-Type-Options"] = "nosniff";
|
|
headers["X-Frame-Options"] = "DENY";
|
|
headers["Referrer-Policy"] = "strict-origin-when-cross-origin";
|
|
headers["Permissions-Policy"] = "camera=(), microphone=(), geolocation=()";
|
|
headers["Cross-Origin-Opener-Policy"] = "same-origin";
|
|
|
|
if (!headers.ContainsKey("Content-Security-Policy"))
|
|
{
|
|
headers["Content-Security-Policy"] =
|
|
"default-src 'self'; " +
|
|
"img-src 'self' data: https:; " +
|
|
"font-src 'self' https://fonts.gstatic.com data:; " +
|
|
"style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; " +
|
|
"script-src 'self'; " +
|
|
"connect-src 'self' https:; " +
|
|
"frame-ancestors 'none'; " +
|
|
"base-uri 'self'; " +
|
|
"form-action 'self';";
|
|
}
|
|
|
|
return Task.CompletedTask;
|
|
});
|
|
|
|
await next(context);
|
|
}
|
|
}
|