یک ایده درمورد محدودیت بر اساس IP

در سیستم قفل کردن بر اساس IP باید این مسئله رو درنظر داشت که هیچ تضمینی وجود نداره که یک IP رو در بازهء زمانی محدودی فقط یک نفر یا حتی تعداد کمی افراد استفاده کنن.
شنیدم بعضی کشورها/ISPها یک IP رو بین تعداد زیادی افراد به اشتراک میذارن.

پس اگر صرفا بخوایم با تعداد کمی تلاش لاگین ناموفق، یک IP رو بلاک کنیم چندان راه اصولی و مطمئنی بنظر نمیرسه و ضمنا خودش میتونه توسط هکرها برای حمله های DOS استفاده بشه (به این شکل که هکر که میدونه تعداد زیادی از کاربران سایت از IP مورد نظر استفاده میکنن، از اون IP تعداد زیادی درخواست لاگین ناموفق ارسال میکنه تا اون IP بلاک و در نتیجه دسترسی تعداد زیادی از کاربران به سایت قطع بشه).

برای حل این قضایا بنده الان یه ایده ای بنظرم رسید.

میگم چطوره بجای صرفا شمردن تعداد تلاشهای لاگین ناموفق، بیایم و هردوی تلاش ناموفق و موفق رو بشماریم و اگر نسبت تعداد تلاشهای لاگین ناموفق به موفق از حد خاصی بیشتر شد (مثلا 10 برابر)، اونوقت IP رو بلاک کنیم.

اینطوری فرضا اگر همزمان 1000 نفر از یک IP استفاده میکنن، اگر از بین این همه فقط یک یا تعداد کمی افراد با سایت ما کار داشته باشن و یک نفر تلاش لاگین ناموفق زیادی داشته باشه که غیرطبیعی هست، IP بلاک میشه؛ چون تعداد زیادی تلاش ناموفق داشتیم و تعداد صفر یا خیلی کمتری تلاش موفق. ولی اگر 500 نفر با سایت ما کار دارن و در بازهء زمانی خاصی لاگین کردن، طبیعی هست که تعداد تلاشهای ناموفق ثبت شده در سیستم ما برای اون IP فقط به یک نفر و دو نفر متعلق نیست بلکه به صدها نفر متعلق هست و بصورت طبیعی اتفاق افتاده و بالا رفته و بنابراین دلیلی نداره که اون IP رو بلاک کنیم. در این صورت سیستم ما اگر بر اساس نسبت تعداد لاگین ناموفق به موفق کار کنه، IP رو بیخودی بلاک نمیکنه و دسترسی مردم بی دلیل قطع نمیشه. چون فرضا از این 500 نفر اگر بطور متوسط هرکدام 3 تلاش ناموفق داشتن میشه 1500 تلاش ناموفق، ولی وقتی 1500 تقسیم بر 500 لاگین موفق اونها بشه، دوباره همون عدد 3 بدست میاد.

البته عدد 3 که مثال زدم بنظرم غلطه، چون 500 نفر همه در لاگین خطا نمیکنن، و این یک عدد کمتری باید باشه. مثلا از 500 نفر اگر نصف اونها خطای لاگین داشته باشن، فرضا بطور متوسط 2 بار، میشه 500، نه 1500. ولی باز 500 هم تعداد زیادی هست و اگر سیستم ما صرفا بر اساس تعداد لاگین ناموفق عمل کنه، IP رو اشتباها بلاک میکنه.

البته این سیستم ممکنه نکات ظریفی داشته باشه.
فرضا هکر که از طرز کار سیستم ما اطلاع داره میاد و یک اکانت کاربری در سایت ما ایجاد میکنه، بعد به ازای هر چند تلاش لاگین ناموفق که داره یک بار هم به اکانتی که خودش ایجاد کرده لاگین موفق میکنه، و بنابراین نسبت تلاشهای ناموفق و موفق در سیستم ما یکسان باقی میمونه و سیستم IP رو بلاک نمیکنه و هکر میتونه بدون محدودیت به حملهء خودش ادامه بده.

بنابراین، این سیستم به این شکل دارای ضعف امنیتی جدی میباشد :D

مگر اینکه تمهیداتی روی این قضیه داشته باشیم و براش فکری بکنیم.

میتونیم تعداد تلاش لاگین موفق رو برای هر اکانت خاص فقط یک یا چند بار معدود در بازهء زمانی مشخص حساب کنیم. یعنی در یک بازهء زمانی حتی اگر 1000 بار به یک اکانت خاص لاگین شده، مااز این بابت فقط یکی یا چندتا به تعداد تلاشهای لاگین موفق در اون بازهء زمانی اضافه میکنیم، نه 1000 تا. باید یک تعدادی لاگین در بازهء زمانی مشخص رو درنظر بگیریم که میتونه طبیعی باشه. مثلا اینکه به یک اکانت در 1 ساعت دو سه بار لاگین بشه غیرطبیعی نیست، اما اگر 100 بار لاگین بشه قطعا غیرطبیعی هست. حالا محاسبهء دقیق اینها دقیقا به ریاضی و آمار و احتمالات برمیگرده و اینجاست که نقش تئوری و ریاضیات در برنامه نویسی و امنیت مشخص میشه.

این تمهید تاحدی مشکل رو برطرف میکنه. چون هکر اگر بخواد مثل قبل سیستم رو گول بزنه، اگر فرضا میخواد بتونه 100 هزار نام کاربری و پسورد رو تست کنه، باید ابتدا فرضا 10 هزار اکانت هم در سیستم ایجاد کنه که بنظرم کار واقعا سخت و زمانبری است! (مگر اینکه کپچای سیستم ثبت نام رو کرک کنه تا این کار بتونه توسط یک روبات انجام بشه).

در پایان باید بگم این روش فقط یک ایده بود که ممکنه در بعضی موارد مفید یا لازم بشه، و بدین معنا نیست که بنده اون رو برای هر برنامه ای در هر شرایطی بی نقص میدونم و پیشنهاد میکنم. درواقع شاید این روش برای جاهایی که ثبت نام عمومی و بدون دخالت مدیر سایت امکان پذیر است مناسب نباشه، چون نفوذگر میتونه هر تعدادی اکانت که میخواد در سیستم ایجاد کنه و به این وسیله محدودیت تعداد لاگین اشتباه رو برای خودش افزایش بده. اما این سیستم میتونه مثلا در بعضی جاها که به دلیل استفادهء کاربران زیادی از IP مشترک مشکل پیش میاد مفید یا حتی لازم بشه، یا در جاهایی که ثبت نام عمومی به اون شکل وجود نداره.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>