如何阻止 ASP.NET 事件的 HTTP GET?或者如何检查所有事件的 Request.Type?

问题描述 投票:0回答:3

在 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的事件。有没有办法全局将此行为添加到通常是回发事件的事件中?

c# asp.net
3个回答
6
投票

你可以的。附加到应用程序的 PreRequestHandlerExecute 事件。可以单独进行

HttpModule
或在
Global.asax
中进行。

在事件处理程序中,您可以检查:

  1. _EVENTTARGET_
    _VIEWSTATE_
    不属于
    Request.QueryString
    属性(根据每个请求)
  2. 在 GET 上,您可以检查
    Request.Form
    是否为空。因为 asp.net 仅在 POST 操作上发布表单。

1
投票

实现示例(方法名称是用于 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
    }
}

0
投票

假设您不想在某些页面类型上处理此特定应用程序的 GET,您可以使用 IIS 对应用程序中的各种页面禁用 GET。 在站点或应用程序的“属性”窗格下,单击“主目录”,然后单击“配置”(假设已配置应用程序),然后单击 ASPX 或其他扩展,您可以限制该扩展使用的动词。

© www.soinside.com 2019 - 2024. All rights reserved.