.NET 6 Web API FluentValidation正则校验未拦截非法字符问题
问题原因
你当前的校验不生效来自两个核心错误:
- 正则字符范围书写错误:你配置的
[z-a0-9-]中,小写字母范围写为逆序的z-a,正确的小写字母范围应为a-z,逆序写法无法正确匹配所有小写字母。 - 正则缺少全字符串匹配锚点:FluentValidation的
Matches()规则默认执行部分匹配逻辑,只要字符串中存在任意片段符合正则规则就会判定校验通过,不需要整个字符串完全符合规则。测试用例FileName中包含连续的小写字母,刚好命中你写的正则片段,因此被错误判定为校验通过。
修复步骤
修改配置文件中存储的正则规则为以下带首尾锚点的正确格式:
^[a-z0-9-]+$规则各部分含义:
^:匹配字符串起始位置,避免字符串开头出现非法字符[a-z0-9-]+:匹配1个及以上的小写字母、数字、连字符$:匹配字符串结束位置,避免字符串末尾出现非法字符
注意:若你的业务允许空字符串,可将
+替换为*;如果需要严格避免多行模式下的匹配偏差,可将^/$替换为\A/\z。修正测试用例逻辑:你当前将本应校验失败的非法入参(如
FileName)放在了「校验通过」的测试集合中,测试逻辑本身存在错误。需要将合法、非法用例拆分到不同测试方法中,参考代码如下:[Theory] // 合法入参,应通过校验 [InlineData("62c1a17e6b09e88d43cbb087-transactionreport")] [InlineData("test-json-20220619324234")] [InlineData("62c1a17e6b09e88d43cbb087")] [InlineData("test")] [InlineData("-json-")] [InlineData("20220619324234")] [InlineData("2022--06193--24234")] public async Task ValidateCreateFileRequest_ValidInput_PassValidation(string name) { var request = new CreateFileRequest { Name = name }; var result = _validator.TestValidate(request); result.ShouldNotHaveValidationErrorFor(m => m.Name); } [Theory] // 非法入参,应触发校验失败 [InlineData("FileName")] // 包含大写字母 [InlineData("test_json")] // 包含下划线 [InlineData("test space")] // 包含空格 [InlineData("a-")] // 长度不足3位 public async Task ValidateCreateFileRequest_InvalidInput_FailValidation(string name) { var request = new CreateFileRequest { Name = name }; var result = _validator.TestValidate(request); result.ShouldHaveValidationErrorFor(m => m.Name); }
修改完成后,只有整个字符串完全由小写字母、数字、连字符组成时才会通过校验,出现任意非法字符都会触发你配置的错误提示。
内容的提问来源于stack exchange,提问作者Dror Cohen
相关产品推荐
相关产品推荐

