每当用户在我的web应用程序中的页面中发布包含<或>的内容时,我都会引发此异常。

我不想因为有人在文本框中输入了字符而引发异常或使整个web应用程序崩溃,但我正在寻找一种优雅的方式来处理这一问题。

捕获异常并显示

出现错误,请返回并重新键入整个表单,但这次请不要使用<

我觉得不够专业。

禁用后验证(validateRequest=“false”)肯定可以避免此错误,但这会使页面容易受到许多攻击。

理想情况下:当发生包含HTML限制字符的回发时,表单集合中的回发值将自动进行HTML编码。因此,我的文本框的.Text属性将是&lt;html&gt;

有没有办法让我从处理者那里做到这一点?


当前回答

似乎还没有人提到下面的内容,但它为我解决了这个问题。。。讨厌。

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Example.aspx.vb" Inherits="Example.Example" **ValidateRequest="false"** %>

我不知道是否有什么缺点,但对我来说,这起到了惊人的作用。

其他回答

对于MVC,通过添加

[ValidateInput(false)]

在控制器中的每个动作之上。

请记住,某些.NET控件将自动对输出进行HTML编码。例如,在TextBox控件上设置.Text属性将自动对其进行编码。这特别意味着将<转换为&lt;,>进入&gt;和&进入&amp;。所以要小心这样做。。。

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

然而,HyperLink、Literal和Label的.Text属性不会对内容进行HTML编码,因此包装Server.HtmlEncode();如果要防止<script>window.location=“http://www.google.com“;</script>被输出到页面并随后执行。

做一点实验,看看哪些被编码,哪些没有编码。

对于那些仍然停留在webforms上的人,我发现了以下解决方案,使您只能在一个字段上禁用验证!(我不想在整个页面上禁用它。)

VB.NET:

Public Class UnvalidatedTextBox
    Inherits TextBox
    Protected Overrides Function LoadPostData(postDataKey As String, postCollection As NameValueCollection) As Boolean
        Return MyBase.LoadPostData(postDataKey, System.Web.HttpContext.Current.Request.Unvalidated.Form)
    End Function
End Class

C#:

public class UnvalidatedTextBox : TextBox
{
    protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
        return base.LoadPostData(postDataKey, System.Web.HttpContext.Current.Request.Unvalidated.Form);
    }
}

现在只需使用<prefix:UnvalidatedTextBox id=“test”runat=“server”/>而不是<asp:TextBox,它应该允许所有字符(这非常适合密码字段!)

即使在将<httpRuntime requestValidationMode=“2.0”>添加到web.config之后,我仍然在使用WIF进行身份验证的应用程序中收到错误。为我解决的是在<system.web>元素中添加<sessionState mode=“InProc”cookieless=“UseUri”/>。

您应该使用Server.HtmlEncode方法来保护您的站点免受危险输入。

此处有更多信息