一、安全配置审计的核心出发点:为什么要做这三件事

1.1 三个漏洞的“破坏逻辑”到底是什么

我们先拿生活化的例子理解:CSRF就像你已经登录了银行账号,然后点了陌生邮件里的“积分领取”链接,这个链接会偷偷用你的身份给银行发转账请求——因为浏览器自动带上你的登录Cookie,银行分不清是不是你本人操作;XSS好比你在论坛发了一条带恶意脚本的评论,其他用户打开这条评论,脚本就会在他们的浏览器里偷取登录信息;HTTPS重定向则是把你和网站的通信从“明着说话”改成“用加密密码箱传纸条”,防止公共WiFi里的黑客偷看或篡改内容。这三个问题覆盖了Web安全里最常见的三类攻击,是安全配置审计的核心必查项。

二、ASP.NET Core里CSRF防御:表单提交的“专属验证码”机制

2.1 原生防伪令牌的实战配置

ASP.NET Core自带了开箱即用的CSRF防御机制,核心是给每个用户的会话生成唯一的“防伪令牌”,提交表单时必须带上这个令牌,否则请求会被拦截,就像外卖必须取货码才能签收。以下是完整示例: 技术栈:ASP.NET Core 6.0(MVC模式)

using Microsoft.AspNetCore.Mvc;

namespace CsrfDemo.Controllers
{
    // 模拟转账功能的控制器
    public class TransferController : Controller
    {
        // 显示转账表单的页面
        public IActionResult Index()
        {
            return View();
        }

        // 处理转账的动作,必须加ValidateAntiForgeryToken特性
        [HttpPost]
        [ValidateAntiForgeryToken] // 核心:验证请求是否带合法令牌
        public IActionResult DoTransfer(string toAccount, decimal amount)
        {
            // 这里省略实际的数据库操作,只做逻辑演示
            if (amount > 0 && !string.IsNullOrWhiteSpace(toAccount))
            {
                TempData["Success"] = $"已向账号{toAccount}转账{amount:F2}元";
            }
            else
            {
                TempData["Error"] = "转账信息不合法,请检查";
            }
            return RedirectToAction(nameof(Index));
        }
    }
}

对应的视图(Index.cshtml)代码,核心是自动生成防伪令牌的隐藏字段:

@{
    ViewData["Title"] = "安全转账页面";
}

<h1>资金转账(安全模式)</h1>

<!-- 表单提交,自动生成防伪令牌 -->
<form asp-action="DoTransfer" method="post">
    <!-- 自动生成隐藏的防伪令牌字段,恶意请求无法伪造 -->
    @Html.AntiForgeryToken()
    
    <div class="form-group mb-3">
        <label>目标账号:</label>
        <input type="text" name="toAccount" required class="form-control" placeholder="请输入对方账号" />
    </div>
    <div class="form-group mb-3">
        <label>转账金额:</label>
        <input type="number" name="amount" required step="0.01" class="form-control" placeholder="0.00" />
    </div>
    <button type="submit" class="btn btn-primary">提交转账</button>
</form>

<!-- 显示操作结果 -->
@if (TempData["Success"] != null)
{
    <div class="alert alert-success mt-3">@TempData["Success"]</div>
}
@if (TempData["Error"] != null)
{
    <div class="alert alert-danger mt-3">@TempData["Error"]</div>
}

2.2 CSRF防御的应用场景、优缺点与注意事项

应用场景:所有涉及用户敏感操作的表单,比如电商订单提交、后台用户删除、密码修改等,只要是会改变服务器数据的POST请求,都需要加这个防御。 技术优点:Core原生支持,不需要额外引入第三方库,配置简单,令牌和用户会话绑定,安全性有保障; 技术缺点:如果用AJAX或API接口(非表单提交),需要额外把令牌放到请求头里,否则会被拦截; 注意事项:不要在GET请求里用这个特性(HTTP规范里GET是“查数据”,不是“改数据”),令牌和会话过期时间一致,不会重复使用,降低泄露风险。

三、XSS防护:输入到输出的“双锁”机制

3.1 ASP.NET Core原生的输出编码防护

XSS的核心是“恶意脚本插入”,而Core的默认输出编码就像给所有内容套了个“安全壳”,把<script>这种会被执行的标签转成普通文本。示例如下: 技术栈:ASP.NET Core 6.0(Razor Pages)

using Microsoft.AspNetCore.Mvc.RazorPages;

namespace XssDemo.Pages
{
    public class IndexModel : PageModel
    {
        // 模拟从数据库获取的用户评论,故意带恶意脚本
        public string UserComment { get; set; } = "<script>alert('偷你的登录Cookie')</script>";

        public void OnGet()
        {
            // 实际项目中是动态加载用户评论,这里直接赋值演示
            UserComment = "<script>alert('恶意脚本执行')</script>";
        }
    }
}

对应的视图代码,注意正确和错误的用法:

@page
@model XssDemo.Pages.IndexModel

<h1>用户评论区</h1>

<!-- Core默认自动编码,脚本会变成文本,不会执行 -->
<div class="comment">
    <p>用户评论:@Model.UserComment</p>
</div>

<!-- 错误示例:用Html.Raw会跳过编码,脚本会执行,绝对不要乱用 -->
<div class="wrong-comment">
    <p>危险用法(禁止):@Html.Raw(Model.UserComment)</p>
</div>

3.2 XSS防护的进阶技巧

如果需要允许用户输入少量HTML(比如博客的粗体、斜体),不能直接用Html.Raw,要配置白名单过滤。示例代码:

using Microsoft.AspNetCore.Html;
using System.Text.Encodings.Web;
using System.Text.Unicode;

namespace XssDemo.Controllers
{
    public class BlogController : Controller
    {
        // 处理用户提交的博客内容
        public IActionResult PostContent(string userInput)
        {
            // 只允许<b>、<i>、<p>、<br>标签,其他标签自动编码
            var allowedTags = new[] { "b", "i", "p", "br" };
            // 允许的属性(比如粗体的样式)
            var allowedAttributes = new Dictionary<string, string[]>
            {
                { "b", new[] { "style" } },
                { "i", new[] { "style" } }
            };
            var encoderSettings = new HtmlEncoderSettings
            {
                AllowTags = allowedTags,
                AllowAttributes = allowedAttributes
            };
            var safeEncoder = HtmlEncoder.Create(encoderSettings);
            // 过滤用户输入,只保留合法内容
            string safeContent = safeEncoder.Encode(userInput);
            return Content(safeContent);
        }
    }
}

XSS防护的应用场景:论坛、博客、问答平台、评论区等允许用户输入自由内容的功能,这些都是XSS攻击的重灾区。 技术优点:Core默认的输出编码覆盖了90%以上的场景,几乎不用配置就能防住大部分XSS;进阶白名单过滤灵活,能满足部分需求; 技术缺点:如果开发者不小心用了Html.Raw,就会引入严重风险;白名单配置需要准确,漏了会被绕过; 注意事项:绝对不要用黑名单过滤XSS(比如过滤<script>标签),黑客可以用<scr<script>ipt>这样的变形绕过,白名单才是安全的选择。

四、HTTPS强制重定向:把流量锁在加密通道里

4.1 ASP.NET Core中配置HTTPS重定向

HTTP请求是明文的,容易被中间人监听和篡改,HTTPS重定向会把所有HTTP请求转到加密的HTTPS,就像把普通信件放进密码箱。示例配置: 技术栈:ASP.NET Core 6.0

var builder = WebApplication.CreateBuilder(args);

// 添加MVC服务
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 环境区分:开发和生产的安全配置不同
if (app.Environment.IsDevelopment())
{
    // 开发环境不用强制HTTPS,方便调试
    app.UseDeveloperExceptionPage();
}
else
{
    // 生产环境:开启异常处理,添加HSTS头部(后续自动用HTTPS)
    app.UseExceptionHandler("/Home/Error");
    // HSTS:告诉浏览器,这个网站永远用HTTPS,有效期30天,包含子域名
    app.UseHsts(options => options.MaxAge(days: 30).IncludeSubdomains());
}

// 核心:把所有HTTP请求强制重定向到HTTPS
app.UseHttpsRedirection();

// 静态文件、路由、授权配置
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

// 默认路由规则
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

4.2 HTTPS重定向的应用场景、优缺点与注意事项

应用场景:所有面向公网的Web应用,尤其是涉及用户登录、支付、敏感信息传输的系统,比如电商、银行后台、社交平台。 技术优点:配置简单,效果明显,能有效防止中间人攻击;HSTS头部还能减少后续重定向的开销,提升性能; 技术缺点:需要SSL/TLS证书,生产环境不能用自签名证书(会被浏览器标记不安全),必须从正规CA机构申请;本地开发需要配置HTTPS证书,有些第三方工具兼容性差; 注意事项:HTTPS的443端口必须在服务器开放,否则重定向会失败;不要在HTTPS站点上混合加载HTTP资源(比如图片、脚本),会被浏览器阻止显示混合内容错误。

五、综合加固的实战总结

把这三个防护结合起来,比如一个电商的订单提交页面:用户进入页面会被自动转到HTTPS(防止窃听),表单提交带防伪令牌(防止CSRF),用户输入的收货地址和备注经过XSS过滤(防止脚本攻击),形成了从网络层到应用层的全链路安全防护,覆盖了90%以上的常见Web安全风险。开发者在做安全配置审计时,只要逐一检查这三个点,就能快速完成核心的安全加固,不需要堆砌复杂的安全方案,适合不同基础的开发者落地。