我想通过编程保护我的ASP.Net 4.0网站免受有害的重复请求。如果我注意到来自IP的高请求号,那么我想阻止该IP一段时间(例如。如果有人写了一个FOR循环并一遍又一遍地请求网页)。我知道,最好的防御措施不是向未经身份验证的用户提供服务器数据,但不幸的是,一些公共页面是数据密集型的,对此我无能为力。
我今天看了一些解决办法,但没有一个让我满意。我猜想这是一个很常见的问题,我不想从头到尾实现这样的事情。
我看到了一个作为模块实现的解决方案,我想做同样的,但更好。我需要以下功能:
发布于 2017-06-19 16:01:02
解决上述问题的方法有两种:
对于第一种方法,
IIS的动态IP限制扩展为IT专业人员提供了一个可配置模块,该模块通过Brute-force帮助减轻或阻止拒绝服务攻击或密码破解,方法是临时阻止遵循可能有助于此类攻击的模式的HTTP客户端的Internet协议(IP)地址。可以将此模块配置为可以在Web Server或Web站点级别上进行分析和阻塞。
源:https://www.iis.net/downloads/microsoft/dynamic-ip-restrictions
对于第二种方法,
HackerSpray使用Redis来维护操作和源IP的高性能计数器。您可以调用Hacker.Defend( key,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>
https://stackoverflow.com/questions/9160404
复制相似问题