PDA

View Full Version : گفتگو: نمایش کپچا پس از تعداد مشخصی لوگین اشتباه



Arashdn
شنبه 02 اسفند 1393, 17:24 عصر
سلام دوستان.
من دارم یه سیستم رو طراحی میکنم.
میخوام اگر یه آیپی بیش از تعداد مشخصی لاگین اشتباه داشت (مثلا ۵ تا در یک ساعت) برای ورود بهش کپچا نشون بده.
با نشون دادن کپچا مشکل ندارم.
مشکلی که دارم اینه که لوگین های اشتباه با چه فرمتی و در کجا ذخیره بشه.

اولین چیزی که به ذهنم رسید نگه داشتنشون تو دیتابیس بود.
ولی خب اینطوری برای هر بار لود صفحه یه کوئری که ممکنه خیلی هم سنگین باشه میره رو دیتابیس و فشار زیادی به دیتابیس میاره.
به نظرتون چیکار میشه کرد؟
اسکریپت های قوی (مثلا vBulletin) از چه روشی استفاده میکنن؟

به جز کپچا و سوال امنیتی و اینطور چیزا ٬ راهی برای مقاله با حملات brute-force وجود داره؟

ممنون

bagherok
شنبه 02 اسفند 1393, 18:39 عصر
اینکه برای نشون دادن و ندادن کپیچا به ازای هر بار لود صفحه یه
کوئری بزنید اصلاکار درستی نیست
(ولی اصلا هم سنگین.فک میکنید vBulletin و اسکرییت های دیگه به ازای هر صفحه چند تا کوئری میزنند... ).
بهتره تو جدول یوزر دو تا فیلد داشته باشید به نام های

user_failed_logins
user_last_failed_login
و با استفاده از این مقادیر میتونید تصمیم بگیرید که کپچا نشون داده بشه یا نه
و از کوکی و سشن هم میتونید استفاده کنید برای ذخیره مقادیر بالا

و برای اینکه بهتر متوجه بشید اینجا رو ببینید

https://github.com/panique/huge/blob/master/application/_installation/02-create-table-users.sql
یا به نظرم از این اسکرپیت استفاده کنید.

https://github.com/panique/huge

Arashdn
شنبه 02 اسفند 1393, 20:21 عصر
اینکه برای نشون دادن و ندادن کپیچا به ازای هر بار لود صفحه یه
کوئری بزنید اصلاکار درستی نیست
(ولی اصلا هم سنگین.فک میکنید vBulletin و اسکرییت های دیگه به ازای هر صفحه چند تا کوئری میزنند... ).
بهتره تو جدول یوزر دو تا فیلد داشته باشید به نام های

user_failed_logins
user_last_failed_login
و با استفاده از این مقادیر میتونید تصمیم بگیرید که کپچا نشون داده بشه یا نه
و از کوکی و سشن هم میتونید استفاده کنید برای ذخیره مقادیر بالا

و برای اینکه بهتر متوجه بشید اینجا رو ببینید

https://github.com/panique/huge/blob/master/application/_installation/02-create-table-users.sql
یا به نظرم از این اسکرپیت استفاده کنید.

https://github.com/panique/huge



الان من متوجه نمیشم ٬ اگر این مقادیر در دیتابیس باشه که واسه هر بار لود صفحه یه کوئری باید بخوره واسه نمایش کپچا

خب اگه در کوکی نگه دارم که ربات خیلی راحت میتونه کوکیشو اصلا نگه نداره ....

پس چیکار کنیم؟

n0o0b_sina
شنبه 02 اسفند 1393, 21:28 عصر
سلام
نمیدونم ربات میتونه کوکی رو غیرفعال کنه یا نه ولی اگه بتونه خیلی راحت میتونید بررسی کنید که فعاله یا نه اگه فعال نبود
کپچا رو نشون بده اگه فعال بود طبق صحبتای دوستمون عمل کنید.

