在ASP.NET中处理HttpRequestValidationException

在ASP.NET中处理HttpRequestValidationException,asp.net,cookies,xss,Asp.net,Cookies,Xss,我有一个问题,一些用户带着包含

我有一个问题,一些用户带着包含<或<字符的cookie(部分不在我的控制范围内)来到我的网站。这些被ASP.NET标记为危险。我想做的是能够捕获异常,检查我希望允许的某些已知情况,然后再次抛出异常。我不想以全局应用程序_错误结束,因为我希望请求继续进行,就好像在所选的“已知情况”中没有发生任何事情一样


我想我可以通过阅读我的Request.Cookies在应用程序_BeginRequest中实现这一点,然后捕获exeption。但事实证明,这还为时过早。此时可以毫无问题地读取cookies。Inspection(reflector)了解到只有在调用HttpRequest.ValidateInput()方法之后才会抛出验证异常。这将验证设置为“尖锐”,但我不清楚何时会发生这种情况。那么,何时/何地触发验证以防止以后冒泡?或者完全不同的方法?

您可以通过禁用web.config上的请求验证来禁用此类验证

<configuration>  
    <system.web>  
       <pages validateRequest="false" />  
    </system.web>
</configuration>

事实证明,我很难处理此异常。我还没有找到我的问题的真正答案,但我找到了一个可能也适用于其他人的解决方案,所以我将在这里记录它。 我的cookie中的可疑值实际上是由Google Analytics写入的,因此我无法阻止写入其中包含<的值。但是,无论如何,我并不真的需要服务器上的这些cookie。谷歌分析在客户端读取他们的内容。因此,我所做的是自己检查Cookies的内容,并通过将值设置为“”,在请求期间清除任何可疑内容。cookies保持原样,但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 = "";
        }
    }
}

private static Regex\u hasHtmlTag=new Regex(作为Teun D答案的变体,另一种选择是检查名称以“\u utm”开头的所有cookie(就像Google Analytics cookies一样),并以同样的方式清除其内容


这个解决方案可能会稍微更健壮一些,因为uuuutm…cookies可以包含来自外部链接和搜索引擎引用的各种垃圾;可能会包含除“.”以外的字符是的,很明显,我可以。但那会把孩子和洗澡水一起扔掉,不是吗?你害怕被黑客攻击吗?如果不害怕,那就禁用它。是的,我害怕被黑客攻击。通过谷歌搜索,我可以找到两个方法:发现应用程序错误(我同意你的说法——气味很难闻)。或者,禁用asp.net验证并验证每个用户输入是否存在潜在威胁。最后但并非最不重要的一点是,以下是一个商业产品的链接,该产品声称在逐个控制的基础上解决此问题:
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