C# 如何防止ASP.NET事件的HTTP GET?或者如何检查请求。键入所有事件?
在fiddler的帮助下,我使用以下HTTP GET请求进行了“重播攻击” ?\uuuu EVENTTARGET=LinkButton1&uuu EVENTARGUMENT=&uuu视图状态=%2snipg%3D%3D&\uu EVENTVALIDATION=%2snip 令我惊讶的是,只要存在有效的viewstate和事件验证,它就可以工作。以下停止获取我的单击事件,但是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) {
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
属性(在每个请求上)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
}
}