PDA

View Full Version : سوال: راهکار امنیتی برای وب سایت (نفوذ گر افزایش ترافیک انجام میدهد)



abasfar
پنج شنبه 09 آذر 1391, 19:02 عصر
با سلام
دوستان من چند وقتی است که دچار این مشکل میشم
چند هفته یکبار میبینم ایمیلی مبنی بر پیدا نشدن هاست میاد alert monitor website
وقتی وارد پانل هاست میشم میبینم که وب سایت به دلیل افزایش فشار بر سرور lock شده
به نظر خودم شخص نفوذ گر یک query رو چند 10000 بار اجرا میکنه تا این مشکل به وجود بیاد
حالا از شما دوستان درخواست میکنم نرم افزار های تست نفوذ یا راهکارهای جلوگیری از این نوع حمله ها رو بفرمایید
در ضمن یک سوالی داشتم من اگه بخوام IP یک سیستم رو بدست بیارم تو ایران Public IP باید پیدا کنم خوب حالا وقتی من این Public IP یا همون Valid IP رو ببندم دیگر کاربران که از این IP استفاده میکنند نیز مسدود میشند راهکار چیه؟

raziee
پنج شنبه 09 آذر 1391, 19:53 عصر
بوسیله ی نگهداری اطلاعات درخواست کننده و تعداد درخواست ها در بازه زمانی مشخص میتونید این محدودیت رو ایجاد کنید.
مثلا اگه تعداد درخواست ها بیشتر از n تعداد در m زمان بود دیگه به اون درخواست پاسخی نده.

abasfar
پنج شنبه 09 آذر 1391, 20:07 عصر
ممنون از پاسخ شما
فقط این نکته هست که اگر این شناسه IP باشه مشکل پایین به وجود میاد


من اگه بخوام IP یک سیستم رو بدست بیارم تو ایران Public IP باید پیدا کنم خوب حالا وقتی من این Public IP یا همون Valid IP رو ببندم دیگر کاربران که از این IP استفاده میکنند نیز مسدود میشند راهکار چیه؟


برای این مشکل چه چیزی پیشنهاد میکنید؟

اما اگه شناسه هر فرد را Seessin در نظر بگیرم با تغییر user agin بازم سیشن را تغیر میده پس این روش هم مناسب نیست ?!?!?!?!?

raziee
پنج شنبه 09 آذر 1391, 20:44 عصر
اما اگه شناسه هر فرد را Seessin در نظر بگیرم با تغییر user agin بازم سیشن را تغیر میده پس این روش هم مناسب نیست ?!?!?!?!?
یک کاربر که نمیتونه در مدت مثلا 30 ثانیه دو هزار تا درخواست بفرسته!

درخواست های بالا توسط انسان صورت نمیگیره. شما باید به درخواست های انسان پاسخ بدید.
باید درخواست های برنامه های مخرب، برنامه هایی که قصد مصرف پهنای باند سرور، پایین اومدن پاسخگویی سرور و .... رو مسدود کنید.
در این حالت هیچ کار بر انسانی نمیتونه در مدت 30 ثانیه 100 تا درخواست بفرسته!
شما هر درخواست کننده ای که تعداد درخواست هاش زیر بود رو دیگه پاسخ نده. این کار با استفاده از یک HttpModule به راحتی قابل پیاده سازی هست.

abasfar
جمعه 10 آذر 1391, 01:11 صبح
با تشکر از توجه شما
میشه لطف کنید یک تکه کد بدید تا من بتونم درک کنم باید دقیقا چی بنویسم
چیزی که من از HttpModule میدونم این است که تقریبا میشه گفت مثل Global.asax است وقتی که در خواست ارسال میشه قبل از همه چیز وارد این کلاس میشه
حالا من از این کلاس چه اطلاعاتی را باید بدست بیارم و چه جور! تا تشخیص بدم که این همان فرد یا ربات نفوذگر میباشد؟
من اطلاعات IP یا MAC یا چه چیزی رو دخیره کنم تا برای مقایسه بعدی مورد استفاده قرار بدم؟