aliphp1
شنبه 02 اسفند 1393, 21:33 عصر
به نظر من لازم نیست برای این کار در دیتابیس چیزی ثبت کنید
فقط اطلاعات مورد نیاز رو توی یک سشن اگر ذخیره کنید بهتره منظورم تعداد لاگین اشتباه هست
درسته که وقتی کاربر مرورگر رو ببنده دوباره بدون کپچا می تونه لاگین کنه حتی اگر قبلش چند بار اشتباه زده باشه ولی باز هم فکر می کنم منظور رو برآورده می کنه
این نظر منه لطفا دوستان مشارکت کنند تا به بهترین روش برسیم

bagherok
شنبه 02 اسفند 1393, 23:20 عصر
الان من متوجه نمیشم ٬ اگر این مقادیر در دیتابیس باشه که واسه هر بار لود صفحه یه کوئری باید بخوره واسه نمایش کپچا

خب اگه در کوکی نگه دارم که ربات خیلی راحت میتونه کوکیشو اصلا نگه نداره ....

پس چیکار کنیم؟


user_failed_logins
تعدا لاگین های ناموفق


user_last_failed_login
زمان آخرین لاگین ناموفق

خب
تو اولین لاگین کاربر
قرارنیست که کپچا نشون داده بشه.
بعد چندمین ( یا چیزی که خودتون ست میکنید ) ورود ناموفق کپچا رو نشون میدید.

هر بار برای نمایش کپچا اول چک میکنیم ببینیم ( کوکی یا سشن ) وجود داره یا نه اگه داشت کپچا رو نشون میدیم و اگه وجود نداشت بااستفاده از 2 فیلدی که قبلا گفتم برای نمایش یا عدم نمایش تصمیم گیری میکنید.

bagherok
شنبه 02 اسفند 1393, 23:26 عصر
به نظر من لازم نیست برای این کار در دیتابیس چیزی ثبت کنید

اینو هم حساب کنید که میتونید بعدا از این داده ها استفاده کنید....
مثلا اینکه بفهمید امروز چند تا ورود ناموفق داشتید و ......

