我遇到一些问题,其中一些用户使用包含<或者&人物(部分在我的控制之外)。这些被ASP.NET标记为Dangerous。我想要做的是能够捕获异常,检查我想要允许的某些众所周知的情况,然后再次抛出异常。我不希望最终出现在全局的Application_Error中,因为我希望请求继续进行,就好像所选的“已知案例”中没有任何事情发生一样。
我认为我可以通过在Application_BeginRequest中读取我的Request.Cookies来执行此操作,然后捕获该exeption。然而事实证明这太早了。目前可以毫无问题地阅读cookie。检查(反射器)获知仅在调用HttpRequest.ValidateInput()方法后抛出验证异常。这将验证设置为“锐利”,但在发生这种情况时我并不清楚。那么何时/何地触发验证以防止它在以后冒泡?或者也许是一些完全不同的方法?
答案 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>