You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core及MVC中跨站脚本(XSS)处理方案咨询

在ASP.NET Core / MVC中处理XSS的替代方案

嘿,我来帮你梳理下ASP.NET Core里处理XSS和HTML内容的替代方案——确实,旧.NET框架里的[AllowHtml]和[ValidateInput]在Core里已经被更灵活安全的机制取代了,下面给你详细拆解:

1. 依赖默认的自动HTML编码(最省心的安全基础)

ASP.NET Core Razor视图默认会自动对所有输出的字符串进行HTML编码,比如你在视图里写:

@Model.UserInput

系统会自动把<>、&这类危险字符转义成&lt;、&gt;、&amp;,从根源上阻止XSS注入。这比旧版.NET框架的默认行为要安全得多,绝大多数场景下你都不用额外处理。

2. 允许HTML内容的替代方案(对应旧版[AllowHtml])

如果确实需要输出或接收未编码的HTML,别直接照搬旧思路,Core里有更安全的方式:

  • 在视图中输出原始HTML:如果你完全信任输出内容的来源(比如后台生成的静态HTML、经过严格过滤的用户输入),可以用@Html.Raw():

    @Html.Raw(Model.ApprovedHtmlContent)
    

    注意:绝对不要用这个输出未验证的用户输入,否则会直接引入XSS风险!

  • 接收HTML格式的请求数据:旧版[AllowHtml]是允许Action参数接收HTML,在Core里,你可以:

    1. 直接读取请求体的原始内容,绕过默认模型绑定的HTML检测:
      [HttpPost]
      public IActionResult Submit()
      {
          var rawHtml = Request.Form["HtmlContent"];
          // 先过滤再使用
          var sanitizedHtml = new HtmlSanitizer().Sanitize(rawHtml);
          // 后续逻辑
          return Ok();
      }
      
    2. 用HTML过滤库(通过NuGet安装HtmlSanitizer)对输入的HTML进行清理,保留安全标签(如<b>、<p>),移除<script>、onclick这类危险元素和属性,这是最推荐的方式。

3. 精细的输入验证(替代旧版[ValidateInput])

旧版[ValidateInput(false)]是全局关闭输入验证,这在Core里非常不推荐,而是建议做精细的针对性验证:

  • 自定义验证属性:比如写一个验证属性,自动过滤并检查输入的HTML是否安全:
    public class SafeHtmlAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value is string inputHtml)
            {
                var sanitizer = new HtmlSanitizer();
                var cleanedHtml = sanitizer.Sanitize(inputHtml);
                // 如果原始内容和清理后的不一样,说明有危险内容
                if (!string.Equals(inputHtml, cleanedHtml, StringComparison.Ordinal))
                {
                    return new ValidationResult("输入包含不安全的HTML内容,请修改后重试");
                }
            }
            return ValidationResult.Success;
        }
    }
    
    然后在模型属性上标注:
    public class PostModel
    {
        [SafeHtml]
        public string Content { get; set; }
    }
    
  • 手动验证:在Action里对请求数据进行检查,拒绝包含危险关键词(如<script>)的输入。

4. 额外的加固措施

除了上面的方法,还有几个通用的安全手段可以进一步降低XSS风险:

  • 启用内容安全策略(CSP):在响应头中添加CSP规则,限制页面可以加载的资源来源,即使出现XSS漏洞,也能阻止恶意脚本执行。比如在Program.cs里配置:
    app.Use(async (context, next) =>
    {
        context.Response.Headers.Add("Content-Security-Policy", 
            "default-src 'self'; script-src 'self'; style-src 'self'");
        await next();
    });
    
  • 坚持使用Antiforgery Token:ASP.NET Core默认在表单请求中启用Antiforgery验证,这不仅能防止CSRF攻击,也能辅助减少XSS的影响。
  • 前端处理要谨慎:如果用JavaScript操作DOM,尽量用textContent代替innerHTML插入内容;如果必须用innerHTML,也要先对内容进行HTML转义。

总结一下,ASP.NET Core的设计思路是「默认安全」,所以优先依赖自动编码,只有在必要时才允许HTML内容,同时一定要配合HTML过滤来保证安全,别像旧版那样轻易关闭全局验证。

内容的提问来源于stack exchange,提问作者Pascal Jackson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:38:01