MVC 5在验证html编码的已发布表单输入时遇到问题

时间:2015-06-02 23:04:03

标签: html asp.net-mvc-5

我有一个带有字符串属性的视图模型:

    [StringLength(10)]
    public string phone { get; set; }

在视图中:

@Html.EditorFor(x => x.phone)

如果我输入'+12'并提交,'phone'是html编码并且控制器获得 enter image description here ,所以我必须在保存到数据库之前解码:

HttpUtility.HtmlDecode(phone);

这是正常行为吗?

另一个问题是输入'+123456789'会导致字符串长度检查失败,因为它已被编码。

你会如何处理?

编辑:

我的控制器操作如下:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "phone")] MyViewModel vm)

EDIT2:

我使用的是自定义模板,默认情况下将清理模块添加到Application_Start()中的ModelBinders,这导致了问题。正如garryp指出的那样,一旦我摆脱了自定义绑定器并且控制器正在获取用户输入的精确字符串,框架就会处理它。我不确定编码/解码实际上是在输入的字符串上发生的..

1 个答案:

答案 0 :(得分:1)

HtmlDecode值不应该是必要的;框架应该解决这个问题。通常,您将未编码的值存储在数据库中,并仅在UI上对其进行编码(以防止XSS攻击等)。

我会检查以下内容:

  1. 您是否允许框架为您解析模型?即你的动作是否在签名中有模型,或者你使用的是Request.Form,还是一些类似的机制?
  2. 您是否对该值进行了两次编码?它在返回服务器时会被解码一次。
  3. 您如何将值传递回服务器?您是否在控制器Action中传递了大量字符串标志?