在 fiddler 的帮助下,我使用以下 HTTP GET 请求进行了“重放攻击”
http://svr/Default.aspx?__EVENTTARGET=LinkButton1&__EVENTARGUMENT=&__VIEWSTATE=%2snipg%3D%3D&__EVENTVALIDATION=%2snip
令我惊讶的是,只要存在有效的视图状态和事件验证,它就可以工作。 以下停止了我的点击事件的 GET,但是...
protected void BtnUploadClick(object sender, EventArgs e)
{
if(Request.RequestType == "GET") throw new HttpException(405, "GET not allowed for this.");
}
我的代码上有all的事件。有没有办法全局将此行为添加到通常是回发事件的事件中?
你可以的。附加到应用程序的 PreRequestHandlerExecute 事件。可以单独进行
HttpModule
或在 Global.asax
中进行。
在事件处理程序中,您可以检查:
_EVENTTARGET_
、 _VIEWSTATE_
不属于 Request.QueryString
属性(根据每个请求)Request.Form
是否为空。因为 asp.net 仅在 POST 操作上发布表单。实现示例(方法名称是用于 Global.asax 的方法名称,对于 httpmodule 可以随意修改):
public void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
// The code below is intended to block incoming HTTP GET requests which contains in query string parameters intended to be used in webform POST
if (Request.HttpMethod != "GET")
{
return; // Nothing to do
}
var hasPostParams = (Request.QueryString["__EVENTTARGET"] ??
Request.QueryString["__VIEWSTATE"] ??
Request.QueryString["__EVENTARGUMENT"] ??
Request.QueryString["__EVENTVALIDATION"]) != null;
if (hasPostParams)
{
// TODO : log error (I suggest to also log HttpContext.Current.Request.RawUrl) and throw new exception
}
}
假设您不想在某些页面类型上处理此特定应用程序的 GET,您可以使用 IIS 对应用程序中的各种页面禁用 GET。 在站点或应用程序的“属性”窗格下,单击“主目录”,然后单击“配置”(假设已配置应用程序),然后单击 ASPX 或其他扩展,您可以限制该扩展使用的动词。