raziee
جمعه 10 آذر 1391, 08:32 صبح
کدهای زیر از "Block DoS attacks easily in ASP.NET (http://madskristensen.net/post/Block-DoS-attacks-easily-in-ASPNET.aspx)" گرفته شده است.
مطاله "HttpModule to block external referrers in ASP.NET (http://madskristensen.net/post/HttpModule-to-block-external-referrers-in-ASPNET.aspx)" هم خالی از لطف نیست.
#region Using

using System;
using System.Web;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Timers;

#endregion

/// <summary>
/// Block the response to attacking IP addresses.
/// </summary>
public class DosAttackModule : IHttpModule
{

#region IHttpModule Members

void IHttpModule.Dispose()
{
// Nothing to dispose;
}

void IHttpModule.Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}

#endregion

#region Private fields

private static Dictionary<string, short> _IpAdresses = new Dictionary<string, short>();
private static Stack<string> _Banned = new Stack<string>();
private static Timer _Timer = CreateTimer();
private static Timer _BannedTimer = CreateBanningTimer();

#endregion

private const int BANNED_REQUESTS = 10;
private const int REDUCTION_INTERVAL = 1000; // 1 second
private const int RELEASE_INTERVAL = 5 * 60 * 1000; // 5 minutes

private void context_BeginRequest(object sender, EventArgs e)
{
string ip = HttpContext.Current.Request.UserHostAddress;
if (_Banned.Contains(ip))
{
HttpContext.Current.Response.StatusCode = 403;
HttpContext.Current.Response.End();
}

CheckIpAddress(ip);
}

/// <summary>
/// Checks the requesting IP address in the collection
/// and bannes the IP if required.
/// </summary>
private static void CheckIpAddress(string ip)
{
if (!_IpAdresses.ContainsKey(ip))
{
_IpAdresses[ip] = 1;
}
else if (_IpAdresses[ip] == BANNED_REQUESTS)
{
_Banned.Push(ip);
_IpAdresses.Remove(ip);
}
else
{
_IpAdresses[ip]++;
}
}

#region Timers

/// <summary>
/// Creates the timer that substract a request
/// from the _IpAddress dictionary.
/// </summary>
private static Timer CreateTimer()
{
Timer timer = GetTimer(REDUCTION_INTERVAL);
timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
return timer;
}

/// <summary>
/// Creates the timer that removes 1 banned IP address
/// everytime the timer is elapsed.
/// </summary>
/// <returns></returns>
private static Timer CreateBanningTimer()
{
Timer timer = GetTimer(RELEASE_INTERVAL);
timer.Elapsed += delegate { _Banned.Pop(); };
return timer;
}

/// <summary>
/// Creates a simple timer instance and starts it.
/// </summary>
/// <param name="interval">The interval in milliseconds.</param>
private static Timer GetTimer(int interval)
{
Timer timer = new Timer();
timer.Interval = interval;
timer.Start();

return timer;
}

/// <summary>
/// Substracts a request from each IP address in the collection.
/// </summary>
private static void TimerElapsed(object sender, ElapsedEventArgs e)
{
foreach (string key in _IpAdresses.Keys)
{
_IpAdresses[key]--;
if (_IpAdresses[key] == 0)
_IpAdresses.Remove(key);
}
}

#endregion

}

fakhravari
شنبه 11 آذر 1391, 01:18 صبح
با سلام
داش حسین کمی متد هاشو توضیح میدید.

raziee
شنبه 11 آذر 1391, 11:25 صبح
با سلام
داش حسین کمی متد هاشو توضیح میدید.

کدوم قسمتش رو مشکل دارید؟

ahmad156
سه شنبه 12 شهریور 1392, 18:56 عصر
با سلام
توی تابع TimerElapsed خطای زیر رو میده

Collection was modified; enumeration operation may not execute

به خاطر اینکه همزمان توی دو تابع داره تغییر میکنه(TimerElapsed و CheckIpAddress)
راه حلش چیه؟