20

我想通过正则表达式验证器拦截表单字段中的“<”字符。我将分三个步骤描述问题:

第 1 步:当我尝试提交包含“<”字符的字段的表单时,我收到“潜在危险请求...” - 正如 ASP.NET 中所预期的那样。

第 2 步:为了避免 ASP.NET 的 RequestValidation,我在控制器中用“[ValidateInput(false)]”装饰了我的 Update 方法。

它按预期工作 - 现在我可以发布“<”字符而不会出错。

第 3 步:我将 xVal 与 DataAnnotations 一起使用。例如,[Required] 或 [StringLength(255)] 按预期工作。

但是当我使用:[RegularExpression ("^[^<>]*$", ErrorMessage = "Special characters are not allowed.")] 时,我再次收到“Potentially dangerousos request...”错误,尽管 [ValidateInput (false)] 指令。

发生了什么?是否有更简单的正则表达式验证方法,但使用 [ValidateInput(false)]?当然,我希望我的验证代码在模型中,而不是在控制器中。

4

6 回答 6

0

我正在使用 xVal 和 nhibernate.validator 并且我试图重现这种行为,但是因为验证器与客户端绑定,所以我无法获得超过客户端验证的值。当我禁用 javascript 时,它进入服务器端验证,并被正则表达式验证器捕获。

我使用数据注释验证属性和模型绑定器尝试了同样的事情,它也成功了。

一定有其他原因导致错误。对不起,我不能更有帮助!

于 2009-07-30T13:39:02.553 回答
0

尝试使用此方法使用简单规则进行验证。这至少可以从方程中消除 xVal。如果问题仍然存在,那么我建议它与以下任何一个有关:

  • MVC 的默认 Model Binder 的实现
  • <或者您使用的版本中的 MVC 视图引擎存在问题,这以某种方式允许通过验证何时不应该对您指定的属性进行异常处理
于 2009-11-25T06:19:05.997 回答
0

如果它只是一个字段,您可以编写一个例程来查找字符“< 或 >”并将其删除。您可以通过使用子字符串来实现这一点。希望这会有所帮助

  • 使用 For 循环来测试要测试的文本长度 (for (int i=1, i <= text.length, ++))
  • 验证从 1 开始的每个字符(例如 ch = text.substring(i,1)
  • 将每个读取的字符添加到 tmp 字符串,除了 '< 或 >'
于 2010-11-20T19:28:33.907 回答
0

我想静态方法Escape()会为你解决这个问题。

  Regex r = new Regex(Regex.Escape(expression));
于 2010-11-23T13:28:36.440 回答
0

将此行放入 web.config

<httpRuntime requestValidationMode="2.0" />

这是 ASPNET 4.0 中的变化

于 2010-12-10T09:44:24.577 回答
0

不,这是 MVC 1 + xVal 中的一个问题。在 MVC 2 中,验证按预期工作(不再需要 xVal) – Alex42

看起来机器人继续将这个推到顶部。您能否将答案标记为已接受以便它知道?

于 2011-01-07T00:01:39.723 回答