PDA

View Full Version : سوال: لاگین امن



abdollah110110
چهارشنبه 22 دی 1389, 00:58 صبح
سلام
برای درست کردن یک لاگین امن چه چیزهایی لازم است؟
لطفا با مثال توصیح دهید.
متشکرم

mohsen6500
چهارشنبه 22 دی 1389, 14:05 عصر
سلام اوال میتونی اونو با جاوا اسکریپت چک کنی
و بعد هم برای اطمینان بیشتر از تابع isset در php استفاده کنی که اگر کاربری نام کاربری ویا پسورد خود را وارد کرده
به مرحله بعد (ادامه چک کردن) بره و در غیر این صورت اطلاعات پردازش نمی شوند.
مرحله بعد هم برای اینکه مطمئن بشی که این نام کاربری در دیتا بیس وجود داره یه کوئری میگری
اگر وجود داشت به صفحه مورد نظر وارد بشه و
درغیر اینصورت باز هم اخطار بده که این نام کاربری وجوود ندارد!
یه مثال هم براتون میذارم

eshpilen
چهارشنبه 22 دی 1389, 16:45 عصر
چیزایی که به یادم میاد:
- باید جلوی SQL Injection رو بگیری
- پسورد کاربر رو توی کوکی نریز؛ حتی هش پسورد کاربر رو هم توی کوکی نریز!! (بجاش میشه یک کلید رندوم طولانی برای هر کاربر تولید کرد و در دیتابیس ذخیره کرد و در کوکی ازش استفاده کرد)
- پسورد کاربر رو توی دیتابیس ذخیره نکن؛ بلکه از یک Hash که با Salt هم تولید شده استفاده کن.
اینا موارد درجه اول و حداقلی بود که بنظرم رسید (ممکنه بعضی چیزهای دیگه رو حضور ذهن نداشتم و از قلم انداخته باشم)
در درجهء بعد برای امنیت بیشتر و یک سیستم حرفه ای:
- اگر پسورد تا 3 بار اشتباه وارد شد جلوی اون IP رو مثلا تا 15 دقیقه بگیری (بهش اجازهء لاگین ندی)
- باید برای جلوگیری از حمله های XSS تدابیر کامل بکار ببریم

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

$ M 3 H R D A D $
چهارشنبه 22 دی 1389, 18:08 عصر
عزیز خیلی خیالم از این جمله هات راحت شد و دوست دارم یک مثال از ای تدابیر بهم بدی لطفا

eshpilen
چهارشنبه 22 دی 1389, 18:43 عصر
من خودم یه سیستم لاگین نوشتم، اما بعضی از این اصول رو توش رعایت نکردم. یک دلیلش هم این بود که اولین پروژهء من در PHP بود و میخواستم زودتر به نتیجه برسه و بیش از حد پیچیده و حجیم نشه.
بعدا فرصت کنم میخوام کاملش کنم. حداقل یک حفرهء امنیتی جدی هم داره که مربوط به XSS میشه.
اون پروژه رو میتونید اینجا ببینید: http://barnamenevis.org/showthread.php?229655
از نظر امنیتی فقط فکر میکنم دربرابر SQL Injection مقاوم هست، و ضمنا بجای ذخیرهء پسورد یا هش پسورد کاربر در کوکی، از یک کلید لاگین استفاده میکنه.
همهء اینایی که گفتم باید بعدا بهش اضافه کنم و ضعفهایی رو هم که داره برطرف کنم. احتمالا یه اینترفیس فارسی هم براش بسازم (دو زبانه) انشاا... .

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

abdollah110110
پنج شنبه 23 دی 1389, 01:13 صبح
از یک Hash که با Salt هم تولید شده استفاده کن
یعنی چه؟

بهتر نیست هربار کاربر user , password رو دستی وارد کنه؟

eshpilen
پنج شنبه 23 دی 1389, 08:14 صبح
یعنی موقعی که کاربر رو در سایت ثبت نام میکنید، نباید عین پسوردش رو در دیتابیس ذخیره کنید. بلکه مثلا هش MD5 پسورد رو ذخیره میکنید. ولی خود این هش هم باید به کمک Salt تولید شده باشه (این سالت هم در دیتابیس ذخیره میشه)، و از MD5 خام به تنهایی استفاده نکنید.
راستی تابع MD5 مدتهاست ضعیف بحساب میاد. شاید بهتر باشه از تابع دیگری استفاده کنید (مثلا SHA256 ه)

بهتر نیست هربار کاربر user , password رو دستی وارد کنه؟
منظورتون دقیقا چیه؟

abdollah110110
جمعه 24 دی 1389, 01:26 صبح
منظورم اینه میشه اصلا کوکی نداشته باشیم؟
چرا از با درست کردن یک لاگین خودکار، به هکرها کمک کنیم؟
اگر پسورد رو در کوکی نذاریم، کسی هم نمیتونه پسورد رو گیر بیاره.
یعنی من میگم درست کردن کوکی و لاگین خودکار دادن فرصت به هکرا نیست؟

eshpilen
شنبه 25 دی 1389, 10:21 صبح
بخاطر اینکه در عمل راحتی و فواید لاگین خودکار خیلی بیشتر از خطرات و هزینه هاش هست. و بعضی جاها میشه گفت تقریبا ضروری هست.
یعنی شما حساب کن مثلا از هر صد کاربر، شاید یکیش هک بشه. و از هر صدتایی که هک میشن، شاید یکیش خطرات و هزینه های جدی ای براش و برای جامعه به دنبال داشته باشه. البته توجه داشته باشید که این اعداد که بصورت مثال هم هستن و لزوما دقیق نیستن، درصورتی هست که سیستم لاگین خودکار شما درست طراحی شده باشه، وگرنه آمار هک شدن میتونه از این خیلی بالاتر بره، چون راههای بیشتر و راحت تری از سرقت کوکی برای نفوذ باز میشه.

حالا فکر کن بخاطر اون یک نفر از هر صدتا از هر صدتا، یعنی بنظرم یکی در هر ۱۰ هزار نفر، بیایم و وقت و انرژی ۹۹۹۹ نفر دیگر رو مدام هدر بدیم که علاوه بر این باعث مصرف منابعی مثل برق و پهنای باند بیشتر میشه. خلاصه ریز و درشت، با این تعداد زیاد در دفعات زیاد در واحدهای زمان، نتیجه میشه که هزینهء هنگفتی به بشریت تحمیل میشه!!

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

بهرحال هرکس مسئول حفظ امنیت PC خودش هست و PC خودش پسورد داره. اگر کوکی بخواد سرقت بشه، یعنی معمولا حفره های دیگری برای نفوذ وجود داشتن که بهرصورت، چه با کوکی و چه بدون کوکی، در خیلی موارد میتونن به نتایج یکسانی ختم بشن.
کسی هم که مجبور نیست اگر به حفظ امنیت PC خاصی اعتماد یا روش کنترل نداره، بیاد و بصورت دایمی لاگین کنه. در تقریبا همهء سایتها چک باکسی هست که میتونن علامت تیک اون رو بردارن تا بصورت موقت لاگین بشن و بعد از بسته شدن مرورگر یا زمان کوتاه خاصی، لاگ آوت بشن.

eshpilen
شنبه 25 دی 1389, 10:22 صبح
ضمنا گفتم هیچوقت پسورد رو حتی بصورت هش شده توی کوکی ذخیره نمیکنیم. بجاش از یک کلید لاگین جداگانه استفاده میکنیم.