2012-02-06 54 views
1

我想以编程方式保护我的ASP.Net 4.0网站免受有害的重复请求。如果我注意到来自IP的高请求号码,那么我想阻止该IP一段时间(例如,如果有人写FOR循环并反复请求网页)。我知道最好的防御措施并不是将数据传输给未经验证的用户,但不幸的是,某些公共页面数据量很大,我无能为力。ASP.Net模块阻止DOS攻击

我今天看了一些解决方案,但没有人满意我。我猜测这是一个非常普遍的问题,我不想从头开始实施这样的事情。

我看到一个solution implemented as a module,我想这样做,但更好。我需要下列功能:

  • 块IP中检测非人类图案
  • 优选作为HTTP模块实现后
  • 通过
  • 块允许履带一定间隔
  • 轻型后应到期:模块不应该减慢网站或访问数据库
+0

所以,你知道你赢了什么,为什么没有取得它,并张贴在这里?抓取工具很容易修复,但是很容易被黑客模拟,expire需要一个计时器,非人类模式与后期处理有关,而HttpModule只是简单的代码... – Aristos 2012-02-06 13:18:47

+0

对于我来说,DOS攻击必须是与非人类模式检查分开的代码。一个是攻击让你失望,另一个是攻击,使你的垃圾数据充满你的页面,或者获得控制权。与登录页面相比,您需要不同的容忍度,而不是输入评论。 – Aristos 2012-02-06 13:22:38

回答

1

有两种方法可用于上述p roblem:

  1. 使用IIS动态IP限制模块
  2. 在Github上

对于第一个方法使用HackerSpray图书馆,

动态IP限制扩展为IIS提供IT专业人员和主机托管服务提供商一个可配置的模块,通过临时阻止HTTP cli的Internet协议(IP)地址,帮助缓解或阻止拒绝服务攻击或通过暴力破解密码谁会遵循一种可能有助于这种攻击的模式。可以对此模块进行配置,以便可以在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,你需要指定要保护哪些路径使用HTTP模块。

<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服务器。
  • 前缀 - 在redis中创建的所有密钥均以此为前缀。
  • 键 - 要保护
  • 名每路一个条目 - 要匹配
  • 后的道路 - 真正= POST,假= GET
  • maxAttempts - 命中的最大数目,让
  • 间隔 - 打多久?
  • 模式 - 如何计算命中和应用阻挡
    • perkey - 计数值由全IP的这个关键命中。例如,在10分钟内允许主页最多1000000次点击。
    • perorigin - 在检查对这个键的命中时,如果原始IP在任何键上产生了超过maxAttempts命中总数,则阻塞。例如,允许每个IP有1000次点击,任意键,但是请在登录页面点击时进行检查。
    • perkeyorigin - 按IP计数到此密钥。例如,每个IP在登录页面上点击1000次。

积分/来源https://github.com/oazabir/HackerSpray