Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止ASP.NET事件的HTTP GET?或者如何检查请求。键入所有事件?_C#_Asp.net - Fatal编程技术网

C# 如何防止ASP.NET事件的HTTP GET?或者如何检查请求。键入所有事件?

C# 如何防止ASP.NET事件的HTTP GET?或者如何检查请求。键入所有事件?,c#,asp.net,C#,Asp.net,在fiddler的帮助下,我使用以下HTTP GET请求进行了“重播攻击” ?\uuuu EVENTTARGET=LinkButton1&uuu EVENTARGUMENT=&uuu视图状态=%2snipg%3D%3D&\uu EVENTVALIDATION=%2snip 令我惊讶的是,只要存在有效的viewstate和事件验证,它就可以工作。以下停止获取我的单击事件,但是 protected void BtnUploadClick(object sender, EventArgs e) {

在fiddler的帮助下,我使用以下HTTP GET请求进行了“重播攻击”

\uuuu EVENTTARGET=LinkButton1&uuu EVENTARGUMENT=&uuu视图状态=%2snipg%3D%3D&\uu EVENTVALIDATION=%2snip

令我惊讶的是,只要存在有效的viewstate和事件验证,它就可以工作。以下停止获取我的单击事件,但是

protected void BtnUploadClick(object sender, EventArgs e)
{
   if(Request.RequestType == "GET") throw new HttpException(405, "GET not allowed for this.");
}

我的代码中到处都是事件。是否有方法将此行为全局添加到通常为回发事件的事件中?

您可以选择“是”。附加到应用程序的事件。作为单独的
HttpModule
或在
Global.asax
中执行

在事件hadler中,您可以检查:

  • \u EVENTTARGET\u
    \u VIEWSTATE\u
    不是
    请求的一部分。QueryString
    属性(在每个请求上)
  • 在GET上,您可以检查
    Request.Form
    是否为空。因为asp.net仅在POST操作上发布表单

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

    接受的答案很好地解决了我的问题。
    由于它只包含一些建议,我想用一个实现示例发布我自己的答案,希望它对某些人有所帮助(方法名称是Global.asax使用的名称,对于httpmodule,请随意调整):


    那么您将如何加载第一页?浏览器通过GET完成主页请求。主页至少必须位于不同的虚拟目录中,帖子将跨虚拟目录,所有链接都必须转换为重定向等。我还没有尝试过,但我不确定它是否有效。这一点很好!他可以为特定页面创建一个自定义扩展名,但使用选择的答案显然更方便。谢谢你对我唠叨不休,马特-( ;)
        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
            }
        }