2012-02-06 56 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