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

如何用Fluent Validation检查HTML内容?.NET6/7+ASP.NET Web API场景

用Fluent Validation拦截HTML输入的可靠方案

Fluent Validation本身没有内置的HTML内容检测规则,但有两种成熟的实现方式,不用自己从零写正则或逻辑:

方案1:基于HTML编码对比的自定义规则

这是最稳妥的方式,直接利用.NET内置的HTML编码器判断输入是否包含可转义的HTML特殊字符。如果原始输入和编码后的内容不一致,说明存在HTML标签或特殊字符。

在你的验证器里添加如下规则:

using FluentValidation;
using Microsoft.AspNetCore.Html;

public class FormModelValidator : AbstractValidator<YourFormModel>
{
    private readonly HtmlEncoder _htmlEncoder = HtmlEncoder.Default;

    public FormModelValidator()
    {
        RuleFor(model => model.YourTextField)
            .Must(InputHasNoHtml)
            .WithMessage("输入不能包含HTML标签");
    }

    private bool InputHasNoHtml(string input)
    {
        if (string.IsNullOrWhiteSpace(input))
            return true;

        var encodedInput = _htmlEncoder.Encode(input);
        return string.Equals(input, encodedInput, StringComparison.Ordinal);
    }
}

原理很直接:如果输入里有<、>这类HTML特殊字符,编码后会被转义成&lt;、&gt;,此时原始内容和编码结果就会不匹配,验证随即失败。这种方法比正则更全面,能覆盖所有可能的HTML特殊字符场景。

方案2:使用业界验证过的正则表达式

如果你偏好正则,可以用经过广泛测试的正则来匹配HTML标签,避免自行编写的正则存在漏洞。比如:

public class FormModelValidator : AbstractValidator<YourFormModel>
{
    public FormModelValidator()
    {
        RuleFor(model => model.YourTextField)
            .Matches(@"^[^<>&]*$")
            .WithMessage("输入不能包含HTML标签或特殊字符");
    }
}

这个正则会阻止包含<、>、&的输入,覆盖绝大多数常见的HTML注入情况。如果需要更严格地匹配完整HTML标签,可以使用以下正则:

.Matches(@"^((?!<[^>]+>).)*$", RegexOptions.Singleline)

需要注意的是,正则永远无法覆盖所有极端的HTML写法,所以编码对比的方案优先级更高。

额外防护建议

  • 输出端强制编码:就算验证层漏过了某些输入,在把内容输出到页面或返回给前端时,一定要用HTML编码器处理,从根源上防止XSS攻击。
  • 启用请求验证:对于表单提交的场景,可以在控制器或Action上配置请求验证,ASP.NET Core会自动拦截包含潜在危险的输入。
  • .NET7适配:上述两种方案在.NET7中完全兼容,无需修改代码,因为HtmlEncoder和Fluent Validation的API在.NET6到.NET7之间没有破坏性变更。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:25:28