Существует 2 подхода для решения вышеуказанной проблемы:
- Использование модуля IIS Dynamic IP Restrictions
- Использование библиотеки HackerSpray на Github
Для 1-го захода
Расширение динамических IP-ограничений для IIS предоставляет ИТ-специалистам и хостерам настраиваемый модуль, который помогает смягчать или блокировать атаки типа «отказ в обслуживании» или взлом паролей с помощью перебора, временно блокируя адреса интернет-протокола (IP) HTTP-клиентов, которые следуют за шаблон, который может способствовать одной из таких атак. Этот модуль можно настроить таким образом, чтобы анализ и блокировка выполнялись на уровне веб-сервера или веб-сайта.
источник : https://www.iis.net/downloads/microsoft/dynamic-ip-restrictions:
для 2-го подхода,
HackerSpray использует Redis для поддержки высокопроизводительных счетчиков для действий и исходных IP-адресов. Вы вызываете Hacker.Defend (ключ, ip), чтобы проверить, не совершил ли определенный ключ или IP слишком много попаданий. Вы можете поддерживать черные списки для ключа, IP или IP диапазона. HackerSpray проверяет слишком много попаданий на ключ, слишком много попаданий на IP или IP, попадающий в черные списки. Это также позволяет занести в черный список определенный ключ для определенного IP-адреса или заблокировать определенный ключ для всех IP-адресов на лету. Удобно, когда вы хотите заблокировать пользователя по определенным URL-адресам.
Он поставляется с HttpModule, который защищает весь ваш сайт.
Пример звонков:
var result = await Hacker.DefendAsync("/Account/LogOn", Request.UserHostAddress);
if (result == Hacker.Result.TooManyHitsFromOrigin)
await Hacker.BlacklistOriginAsync(Request.UserHostAddress, TimeSpan.FromMinutes(10));
else if (result == Hacker.Result.TooManyHitsOnKey)
await Hacker.BlacklistKeyAsync("/Account/LogOn", TimeSpan.FromMinutes(10));
Hacker.DefendAsync("/Account/PasswordReset", Request.UserHostAddress, TimeSpan.FromMinutes(5), 100);
Hacker.DefendAsync("Username" + username, Request.UserHostAddress);
Hacker.DefendAsync("Comment", Request.UserHostAddress);
LoginController Пример:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
return await Hacker.DefendAsync<ActionResult>(async (success, fail) =>
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return await success(RedirectToLocal(returnUrl));
case SignInStatus.LockedOut:
return await fail(View("Lockout"));
case SignInStatus.RequiresVerification:
return await success(RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }));
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return await fail(View(model));
}
},
blocked => new HttpStatusCodeResult(HttpStatusCode.Forbidden),
"ValidLogin:" + model.Email, 3, TimeSpan.FromMinutes(5),
"InvalidLogin:" + model.Email, 4, TimeSpan.FromMinutes(5),
Request.GetClientIp()
); }
В файле web.config вам необходимо указать, какие пути нужно защищать с помощью HttpModule.
<HackerSprayConfig redis="localhost" prefix="AuthTest:">
<keys>
<add name="/Account/LogOn/" post="true" maxAttempts="100" interval="00:10:00" mode="perkeyperorigin" />
<add name="/Home/" post="false" maxAttempts="10000" interval="00:01:00" mode="perorigin" />
<add name="/" post="false" maxAttempts="10000" interval="00:01:00" mode="perorigin" />
</keys> </HackerSprayConfig>
- redis - это строка подключения к серверу Redis.
- prefix - префикс всех ключей, созданных в Redis.
- ключей - одна запись для каждого пути, который вы хотите защитить
- name - путь к совпадению
- post - true = POST, false = GET
- maxAttempts - максимальное количество разрешенных хитов
- интервал - хиты как долго?
- - Как считать хиты и применять блокировку
- perkey - подсчитывать попадания со всех IP-адресов на этот ключ. Например, разрешить максимум 1000000 обращений к домашней странице за 10 минут.
- perorigin - при проверке совпадений с этим ключом, если исходный IP-адрес сгенерировал больше, чем максимальное количество нажатий maxAttempts по любому ключу, блокируйте. Например, разрешите 1000 обращений на каждый IP-адрес к любому ключу, но сделайте эту проверку при попадании на страницу входа.
- perkeyorigin - Количество обращений к этому ключу для каждого IP. Например, 1000 посещений на IP на странице входа в систему.
Кредиты / Источник : https://github.com/oazabir/HackerSpray