用于ASP.Net MVC 3 Html.TextAreaFor的帖子上的HtmlEncode

时间:2012-01-10 19:00:05

标签: asp.net-mvc html-encode

我有一个ASP.Net MVC 3页面,其中有一个Html.TextAreaFor控件,请参阅下面的代码。如果我尝试将页面提交到http帖子操作,其中包含尖括号中的文字,例如:<test>,我会看到一个黄色错误屏幕:

  

从中检测到一个潜在危险的Request.Form值   客户端(RequestText =“”)。

我不明白为什么我这样做是因为我发现an article by Scott Guthrie表示.Net 4中新的<%: %>语法,会自动对该元素进行HtmlEncode。因为我正在使用&lt;%:%&gt; Html.TextAreaFor控件的语法,我认为它会自动处理这个并将尖括号转换为正确的“&amp; lt”;和“&amp; gt”字符串。

<% using (Html.BeginForm())
   { %>
    <%: Html.ValidationSummary() %>
    <h2>Enter a description of the support needed</h2>
    <%: Html.TextAreaFor( m => m.RequestText, 4, 90, null) %>
    <input type="submit" value="Submit" />
<% } %>

2 个答案:

答案 0 :(得分:20)

目前,您正在对输出上的TextAreaFor内容进行编码。由于您尝试处理输入

,这对您没有任何帮助

如果您想提交“有潜在危险”的内容,则需要

1)使用RequestText装饰ViewModel中的[AllowHtml]属性。 (优选的)

[AllowHtml]
public string RequestText { get; set; }

2)禁用validateRequest

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

然后必须确保您在将数据提交到存储库层或数据库之前,正确地对控制器中的数据进行消毒和/或对其进行编码。

答案 1 :(得分:6)

您可以使用AllowHtmlAttribute在视图模型上装饰RequestText属性:

[AllowHtml]
public string RequestText { get; set; }

这样您就可以授权客户端仅为此属性提交HTML。

<%: %>语法而言,这用于在将某些值输出到页面之前对其进行HTML编码。它用于防止XSS攻击。这与您的情况无关,因为您没有输出到页面,而是在请求中接收HTML字符。