H:Shojaei
شنبه 02 اسفند 1393, 23:44 عصر
به نظر من هم بهترین روش روشی که دوستان n0o0b_sina (http://barnamenevis.org/member.php?338539-n0o0b_sina) و bagherok (http://barnamenevis.org/member.php?175630-bagherok)
گفتن باشه...
به این صورت که شما تو حالت عادی تعداد ورود رو داخل سشن و هم کوکی ذخیره میکنید و در صورت نبود هردو در دیتابیس (پردازش سنگینی نداره کار بیشتر میشه که منظور امنیت هست و کار بیشتر هم توجیهش...)
حالا چرا هردو سشن و کوکی؟
چون ربات با هربار ورود اگر سشنی نباشه میتونه به راحتی کوکیش رو پاک کنه و دوباره تلاش کنه و در این صورت باید از دیتابیس استفاده بشه ولی اگر سشن هم باشه دیگه تو مواقعی که ربات پیج رو نمیبنده و کوکی رو نابود میکنه سشن رو داریم بنابراین تو این مورد باری روی سرور نداریم کوئری ارسال نشده...
حالا چه موقع از دیتابیس میخونیم؟
در هر صورت باید تعداد ورود تو دیتابیس با یه تاریخ و ساعت ذخیره بشه ولی هرچه کمتر واسه خوندنش از دیتابیس استفاده بشه بهتره که اینجا هم همین فکر کنم مد نظر باشه...
وقتی کاربر ورود کرد اول سشن رو چک میکنید (چون ربات میتونه کوکی خودش رو از بین ببره با هر بار ورود ولی سشن رو تا جایی که بنده میدونم خیر) اگر سشن نبود یعنی پیج بسته شده و دوباره باز شده بعد کوکی رو چک میکنید اگر اون هم موجود نبود باید به دیتابیس یه سری بزنید ببینید این کاربر که الآن میخواد وارد بشه تا چند دقیقه قبل هم تلاشی واسه این کار داشته؟ اگر داشت اول مقداری که از لاگین اشتباه داره رو یکی بهش اضافه میکنیم بعد میریزیم داخل هردو سشن و کوکی و باز به همین روش این کار ادامه پیدا میکنه اگر هم قبلا این کاربر تلاشی نکرده بود که باید مقدار لاگین اشتباهش رو تو دیتابیس 0 کنیم...

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

bagherok
یک شنبه 03 اسفند 1393, 00:07 صبح
تو مواقعی که ربات پیج رو نمیبنده و کوکی رو نابود میکنه سشن رو داریم.
اگه کوکی وجود نداشته باشه عملا سشنی هم وجو نداره
چون
سشن ای دی session_id
درون کوکی ذخیره میشه.

میشه مقدار 2 فیلد بالا رو بصورت هش شده درون کوکی و سش قرار داد.
و هربار مقادیراین دو چک میشند و درمرحله اول برابر بودن و در مرحله دوم بعدازمحاسبه این دو مقادیر تصمیم گرفته میشه که کیچا نمایش داده بشه یا نه
و همچنین در مرحله ای که داده سمت سرور فرستاده میشن باز مقادیر دو فیلد محاسبه میشه.

freeman99
یک شنبه 03 اسفند 1393, 08:10 صبح
منکه در پروژهء رجیستر و لاگین خودم تمام لاگین ها رو در دیتابیس لاگ میکنم. جز این چاره ای نیست!
کوکی و سشن در این مورد اصولی نیستن چون توسط کلاینت براحتی قابل دور زدن هستن.
فکر نمیکنم دیتابیس اینقدر هم کند باشه. این یک عملیات و کوئری ساده است که با طراحی درست جدول (شامل ایندکس) و درست نوشتن کوئری فکر نمیکنم بار زیادی داشته باشه.

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

freeman99
یک شنبه 03 اسفند 1393, 08:12 صبح
من تلاش کردم برای جهانیان یک سیستم رجیستر و لاگین حرفه ای و امن کامل درست کنم :لبخند: به جاها و تجربیات خوبی هم رسیدم، ولی هنوز این پروژه به کمال و غایت خودش نرسید!
الان اگر وقت و انگیزه داشتم میتونستم بیشتر روش کار کنم و بالاخره یه چیز بی نقص تری درست کنم. شایدم یه وقتی این کار رو کردم. کسی چه میدونه :متفکر:

freeman99
یک شنبه 03 اسفند 1393, 08:13 صبح
برای همین سیستم قفل میتونم اینقدر جزییات و نکته براتون بگم که گیج و سردرگم بشید!
شایدم اصلا به فکر تغییر شغل از برنامه نویسی بیفتید، چون تازه میفهمید که چقدر جزییات و نکته ها هست که به ذهنتون نرسیده و چقدر چیزها هست که یاد نگرفتید :چشمک:
بقول شاعر میگه هزار نکتهء باریک تر ز مو دارد :لبخندساده:
یاهاهاها ... هووو :لبخند:

MMSHFE
یک شنبه 03 اسفند 1393, 08:26 صبح
راه مناسبتر اینه که اگه شناسه کاربری وجود نداشت، کلاً بیخیال بشین و بگذارین طرف هرچی دلش میخواد چک کنه (تا چشش در آد) ولی اگه شناسه کاربری درست بود، اونوقت اگه به تعداد مشخصی لاگین ناموفق داشت، اکانتش رو قفل کنید و ایمیل براش بفرستین که با کلیک روی لینک داخل ایمیل، اکانتش Unlock بشه. بستن IP که کلاً مردوده (بخاطر وجود Range IP و داشتن IP مشترک توسط خیلیها و امکان تغییر راحت IP) و کوکی هم به راحتی قابل دور زدنه. Session هم که با تغییر IP ازبین میره. معمولاً توی حملات DOS بجای بلاک کردن تنهای IP میان ترکیب IP و User Agent و یکسری صفحات خاصی که درخواست میشه (که ممکنه باگ داشته باشن) رو بلاک میکنن و از بلاک کردن جداگانه IP پرهیز میشه.

freeman99
یک شنبه 03 اسفند 1393, 08:56 صبح
بیخود کار رو از سر خودتون باز نکنید :لبخند:
درسته بلاک کردن IP یه محدودیت ها و مشکلاتی داره (خودم یه مقاله در این مورد در وبلاگم نوشتم) و خیلی ها اینا رو نمیدونن یا دقت نمیکنن و زرتی میخوان IP رو بلاک کنن، ولی این امکان بنظر من باید توی سیستم باشه در مواقع خاص هم که شده ممکنه مجبور باشیم یا مفید باشه بصورت موقت هم که شده ازش استفاده کنیم. حالا میتونید بصورت پیشفرض خاموش بذارید. این میتونه یه ابزار تحت نظارت و موقت و موردی باشه.
ضمنا لزوما نمیخواد که کلا بلاک کنید و اجازه لاگین ندید، بلکه میتونید برای IP هایی که فعالیت مشکوک داشتن کپچا هم اعمال کنید و برای بقیهء IP ها کپچا نخواد. به این شکل یک لایه امنیت افزوده رو دارید که حداقل در مواقعی میتونه مفید باشه و جلوی خیلی هکرها و روبات ها و حمله ها رو کم و بیش بگیره/منصرف کنه.
از اون طرف از طریق ترفند ارسال لینک bypass به ایمیل میشه برای مواردی که IP قفل شده هم استفاده کرد و هرکس بتونه با استفاده از لینک خودش به اکانت خودش فقط، لاگین کنه. اینم باز میتونه تاحدی عوارض این سیستم رو کاهش بده.
البته بنظر من هم عاقلانه تر میاد که بلاک کلی بر اساس IP غیرفعال باشه و خودتون به مرور زمان و با دیدن عملکرد سیستم و حمله هایی که نسبت بهش صورت میگیره تصمیم بگیرید که این کار رو بکنید یا نکنید و یا مثلا میتونید بر اساس IP فقط کپچا رو فعال کنید.
خلاصه این ابزار یجورایی باید تحت نظارت و کنترل و استفادهء محتاطانه و با بصیرت کافی باشه. نمیشه گفت که اصلا نیازی بهش نیست و توی سیستم نذاریم! اصلا همون سیستم بلاک بر اساس اکانت هم خودش مشکلاتی داره و قابل سوء استفاده است، و خیلی جاها هم اصولا وجود نداره یا فعال نیست بصورت پیشفرض، ولی با این حال بعکس خیلی جاها هم هست و نیازه یا مفیده بهرصورت، بعضی اوقات برای خلاص شدن از شر بعضی هکرها و حمله ها و جلوگیری از یکسری صدمه های جدی تر میتونه خیلی مفید یا اصلا نیاز باشه. من خودم چند بار دیدم مثلا یه طرفی به یه سایتی حالا از روی دشمنی هرچی گیر داده بوده، مجبور شدن بیان مثلا یه ماجول امنیتی خاصی رو فعال کنن که برای کاربران عادی هم مشکلات قابل توجهی ایجاد میکرده، ولی از اون طرف هکر محترم هم به زودی خسته شده بخاطر سختی و هزینهء افزودهء کارش و رفته پی کارش، و بعد از مدتی که صاحبان سایت از بابت حمله خیالشون راحت شده اون ماجول رو غیرفعال کردن.
در اینترنت چون نمیشه کنترل کامل داشت و گاهی حتی یک شخص نسبتا عادی میتونه یک سایت بزرگ رو با مشکلات قابل توجهی روبرو کنه، نیاز به ابزارهایی دم دست هست که در مواقع خاص و بصورت موقتی و موردی هم که شده تحت نظارت مسئولین استفاده بشن. قفل اکانت و IP هردو از این دسته هستن که البته تاحد ممکن اونا رو هوشمند و خودکار درست میکنیم (علاوه بر اینکه باید امکان تنظیم کاملی داشته باشن) که محدودیت ها و جنبه های منفی اونا به حداقل برسه، اما بازم همیشه یه ادمینی چیزی باید بر سایت و آمار و لاگ ها و وقایعی که درش اتفاق میفته و حتی فیدبک از سوی کاربران سایت نظارت داشته باشه تا تنظیمات لازم رو اعمال کنه و موارد پیشبینی نشده رو متوجه بشه.

freeman99
یک شنبه 03 اسفند 1393, 09:08 صبح
راستی اینو گفتم یادم افتاد به یه امکانی که خودم هم در پروژم نذاشتم. البته فکر نکنم که یادم رفته بود، ولی دیگه وقتش نشد و حال و انرژیش رو نداشتم اینقدر که کارهای اصلی و مهمتر دیگه زیاد بود.
میگم باید امکان بلاک دستی IP های خاص رو هم توی سیستم بذاریم که ادمین بتونه خودش IP یا IP های مشخصی رو به سیستم بده تا بلاک کنه. صد البته که این بلاک ها بازهم باید با احتیاط و آگاهی و بصیرت زیادی صورت بگیرن و توصیه اکید اینکه بصورت موقت باشن و پس از مدتی که قابل تعیین توسط ادمین باشه بصورت خودکار غیرفعال بشن. البته گزینهء بلاک دائمی رو هم طبیعتا میتونیم توش بذاریم با اینکه استفاده ازش بنظر غیرعاقلانه میاد، ولی بازم باشه بهتر از اینه که نباشه؛ حداقل در یک سیستمی که زیردست یک آدم کاردان میخواد باشه. اینکه میگم حداقل اگر زیر دست آدم کاردان باشه بخاطر اینکه یوقت هم میبینی یه امکانی رو توی برنامه میذاری و برنامه در دسترس عموم میره اونوقت خیلی افراد استفاده نابجا از اون امکان میکنن که عملا بیشتر موجب خسارت میشه تا سود و پشیمون میشی از اینکه اون امکان رو در برنامه گذاشتی! مثلا فکر کن خیلی ها بیان یکسری IP هایی رو که مشترک همزمان یا بعدا توسط دیگران بی گناه استفاده میشن رو بصورت دائمی بلاک کنن و اینطوری در اینترنت معضل درست بشه!!
ولی بهرصورت بنظر من چون مسائل و نیازهای امنیتی بسیار گسترده و پیچیده است و نمیشه از پیشبینی همهء حالتها و نیازها برای تمام زمانها مطمئن بود، باید سیستم تا میشه همه جور امکان و امکان همه جور کانفیگی رو داشته باشه تا در صورت نیاز استفاده بشن. من خودم از این روش در پروژم استفاده کردم، چرا، چون مثلا میدیدم که خیلی شرایط رو نمیتونم با اطمینان پیشبینی کنم و نیاز به تست و تجربهء زیادی داره که از دسترسم خارجه یا صرف نمیکنه، پس میامدم بجاش امکان کانفیگ کاملی رو در برنامه میذاشتم، حتی کانفیگ هایی که ممکنه بنظر بدون کاربرد یا غیرعاقلانه بنظر بیان، تا این مسئولیت پیشبینی تمام حالات ممکن و کاربردی رو دیگه نداشته باشم و هرکس در هر شرایطی خودش تشخیص بده و روشی رو که میخواد اعمال کنه. صد البته که اینطوری در کل بهتر هم هست و برنامهء منعطف تری داریم که همه فن حریفه و میشه ازش برای کاربردهای پیشبینی نشده هم استفاده کرد.

Arashdn
جمعه 08 اسفند 1393, 11:20 صبح
بحث های جالبی تو تاپیک داشتیم...
ممنون از همه
الان خلاصه ماجرا این میشه که بهترین کار همین استفاده از دیتابیس هست.
درسته؟
چون اینطور که میدونم سشن و کوکی و ... همه میتونه در سمت کاربر خیلی ساده حدف بشه.

در سمت دیتابیس هم اینطور که فهمیدم بهترین کار نگه داشتن آیپی هست و اگر تعداد لوگین آیپی ای بیشتر از تعداد مشخصی بود براش یه کپچا نشون داده بشه و نه اینکه بلاک بشه.


دوستان صحبت ها رو تایید میکنید؟

freeman99
شنبه 09 اسفند 1393, 09:38 صبح
در سمت دیتابیس هم اینطور که فهمیدم بهترین کار نگه داشتن آیپی هست و اگر تعداد لوگین آیپی ای بیشتر از تعداد مشخصی بود براش یه کپچا نشون داده بشه و نه اینکه بلاک بشه.

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