ورود

View Full Version : حرفه ای: جلوگیری از حملات DDOS در mvc



parsdarab
سه شنبه 30 شهریور 1395, 17:51 عصر
سلام دوستان
من با توجه به مقاله زیر که روی یک نمونه سایت کدشو اعمال کردم جواب نگرفتم

https://www.cybrary.it/0p3n/how-to-block-ddos-attacks-with-asp-net/

فایل رو در app_code گذاشتم
142698

بعد در web.config اطلاعات زیر رو گذاشتم

142699

بعد در کلاس جاهای مختلف break point گذاشتم اما وقتی اجرا میشه روی اونها متوقف نمیشه

برای تستش باید چیکار کنم؟
اصلا این کد متصل به سایت نیست
یعنی همین تکه کد رو در قسمت web.config بنویسیم کافیه

در ضمن از مقاله های زیر هم استفاده شده اونا هم جوای نگرفتم

http://www.dotnettips.info/post/937/%d9%85%d8%b3%d8%af%d9%88%d8%af-%da%a9%d8%b1%d8%af%d9%86-%d8%a2%d8%af%d8%b1%d8%b3-ip-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-ihttpmodule-%d8%af%d8%b1-asp-net

http://www.dotnettips.info/post/2347/%d8%b7%d8%b1%d8%a7%d8%ad%db%8c-%db%8c%da%a9-%d9%85%d8%a7%da%98%d9%88%d9%84-ipblocker-%d8%af%d8%b1-asp-net-mvc

Moien Tajik
چهارشنبه 31 شهریور 1395, 00:45 صبح
سلام ,
توی web config گذاشتین چرا باید روی Breakpoint متوقف بشه ؟
سایت رو اگه شما روی یه سرور آپلود کنید و با یه اسکنر مثل Acunetix اون رو تست کنید که باگی داره یا نه بهتون میگه . معمولا در صفحه لاگین و ثبت نام بهتون یه باگ با سطح High میده که برای همین DDOS هستش که شما با همین کد خودتون و یا ایجاد یک وقفه ی چند ثانیه ای بعد از لاگین یا ثبت نام میتونید این باگ رو از بین ببرید .
برای ایجاد وقفه این کد رو در آخر Action لاگین و ثبت نام باید قرار بدید :

Thread.Sleep(3000);


باز هم بهتر هستش که با یک اسکنر کل سایتتون رو اسکن کنید و مطمئن بشید .

parsdarab
سه شنبه 06 مهر 1395, 23:11 عصر
سلام

در هر صورت دستور sleep باعث از بین رفتن درخواست نمیشه فقط اونو به تعویق میندازه
اگه دستور زیر کسی زد به علت درخواست های زیاد قادر به پرداش نیست


for (int i = 0; i < 100000; i++)
{
WebClient client = new WebClient();
client.DownloadString("http://www.pageflakes.com/default.aspx");
}



یه راه پیدا کردم اما باید بالای سر هر اکشن اینو بنویسی


public class ThrottleAttribute : ActionFilterAttribute
{
/// <summary>
/// A unique name for this Throttle.
/// </summary>
/// <remarks>
/// We'll be inserting a Cache record based on this name and client IP, e.g. "Name-192.168.0.1"
/// </remarks>
public string Name { get; set; }

/// <summary>
/// The number of seconds clients must wait before executing this decorated route again.
/// </summary>
public int Seconds { get; set; }

/// <summary>
/// A text message that will be sent to the client upon throttling. You can include the token {n} to
/// show this.Seconds in the message, e.g. "Wait {n} seconds before trying again".
/// </summary>
public string Message { get; set; }

public override void OnActionExecuting(ActionExecutingContext c)
{
var key = string.Concat(Name, "-", c.HttpContext.Request.UserHostAddress);
var allowExecute = false;

if (HttpRuntime.Cache[key] == null)
{
HttpRuntime.Cache.Add(key,
true, // is this the smallest data we can have?
null, // no dependencies
DateTime.Now.AddSeconds(Seconds), // absolute expiration
Cache.NoSlidingExpiration,
CacheItemPriority.Low,
null); // no callback

allowExecute = true;
}

if (!allowExecute)
{
if (String.IsNullOrEmpty(Message))
Message = "کاربر گرامی در هر {0} ثانیه یکبار شما مجاز به دادن درخواست هستید.";
Message = Message.Replace("{0}", Seconds.ToString());

//Elmah.ErrorSignal.FromCurrentContext().Raise(ex);


//http://stackoverflow.com/questions/12892112/determine-if-request-is-partialview-or-ajax-request-in-asp-net-mvc-3
if (c.HttpContext.Request.IsAjaxRequest())
{
//http://stackoverflow.com/questions/2678344/how-do-i-return-a-json-object-from-action-attribute
var result = new JsonResult();
result.Data = new { status = false, message = Message };
c.Result = result;
c.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
}
else
{
c.Result = new ContentResult { Content = Message };
// see 409 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
c.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
}

}
}
}


و بالای سر اکشن به این صورت نوشته میشه


[Throttle(Name = "About_SelectAbout", Message = "کاربر گرامی در هر {0} ثانیه یکبار شما مجاز به دادن درخواست هستید.", Seconds = 10)]



مثلا این کد میگه که هر ده ثانیه از یک ip فقط یک اکشن میتونه پردازش بشه