5

当我在我的表单中输入 HTML 字符时<br />,ASP.NET 会抛出一个内部 500 异常,如此所述。

A potentially dangerous Request.Form value was detected from the client (Name="<br />").

好的,所以它保护我免受可能用于恶意原因的未编码字符。

问题是,这在我漫长的搜索中没有得到回答,是如何处理它。即我的应用程序不应该只是在用户输入错误字符时抛出一个通用的内部服务器错误(如果他们正在绘制诸如 <-- 之类的箭头怎么办)。

更好的是简单地返回页面并ModelState显示“请不要使用 HTML 字符”或其他有意义的错误。

但是如何实现呢?错误在到达我的代码之前就被抛出了。此外,我不想只是通过关闭它validateRequest="false",然后必须验证我的应用程序中的每个表单是否有 HTML 字符并返回错误。

有没有办法启用这种类型的验证,但只是以不同的方式处理它?

澄清代码:

Model

Public Class SomeModel
    Public Property SomeField As String
End Class

Controller

<HttpPost>
Function SomeController(ByVal model As SomeModel)
    ' model.SomeField contains some HTML characters :O
    ' but it doesn't matter, since an internal error has occured :(
End Function
4

4 回答 4

3

您是否尝试将AllowHtml属性添加到视图模型的属性中?

于 2013-03-12T05:03:01.283 回答
2

绝对可以使用您认为合适的任何消息显示您自己的错误页面。
为此,您使用 customError 页面。

您可以配置这些错误页面以显示相应的错误代码。

<configuration>
   <system.web>
      <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" 
                    defaultRedirect="GenericError.htm">
         <error statusCode="500" redirect="InternalError.aspx"/>
      </customErrors>
   </system.web>
</configuration>

显示自定义错误页面

如果您希望以不同方式处理这种 html 数据案例,您可以在错误页面上检测最后一个错误Server.GetLastError()并使用它显示适当的消息。

于 2013-03-12T05:19:50.860 回答
1

听起来您想要的是在全球范围内关闭它。

与使用 razor 和 <%: %> asp.net 网页语法自动 HTML 编码输出相比,您对必须验证应用程序中的每个输入的担忧已不再是问题。您需要手动验证以确保它们不包含 HTML 的应用程序的唯一字段是显示为未编码的原始文本的字段。

于 2013-03-12T20:01:37.243 回答
0

要在模型中允许受限输入,请使用模型属性上的 AllowHtmlAttribute。这是第一步。

然后创建自定义验证器或使用 RegularExpressionAttribute 验证规范的输入。

或者,如果要允许用户输入受限字符,请使用 HttpUtility.HtmlEncode 对值进行编码。

于 2013-03-12T05:23:55.853 回答