CGC_Codes

Hs def.

Jun 8th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.96 KB | None | 0 0
  1. using HackerSpray.Logger;
  2. using Microsoft.Extensions.Logging;
  3. using System;
  4. using System.Diagnostics;
  5. using System.Net;
  6. using System.Threading.Tasks;
  7.  
  8. namespace HackerSpray.Module
  9. {
  10.     public class HackerSpray
  11.     {
  12.         private const string DEFEND_FUNC_NAME = "Defend";
  13.  
  14.         public static IDefenceStore Store;
  15.         public static ILogger Logger;
  16.         public static DefenceConfig Config = new DefenceConfig
  17.         {
  18.             KeyBlacklistInterval = TimeSpan.FromMinutes(15),
  19.             MaxHitsPerKey = 10000,
  20.             MaxHitsPerKeyPerOrigin = 100,
  21.             MaxHitsPerOrigin = 10000,
  22.             MaxHitsPerKeyInterval = TimeSpan.FromMinutes(15),
  23.             MaxHitsPerKeyPerOriginInterval = TimeSpan.FromMinutes(15),
  24.             MaxHitsPerOriginInterval = TimeSpan.FromMinutes(15),
  25.             OriginBlacklistInterval = TimeSpan.FromMinutes(15)
  26.         };
  27.         public enum Result
  28.         {
  29.             Allowed = 0,
  30.             OriginBlocked,
  31.             TooManyHitsFromOrigin,
  32.             KeyBlocked,
  33.             TooManyHitsOnKey,
  34.             TooManyHitsOnKeyFromOrigin
  35.         }
  36.         public static Task<Result> DefendAsync(string key, IPAddress origin)
  37.         {
  38.             return DefendAsync(key, origin,
  39.                 Config.MaxHitsPerKeyInterval, Config.MaxHitsPerKey,
  40.                 Config.MaxHitsPerOriginInterval, Config.MaxHitsPerOrigin,
  41.                 Config.MaxHitsPerKeyPerOriginInterval, Config.MaxHitsPerKeyPerOrigin);
  42.         }
  43.  
  44.         public static async Task<Result> DefendAsync(string key, IPAddress origin,
  45.             TimeSpan keyInterval, long keyMaxHit,
  46.             TimeSpan originInterval, long originMaxHit,
  47.             TimeSpan keyOriginInterval, long keyOriginMaxHit)
  48.         {
  49.             Stopwatch watch = new Stopwatch();
  50.             watch.Start();
  51.  
  52.            
  53.             if (await Store.IsOriginBlacklisted(origin))
  54.             {
  55.                 Trace(LogLevel.Debug, "OriginBlocked: " + origin.ToString());
  56.                 return Result.OriginBlocked;
  57.             }
  58.  
  59.              
  60.             var hitStats = await Store.IncrementHit(key, origin,
  61.                 keyInterval, originInterval, keyOriginInterval);
  62.  
  63.             Trace(LogLevel.Debug, "Hits: " + key + '\t' + hitStats.HitsOnKey + '\t' + origin.ToString() + '\t' + hitStats.HitsFromOrigin + ' ' + hitStats.HitsOnKeyFromOrigin);
  64.  
  65.             if (hitStats.HitsOnKey > keyMaxHit)
  66.             {
  67.                 Trace(LogLevel.Debug, "TooManyHitsOnKey: " + key);
  68.                 return Result.TooManyHitsOnKey;
  69.             }
  70.  
  71.             if (hitStats.HitsFromOrigin > originMaxHit)
  72.             {
  73.                 Trace(LogLevel.Debug, "TooManyHitsFromOrigin: " + origin.ToString());
  74.                 return Result.TooManyHitsFromOrigin;
  75.             }
  76.  
  77.             if (hitStats.HitsOnKeyFromOrigin > keyOriginMaxHit)
  78.             {
  79.                 Trace(LogLevel.Debug, "TooManyHitsOnKeyFromOrigin: " + key + '\t' + origin.ToString());
  80.                 return Result.TooManyHitsOnKeyFromOrigin;
  81.             }
  82.  
  83.             if (await Store.IsKeyBlacklisted(key))
  84.             {
  85.                 Trace(LogLevel.Debug, "KeyBlocked: " + key);
  86.                 return Result.KeyBlocked;
  87.             }
  88.  
  89.             LogElapsed(DEFEND_FUNC_NAME, watch);
  90.  
  91.             return Result.Allowed;
  92.         }
  93.  
  94.         public static Task<bool> BlacklistKeyAsync(string key, TimeSpan expiration)
  95.         {
  96.             Trace(LogLevel.Information, "Blacklist Key: " + key);
  97.             return Store.BlacklistKey(key, expiration);
  98.         }
  99.  
  100.         public static Task<bool> WhitelistKeyAsync(string key)
  101.         {
  102.             Trace(LogLevel.Information, "Whitelist Key: " + key);
  103.             return Store.WhitelistKey(key);
  104.         }
  105.  
  106.         public static Task<bool> BlacklistOriginAsync(IPAddress origin, TimeSpan expiration)
  107.         {
  108.             Trace(LogLevel.Information, "Blacklist origin: " + origin.ToString() + '\t' + expiration.ToString());
  109.             return Store.BlacklistOrigin(origin, expiration);
  110.         }
  111.  
  112.         public static Task<bool> BlacklistOriginAsync(IPAddress origin)
  113.         {
  114.             Trace(LogLevel.Information, "Blacklist origin: " + origin.ToString());
  115.             return BlacklistOriginAsync(origin, Config.OriginBlacklistInterval);
  116.         }
  117.  
  118.         public static Task<bool> BlacklistOriginAsync(IPAddress start, IPAddress end)
  119.         {
  120.             Trace(LogLevel.Information, "Blacklist origin: " + start.ToString() + " to " + end.ToString());
  121.             return Store.BlacklistOrigin(start, end);
  122.         }
  123.  
  124.         public static Task<bool> WhitelistOriginAsync(IPAddress origin)
  125.         {
  126.             Trace(LogLevel.Information, "Whitelist origin: " + origin.ToString());
  127.             return Store.WhitelistOrigin(origin);
  128.         }
  129.  
  130.         public static Task<bool> WhitelistOriginAsync(IPAddress start, IPAddress end)
  131.         {
  132.             Trace(LogLevel.Information, "Whitelist origin: " + start.ToString() + " to " + end.ToString());
  133.             return Store.WhitelistOrigin(start, end);
  134.         }
  135.  
  136.         public static Task<bool> IsKeyBlacklistedAsync(string key)
  137.         {
  138.             return Store.IsKeyBlacklisted(key);
  139.         }
  140.  
  141.         public static Task<bool> isOriginBlacklistedAsync(IPAddress origin)
  142.         {
  143.             return Store.IsOriginBlacklisted(origin);
  144.         }
  145.  
  146.         public static Task<bool> ClearBlacklistsAsync()
  147.         {
  148.             Trace(LogLevel.Information, "Clear All Blacklists");
  149.             return Store.ClearBlacklists();
  150.         }
  151.  
  152.         public static Task<bool> ClearAllHitsAsync()
  153.         {
  154.             Trace(LogLevel.Information, "Clear All Hits");
  155.             return Store.ClearAllHits();
  156.         }
  157.  
  158.         public static Task<long> GetHitsForKey(string key)
  159.         {
  160.             return Store.GetHitsForKey(key);
  161.         }
  162.  
  163.         public static Task<long> GetHitsFromOrigin(IPAddress origin)
  164.         {
  165.             return Store.GetHitsFromOrigin(origin);
  166.         }
  167.  
  168.         public static Task<string[]> GetKeyBlacklists()
  169.         {
  170.             return Store.GetKeyBlacklists();
  171.         }
  172.  
  173.  
  174.         public static async Task<TResult> DefendAsync<TResult>(
  175.             Func<Func<TResult, Task<TResult>>, Func<TResult, Task<TResult>>, Task<TResult>> work,
  176.             Func<Hacker.Result, TResult> blocked,
  177.             string validActionKey,
  178.             long maxValidAttempt,
  179.             TimeSpan validAttemptInterval,
  180.             string invalidActionKey,
  181.             long maxInvalidAttempt,
  182.             TimeSpan invalidAttemptInterval,
  183.             IPAddress origin)
  184.         {
  185.             Stopwatch watch = new Stopwatch();
  186.             watch.Start();
  187.  
  188.             if (await Hacker.IsKeyBlacklistedAsync(invalidActionKey))
  189.             {
  190.                 Trace(LogLevel.Debug, "InvalidActionKeyBlacklisted: " + invalidActionKey);
  191.                 LogElapsed(DEFEND_FUNC_NAME, watch);
  192.  
  193.                 return blocked(Hacker.Result.KeyBlocked);
  194.             }
  195.  
  196.             Func<TResult, Task<TResult>> success = async (returnType) =>
  197.             {
  198.                 var result = await Hacker.DefendAsync(
  199.                     validActionKey,
  200.                     origin,
  201.                     validAttemptInterval,
  202.                     maxValidAttempt,
  203.                     TimeSpan.MaxValue, long.MaxValue,
  204.                     TimeSpan.MaxValue, long.MaxValue);
  205.  
  206.                 if (result == Hacker.Result.TooManyHitsOnKey)
  207.                 {
  208.                    
  209.                     await Hacker.BlacklistKeyAsync(validActionKey, validAttemptInterval);
  210.                     LogElapsed(DEFEND_FUNC_NAME, watch);
  211.                     return blocked(result);
  212.                 }
  213.  
  214.                 return returnType;
  215.             };
  216.  
  217.             Func<TResult, Task<TResult>> fail = async (returnType) =>
  218.             {
  219.                    
  220.                 var result = await Hacker.DefendAsync(
  221.                     invalidActionKey,
  222.                     origin,
  223.                     invalidAttemptInterval,
  224.                     maxInvalidAttempt,
  225.                     TimeSpan.MaxValue, long.MaxValue,
  226.                     TimeSpan.MaxValue, long.MaxValue);
  227.  
  228.                 if (result == Hacker.Result.TooManyHitsOnKey)
  229.                 {
  230.                     await Hacker.BlacklistKeyAsync(invalidActionKey, invalidAttemptInterval);
  231.                     LogElapsed(DEFEND_FUNC_NAME, watch);
  232.                     return blocked(result);
  233.                 }
  234.  
  235.                 return returnType;
  236.             };
  237.  
  238.             return await work(success, fail);
  239.         }
  240.  
  241.         private static void LogElapsed(string name, Stopwatch watch)
  242.         {
  243.             watch.Stop();
  244.  
  245.             Trace(LogLevel.Debug, name + ':' + ' ' + watch.ElapsedMilliseconds);
  246.         }
  247.  
  248.         public static void Trace(LogLevel logLevel, string message)
  249.         {
  250.             if (Logger != null)
  251.                 Logger.Log<object>(logLevel, 1, null, null, (s, e) => message);
  252.         }
  253.  
  254.     }
  255. }
Advertisement
Add Comment
Please, Sign In to add comment