在ASP.NET中处理HttpRequestValidationException

时间:2009-12-18 15:17:55

标签: asp.net cookies xss

我遇到一些问题,其中一些用户使用包含<或者&人物(部分在我的控制之外)。这些被ASP.NET标记为Dangerous。我想要做的是能够捕获异常,检查我想要允许的某些众所周知的情况,然后再次抛出异常。我不希望最终出现在全局的Application_Error中,因为我希望请求继续进行,就好像所选的“已知案例”中没有任何事情发生一样。

我认为我可以通过在Application_BeginRequest中读取我的Request.Cookies来执行此操作,然后捕获该exeption。然而事实证明这太早了。目前可以毫无问题地阅读cookie。检查(反射器)获知仅在调用HttpRequest.ValidateInput()方法后抛出验证异常。这将验证设置为“锐利”,但在发生这种情况时我并不清楚。那么何时/何地触发验证以防止它在以后冒泡?或者也许是一些完全不同的方法?

3 个答案:

答案 0 :(得分:2)

作为Teun D答案的变体,另一种选择是检查名称以“__utm”开头的所有Cookie(如谷歌分析Cookie所做的那样)并以相同的方式清除其内容。

这个解决方案可能稍微强一些,因为__utm ... cookies可以包含来自外部链接和搜索引擎引用的各种垃圾;可能有“<”以外的字符在触发RequestValidation错误的值中。

为VB道歉,但我相信你们可以很容易地转换成适当的代码:)

Private regGACookie As New Regex("^__utm")
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    For Each strName As String In Request.Cookies
        If regGACookie.IsMatch(strName) Then
            ' Leave the cookie alone, but remove from the request'
            Request.Cookies(strName).Value = ""
        End If
    Next
End Sub

答案 1 :(得分:1)

事实证明我很难处理这个异常。我没有找到我的问题的真实答案,但我找到了一个可能适用于其他的解决办法,所以我将在此处记录。 我的Cookie中的可疑值实际上是由Google Analytics编写的,因此我无法使用<在它写。但是,我真的不需要在服务器上使用这些cookie。 Google Analytics会在客户端上读取其内容。所以我做的是检查cookiesmyself的内容,并通过将值设置为“”来清除任何可疑内容在请求期间。 Cookie保持不变,但Request.Cookies集合中的内容已消失。

对我来说已经足够了。

private static Regex _hasHtmlTag = new Regex("<\\w"); // matches an < with a letter or number after it
protected void Application_BeginRequest(object sender, EventArgs e)
{
    foreach (string name in Request.Cookies)
    {
        string cookieValue = Request.Cookies[name].Value;
        if (_hasHtmlTag.IsMatch(cookieValue))
        {
            // Leave the cookie alone, but remove from the request
            Request.Cookies[name].Value = "";
        }
    }
}

答案 2 :(得分:0)

您可以通过在web.config

上禁用请求验证来禁用此类验证
<configuration>  
    <system.web>  
       <pages validateRequest="false" />  
    </system.web>
</configuration>