Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

C# Защита сайта от DOS-атак в ASP.NET

Статус
В этой теме нельзя размещать новые ответы.

Mathian

Мастер
Всем Хай!​
Веб-сайты являются привлекательной мишенью для хакеров. Даже школьник может большим количеством запросов уронить сайт на котором выполняются скрипты, создающие ощутимую нагрузку на серверную операционную систему, например тем-же LOIC'ом. Чтобы самостоятельно устроить такую атаку, достаточно запустить элементарный код:
PHP:
for( int i = 0; i < 1000000; i ++ )
{
   WebClient client = new WebClient();
   client.DownloadString("Ссылка");
}
Уже после нескольких запросов вы можете обнаружить, что в ответ от сервера приходит страница с ошибкой. Однако это совсем не значит, что сервер уже упал. Просто сайт отверг ваши последние запросы.

Самым простым способом защиты от подобного флуда является подсчёт количества запросов с определённого IP адреса и запоминание этого значения в кэше "ASP.NET". А когда количество запросов превысит допустимый лимит, то отвергать запросы с этого IP адреса на определённый промежуток времени, а потом начать обрабатывать поступающие запросы.

Ниже приведён пример класса ActionValidator, который позволяет запоминать такие параметры посетителя как первый визит, последующий визит, асинхронные Postback'и, создание новой страницы и т.д.

PHP:
public static class ActionValidator
{
     private const int DURATION = 10;//Время, которое будем отвергать запросы. 
     public enum ActionTypeEnum
     {
         FirstVisit = 100,//1ый визит
         ReVisit = 1000,  //Последующий визит
         Postback = 5000,   //Асинхронные Postback'и
         AddNewWidget = 100, //Виджеты
         AddNewPage = 100,//Сьраницы
     }
Далее рассмотрим статический метод IsValid, который проверяет не достигнуто ли предельное значение по каждому типу запроса. Метод возвращает true, если лимит по запросу не достигнут и false, если запрос пользователя можно отклонить. Если IsValid вернул false, то можно просто вызвать Request.End(), тем самым защитив ASP.NET от дальнейшей загрузки.

PHP:
public static bool IsValid( ActionTypeEnum actionType )
{
   HttpContext context = HttpContext.Current;
   if( context.Request.Browser.Crawler ) return false;
   
   string key = actionType.ToString() + context.Request.UserHostAddress;
   var hit = (HitInfo)(context.Cache[key] ?? new HitInfo());
     
   if( hit.Hits > (int)actionType ) return false;
   else hit.Hits ++;
    
   if( hit.Hits == 1 ) context.Cache.Add(key, hit, null, DateTime.Now.AddMinutes(DURATION), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
   return true;
}
Теперь, сначала идёт проверка, есть ли в кэше точно такие же пары "типа действия" и IP адрес клиента. Если нет, то пара добавляется в кэш и начинается отсчёт срока. Обновление счётчика происходит автоматически.
Использовать этот класс можно прям на default.aspx:
PHP:
protected override void OnInit(EventArgs e)
{
   base.OnInit(e);
   if( !base.IsPostBack ) 
   {
      if( Profile.IsFirstVisit )
      {
         if( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.FirstVisit))  Response.End();
      }
      else
      {
         if( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.ReVisit) )  Response.End();
      }
   }
   else
   {
      if( !ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Postback) ) Response.End();
   }
}
В этом примере проверяются первый визит, повторный визит, асинхронные Postback'и, создание новой страницы и т.д.

Защиту от DoS атак можно переложить на плечи Брандмауэров, например: Cisco.

Не многие сайты применяют подобные меры защиты своих приложений, поэтому если вам,
то можете попробовать поиздеваться над каким-нибудь сайтом, например с помощью того-же LOIC'а

Удачи Дорогие пользователи Pawno-Info.Ru xD
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу