对于字符串参数,我们必须在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);
}
答案 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 %>
之间的差异对于您的开发时间来说是微不足道的。