有时我们会得到一些机器人喜欢向我们的网站发布不良信息(他们正在尝试某种反射攻击),但幸运的是,通过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"];
....
这让我感到奇怪和讨厌,因为我现在似乎无法找出攻击者真正想要的东西。是否有某些方法可以从表单数据中获取信息而不会出现异常?
答案 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