С помощью скрипача я сделал эту "повторную атаку" со следующим 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.");
}
У меня есть события по всему моему коду. Есть ли способ глобально добавить это поведение к событиям, которые обычно являются событиями обратной передачи?
Вы можете согласиться. Присоединитесь к приложению PreRequestHandlerExecute. Сделайте это либо как отдельный HttpModule
, либо в Global.asax
.
В случае hadler вы можете либо проверить:
_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 для этого конкретного приложения на определенных типах страниц, вы можете отключить GET для разных страниц вашего приложения с помощью IIS. В области "Свойства" для сайта или приложения нажмите "Домашний каталог", а затем "Конфигурация" (при условии, что приложение настроено), затем нажмите на ASPX или другое расширение, и вы можете ограничить глаголы, используемые для этого расширения.