XSRF(Cross-Site Request Forgery)和CSRF(Cross-Site Request Forgery)是一种常见的网络攻击方式,攻击者通过伪造请求将恶意操作发送到用户正在访问的网站。为了防止这种攻击,可以采取以下措施:
-  验证码(CAPTCHA):使用验证码可以确保请求来自真实的用户,而不是自动化的攻击脚本。 
-  Token验证:通过在每个请求中包含一个随机生成的令牌,并在服务器端验证该令牌的有效性,可以防止CSRF攻击。在.NET Core中,可以使用`[ValidateAntiForgeryToken]`属性来自动验证令牌,或者使用`IAntiforgery`服务手动验证令牌。 
-  SameSite Cookie属性:在设置cookie时,可以通过将`SameSite`属性设置为`Strict`或`Lax`来限制cookie的跨站点行为,从而减少XSRF攻击的可能性。 
-  HTTP请求头:可以在请求头中添加自定义的XSRF/CSRF令牌,然后在服务器端进行验证。 
需要特别注意的是,以上措施并不是一劳永逸的解决方案,攻击者可能会不断寻找新的漏洞。因此,我们需要保持应用程序的安全性定期更新和加强防护措施。
在.NET Core WebAPI中实现XSRF/CSRF保护的中间件可以通过自定义中间件来实现。下面是一个示例:
1、首先,创建一个名为`XsrfCsrfMiddleware.cs`的中间件类:
using System;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Antiforgery;
 using Microsoft.AspNetCore.Http;
namespace YourNamespace
 {
     public class XsrfCsrfMiddleware
     {
         private readonly RequestDelegate _next;
         private readonly IAntiforgery _antiforgery;
        public XsrfCsrfMiddleware(RequestDelegate next, IAntiforgery antiforgery)
         {
             _next = next;
             _antiforgery = antiforgery;
         }
        public async Task Invoke(HttpContext context)
         {
             if (context.Request.Method == HttpMethods.Post)
             {
                 await _antiforgery.ValidateRequestAsync(context);
             }
            await _next(context);
         }
     }
 }
2、在`Startup.cs`文件的`ConfigureServices`方法中注册中间件:
using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
namespace YourNamespace
 {
     public class Startup
     {
         public Startup(IConfiguration configuration)
         {
             Configuration = configuration;
         }
public IConfiguration Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
         {
             // 添加Antiforgery服务
             services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
// 其他服务配置
            services.AddControllers();
         }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
         {
             // 其他中间件配置
app.UseMiddleware<XsrfCsrfMiddleware>();
// 其他中间件配置
app.UseRouting();
            app.UseEndpoints(endpoints =>
             {
                 endpoints.MapControllers();
             });
         }
     }
 }
3、这样,中间件将在每个请求执行之前先验证请求是否为有效的XSRF/CSRF请求。如果是POST请求,中间件将利用`IAntiforgery`服务进行请求验证。如果验证失败,将抛出异常,请求将被终止。否则,请求将继续被处理。
4、注册中间件的另一种方式:
// 注册中间件
public static class XsrfCsrfMiddlewareExtensions
{public static IApplicationBuilder UseXsrfCsrfMiddleware(this IApplicationBuilder app){return app.UseMiddleware<XsrfCsrfMiddleware>();}
}要使用这个中间件,请在`Startup.cs`文件中进行配置和注册:
public class Startup
{//...public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){//...app.UseXsrfCsrfMiddleware();//...}
}请注意,上述代码只是一个简单的示例,你可以根据自己的需求进行调整和扩展,例如在验证失败时返回自定义的错误消息等。
最后,要确保在前端应用中使用合适的方式生成XSRF/CSRF令牌,并在请求头中包含该令牌。这样,中间件才能成功验证请求。