MVC看到导致异常的输入

时间:2014-08-20 20:06:29

标签: c# asp.net-mvc asp.net-mvc-4

有时我们会得到一些机器人喜欢向我们的网站发布不良信息(他们正在尝试某种反射攻击),但幸运的是,通过MVC获得的默认输入验证来停止尝试。

这很好,但现在我们想看看机器人实际发送了什么,我们想记录这些信息。可悲的是,当一个人得到HttpRequestValidationException时,违规输入被截断到无用的点;

A potentially dangerous.... (field = <a href=.....)

我正在尝试使用动作过滤器来检测这些异常,然后创建所有违规输入的日志,以便我们可以看到他们要发送的内容。

public void OnException(ExceptionContext filterContext)
{

    HttpRequestValidationException hex = filterContext.Exception as HttpRequestValidationException;
    if (hex == null) { return; }

    // Get the data.  This will explode throwing the same exception (`HttpRequestValidationException).  Isn't there a way that we can get our hands on the information?

    string data = filterContext.HttpContext.Request.Form["field"];

....

这让我感到奇怪和讨厌,因为我现在似乎无法找出攻击者真正想要的东西。是否有某些方法可以从表单数据中获取信息而不会出现异常?

3 个答案:

答案 0 :(得分:5)

是的,你可以。使用HttpRequest.SaveAs将整个(缓冲的)HTTP请求保存到磁盘,然后您可以回读。

答案 1 :(得分:0)

这是我想出的最终解决方案。像魅力一样工作,不需要文件系统交互。

   // Grab the contents of the request.
   Stream s = filterContext.RequestContext.HttpContext.Request.InputStream;
   byte[] data = new byte[s.Length];
   s.Read(data, 0, (int)s.Length);
   string rawData = Encoding.UTF8.GetString(data);

   // And process it into something nice and readable.
   IEnumerable<string> fields = (from x in rawData.Split('&') select  HttpUtility.UrlDecode(x));
   string formatted = string.Join(Environment.NewLine, fields);

答案 2 :(得分:-1)

问题是实际调用Request.Form会使验证失败(再次)。我会直接使用Request.InputStream。您可能必须在再次阅读之前回滚流:

Request.InputStream.Position = 0