当我在表单中提交HTML字符时,为什么ASP.NET会抛出内部服务器(500)错误?

时间:2013-03-12 04:08:00

标签: asp.net asp.net-mvc validation vb.net character-encoding

当我在表单中输入HTML字符时,例如<br />,ASP.NET会引发内部500异常,如here所述。

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

好的,这样可以保护我免受可能因恶意原因使用的未编码字符的伤害。

问题是,在我长时间的搜索中无处可回答,该怎么办呢。即我的应用程序不应该只是在用户输入错误字符时抛出通用内部服务器错误(如果他们正在绘制诸如&lt; - 的箭头,那该怎么办。)

最好只返回带有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 个答案:

答案 0 :(得分:3)

您是否尝试将AllowHtml属性添加到viewmodel的属性?

答案 1 :(得分:2)

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

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

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

Displaying a Custom Error Page

在您的错误页面上,您可以使用Server.GetLastError()检测上一个错误并使用它显示相应的消息,如果您希望以不同方式处理此html数据的情况。

答案 2 :(得分:1)

听起来你想要的是全局关闭它。

您需要验证应用程序中每个输入的问题都不像以前那样使用razor和&lt;%:%&gt; asp.net网页语法自动HTML编码输出。您需要手动验证以确保它们不包含HTML的应用程序的唯一字段将是显示为未编码原始文本的字段。

答案 3 :(得分:0)

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

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

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