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

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

捕获异常并显示

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

我觉得不够专业。

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

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

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


当前回答

您可以对文本框内容进行HTML编码,但不幸的是,这并不能阻止异常的发生。根据我的经验,没有办法,您必须禁用页面验证。你这样做是在说:“我会小心的,我保证。”

其他回答

正如我对Sel回答的评论所指出的,这是我们对自定义请求验证器的扩展。

public class SkippableRequestValidator : RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        if (collectionKey != null && collectionKey.EndsWith("_NoValidation"))
        {
            validationFailureIndex = 0;
            return true;
        }

        return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
    }
}

如果不想禁用ValidateRequest,则需要实现JavaScript函数以避免异常。这不是最好的选择,但它有效。

function AlphanumericValidation(evt)
{
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode :
        ((evt.which) ? evt.which : 0));

    // User type Enter key
    if (charCode == 13)
    {
        // Do something, set controls focus or do anything
        return false;
    }

    // User can not type non alphanumeric characters
    if ( (charCode <  48)                     ||
         (charCode > 122)                     ||
         ((charCode > 57) && (charCode < 65)) ||
         ((charCode > 90) && (charCode < 97))
       )
    {
        // Show a message or do something
        return false;
    }
}

然后在后面的代码中,在PageLoad事件中,使用下一个代码将属性添加到控件中:

Me.TextBox1.Attributes.Add("OnKeyPress", "return AlphanumericValidation(event);")

只要这些字符只是“<”和“>”(而不是双引号本身),并且您在上下文中使用它们,例如<input value=“this”/>,您就安全了(而对于<textarea>这一个</textarea>,您当然会受到攻击)。这可能会简化您的情况,但要做更多的事情,请使用其他发布的解决方案之一。

尝试使用

服务器编码

and

Server.Html解码同时发送和接收。

如果您使用的是.NET 4.0,请确保将其添加到<system.web>标记内的web.config文件中:

<httpRuntime requestValidationMode="2.0" />

在.NET 2.0中,请求验证仅适用于aspx请求。在.NET 4.0中,它被扩展为包括所有请求。通过指定以下内容,可以恢复为仅在处理.aspx时执行XSS验证:

requestValidationMode="2.0"

您可以通过指定以下内容完全禁用请求验证:

validateRequest="false"