【问题标题】:When I submit HTML characters in my form, why does ASP.NET throw an internal server (500) error?当我在表单中提交 HTML 字符时,为什么 ASP.NET 会引发内部服务器 (500) 错误?
【发布时间】:2013-03-12 04:08:00
【问题描述】:

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

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

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

问题是,在我漫长的搜索中没有得到任何答案,该怎么做。 IE。当用户输入错误字符时,我的应用程序不应该只是抛出一个通用的内部服务器错误(如果他们正在绘制诸如

最好直接返回带有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

【问题讨论】:

  • 更新了我的问题以包含一些代码,用于上下文。

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


【解决方案1】:

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

【讨论】:

  • 是的,这行得通,但人们说你必须自己验证一切。如果唯一的选择是在任何地方使用 那么为什么 ASP.NET 首先验证任何东西?我的主要问题是为什么,解决这个问题的最佳(标准)方法是什么?
  • 我明白了。但是,您可能不应该到处使用 AllowHtml 属性。仅在可能包含 html 的属性中。好吧,如果您只想以不同的方式处理错误,您可以添加一个 HandleError 操作过滤器并将异常指定为 System.Web.HttpRequestValidationException。这应该让您自定义错误的处理方式。如果你想真正改变内部验证的方式,你可能需要扩展默认的模型绑定器。
【解决方案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 数据案例。

【讨论】:

  • 理想情况下,我想返回到同一个页面(表单),而不是一个完全不同的页面,其中包含通用的“检测到 HTML 字符”。这可能吗?
  • redirectMode="ResponseRewrite" 保持 URL 不变。如果用户在不发送错误数据的情况下提交,则会打开正确的页面
【解决方案3】:

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

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

【讨论】:

  • 是的,同意。我注意到一切都非常安全,那么为什么 ASP.NET 首先会抛出这个错误呢?试试这个:转到任何您能想到的 MVC Web 应用程序,转到一个表单(例如登录)并在字段中输入
    并提交。如果您收到错误,那么那些网络管理员也没有考虑到这一点:P
【解决方案4】:

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

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

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

【讨论】:

  • 理想情况下,我希望返回到同一页面(表单)并添加 ModelState.Error。但这意味着将 应用于每个字段,然后在每个字段上使用验证(即验证属性)。真令人头疼:(我想没有快速解决方法。
猜你喜欢
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2014-01-31
  • 2020-02-04
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多