首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >阻止DOS攻击的ASP.Net模块

阻止DOS攻击的ASP.Net模块
EN

Stack Overflow用户
提问于 2012-02-06 12:53:27
回答 1查看 2.8K关注 0票数 2

我想通过编程保护我的ASP.Net 4.0网站免受有害的重复请求。如果我注意到来自IP的高请求号,那么我想阻止该IP一段时间(例如。如果有人写了一个FOR循环并一遍又一遍地请求网页)。我知道,最好的防御措施不是向未经身份验证的用户提供服务器数据,但不幸的是,一些公共页面是数据密集型的,对此我无能为力。

我今天看了一些解决办法,但没有一个让我满意。我猜想这是一个很常见的问题,我不想从头到尾实现这样的事情。

我看到了一个作为模块实现的解决方案,我想做同样的,但更好。我需要以下功能:

  • 检测到非人类模式后阻止IP
  • 最好实现为HttpModule
  • 让爬虫通过
  • 块应在一定时间间隔后过期。
  • 轻量级:模块不应减慢网站速度或访问数据库。
EN

回答 1

Stack Overflow用户

发布于 2017-06-19 16:01:02

解决上述问题的方法有两种:

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

对于第一种方法,

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,它保护你的整个网站。

示例调用:

代码语言:javascript
运行
复制
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示例:

代码语言:javascript
运行
复制
[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保护哪些路径。

代码语言:javascript
运行
复制
<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中创建的所有键都以此为前缀。
  • 键-要保护的每个路径只有一个条目。
  • 名称-匹配的路径
  • 后-真=发,假=得到
  • maxAttempts -允许最大点击次数允许
  • 间隔-点击率多久?
  • 模式-如何计数命中并应用阻塞
    • 从所有的IP到这个键的点击率。对于ex,允许在10分钟内最多点击1000000次主页。
    • 每次访问--在检查此键的命中时,如果源IP在任何键上产生的总次数超过maxAttempts命中值,则阻塞。对于ex,允许每个IP有1000次点击,但在登录页面点击时执行此检查。
    • 按IP计算此密钥的计数命中。例如,登录页面上每个IP的点击量为1000次。

信用/资料来源https://github.com/oazabir/HackerSpray

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9160404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档