Note that there are some explanatory texts on larger screens.

plurals
  1. POBlocking dangerous IPs for accessing a resource
    primarykey
    data
    text
    <p></p> <h1>Environment</h1> <p>My IIS host an WebApp with WebService resources.</p> <ul> <li>...</li> <li>myWebService.asmx</li> <li>myWebService.svc</li> <li>...</li> </ul> <h1>Problem</h1> <p>Same bad guys, try to block server accessing the public resources with theirs bots.</p> <h1>Applied solution</h1> <ol> <li><p>I Build a filter: </p> <pre class="lang-cs prettyprint-override"><code>public class BadGuysFilter { private class BadGuy { public BadGuy() { Visits = 0; FirstSuspiciousVisit = DateTime.Now; } public int Visits; public DateTime FirstSuspiciousVisit; } private static volatile Dictionary&lt;string, BadGuy&gt; _blackList = new Dictionary&lt;string, BadGuy&gt;(); private static int _visitsLimit = 10; private static int _minutsLimit = 10; private static int _removeFromBlackListMinutesLimit = 30; public static void Init(int visitsLimit = 10, int minutsLimit = 10, int removeFromBlackListMinutesLimit = 30) { _visitsLimit = visitsLimit; _minutsLimit = minutsLimit; _removeFromBlackListMinutesLimit = removeFromBlackListMinutesLimit; } public static bool IsBadGuy() { return IsBadGuy(HttpContext.Current.Request.UserHostAddress); } public static bool IsBadGuy(string ip) { if (HttpContext.Current.Request.IsAuthenticated /*|| HttpContext.Current.Request.HttpMethod.ToUpper() == "POST"*/) return false; if (_blackList.Keys.Any(k =&gt; k == ip)) { _blackList[ip].Visits++; if (_blackList[ip].FirstSuspiciousVisit &lt; DateTime.Now.AddMinutes(-_removeFromBlackListMinutesLimit)) _blackList.Remove(ip); else if (_blackList[ip].FirstSuspiciousVisit &lt; DateTime.Now.AddMinutes(-_minutsLimit)) { _blackList[ip].Visits = 0; _blackList[ip].FirstSuspiciousVisit = DateTime.Now; } else if (_blackList[ip].Visits &gt; _visitsLimit) { _blackList[ip].FirstSuspiciousVisit = DateTime.Now; return true; } } else _blackList.Add(ip, new BadGuy()); return false; } public static void Punish() { var res = HttpContext.Current.Response; res.Clear(); res.StatusCode = 429; res.StatusDescription = "TOO MANY REQUESTS: Your application is sending too many simultaneous requests."; res.End(); } } </code></pre></li> <li><p>Use filter in <strong>Global.asax</strong> </p> <pre class="lang-cs prettyprint-override"><code>void Application_BeginRequest(object sender, EventArgs e) { if(BadGuysFilter.IsBadGuy()) BadGuysFilter.Punish(); // do stuff // } void Application_EndRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; if (app.Context.Response.StatusCode == 429) // "TOO MANY REQUESTS" return; // do stuff // } </code></pre></li> </ol> <h1>Question</h1> <p><strong>Is this an enough safe solution? Or maybe there is another way?</strong></p> <p>Edite: <em>"don't block at the resource itself. block farther upstream, e.g. at the firewall. – Marc B" Yes, you're right. This is final solution, but before apply it i need intermediate solution to defend my server. I forgot to mention this thing. – Artiom</em></p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload