我们应该清理传递给action方法的非字符串参数吗?

时间:2011-01-24 06:33:48

标签: asp.net-mvc

对于字符串参数,我们必须在action方法中对它们进行清理,如下所示:

public ActionResult Browse(string genre)
{
        string message = HttpUtility.HtmlEncode(genre);

        return View(message);
}

是否有必要按如下方式消毒非字符串参数?

    public ActionResult Details(int id)
    {
        int data = int.Parse(HttpUtility.HtmlEncode(id));
        return View(data);
    }

3 个答案:

答案 0 :(得分:5)

就个人而言,我建议在视图中清理这些输入。如果您使用的是WebForms视图引擎,则可以使用<%: ... %>执行此操作,或者如果您使用的是Razor,则可以使用@运算符。这也使得数据流通过系统视图独立,因此您可以更轻松地共享数据和模型。

例如,在将数据存储到数据库之前对HTML编码数据使得很难在将来某个日期创建将数据作为CSV文件输出的视图。如果视图负责执行此操作,则视图可以根据自己的应用选择CSV编码或HTML编码。

答案 1 :(得分:3)

  

对于字符串参数,我们必须在action方法中对它们进行清理,如下所示:

     

public ActionResult Browse(string genre){

string message = HttpUtility.HtmlEncode(genre);

return View(message); 
     

}

你不应该在控制器动作中做这样的事情。如果您打算将此字符串存储到数据库中,请继续并按原样存储它。数据库并不关心未编码的HTML。当然,在将视频输出到您的视图时,您需要确保它已正确编码:

<%= Html.Encode(message) %> // WebForms ASP.NET 2.0
<%: message %> // WebForms ASP.NET 4.0
@message // Razor ASP.NET 4.0

答案 2 :(得分:2)

如果您正在使用MVC,则无理由将HtmlEncode的数据发送到视图。这样做的原因是因为你可以在视图中更容易地做到这一点。

<!-- WEB FORMS VIEW ENGINE -->
<!-- This is already encoded -->
<%: Model.genre %>

<!-- This is NOT encoded -->
<%= Model.genre %>



<!-- RAZOR  VIEW ENGINE -->
<!-- This is already encoded -->
@Model.genre

<!-- This is NOT encoded -->
@MvcHtmlString.Create(Model.genre)

至于消毒,这是一个不同的蜡球。杰夫阿特伍德有一些代码here并谈论它here。请记住,您可以在数据库中存储任何用户输入,这是需要清理AND html编码的输出。

至于编码非字符串参数。这通常没有必要,但<%: Model.genre %><%= Model.genre %>之间的差异对于您的开发时间来说是微不足道的。