Как предотвратить HTTP GET для событий ASP.NET? или Как проверить Request.Type на все события?

2

С помощью скрипача я сделал эту "повторную атаку" со следующим 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.");
}

У меня есть события по всему моему коду. Есть ли способ глобально добавить это поведение к событиям, которые обычно являются событиями обратной передачи?

Теги:

3 ответа

5
Лучший ответ

Вы можете согласиться. Присоединитесь к приложению PreRequestHandlerExecute. Сделайте это либо как отдельный HttpModule, либо в Global.asax.

В случае hadler вы можете либо проверить:

  • _EVENTTARGET_, _VIEWSTATE_ не являются частью свойства Request.QueryString (по каждому запросу)
  • в GET вы можете проверить, что Request.Form пуст. Поскольку asp.net только отправляет форму на действия POST.
  • 0
    Отличные предложения! - +1
  • 0
    Реализована! Я хотел бы проголосовать дважды.
Показать ещё 1 комментарий
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 для этого конкретного приложения на определенных типах страниц, вы можете отключить GET для разных страниц вашего приложения с помощью IIS. В области "Свойства" для сайта или приложения нажмите "Домашний каталог", а затем "Конфигурация" (при условии, что приложение настроено), затем нажмите на ASPX или другое расширение, и вы можете ограничить глаголы, используемые для этого расширения.

  • 0
    Тогда как бы вы загрузили первую страницу? Браузеры делают запрос домашней страницы с GET. Домашняя страница, по крайней мере, должна была бы находиться в другом виртуальном каталоге, публикация была бы кросс-виртуальным каталогом, все ссылки должны были бы быть преобразованы в перенаправления и т. Д. Я не пробовал это, но я не уверен, что это будет работать ,
  • 0
    Хорошая точка зрения! Он может создать собственное расширение для конкретной страницы, но, очевидно, удобнее использовать выбранный ответ. Спасибо за то, что на меня нападают, Мэтт. :-(;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню