我有一个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" />
<% } %>
答案 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字符。