سیستم لاگین امن

phpweb

Active Member
من یه سیستم لاگین دارم، کارهای امنیتی که انجام دادم اینه که سسشن ها رو توی دیتابیس ذخیره می کنم. پسورد رو چندبار هش می کنم.

برای جلوگیری از اسپمرها بغیر از تصویر captcha چیکار باید بکنم؟
می خوام این امکان رو بوجود بیارم که اگه چندبار لاگین ناموفق کرد، برای 30 دقیقه امکان لاگین رو غیر فعال کنم. برای اینکار چه راهی ایمن تر هست؟ ذخیره کردن یه رشته هش توی کوکی بهتره یا اینکه آی پی کاربر (با توجه به متغیر بودن آی پی کاربران ایرانی) رو توی دیتابیس ذخیره کنم و بر اساس ای پی تصمیم بگیرم؟
 

tofan8

New Member
من یه سیستم لاگین دارم، کارهای امنیتی که انجام دادم اینه که سسشن ها رو توی دیتابیس ذخیره می کنم. پسورد رو چندبار هش می کنم.

برای جلوگیری از اسپمرها بغیر از تصویر captcha چیکار باید بکنم؟
می خوام این امکان رو بوجود بیارم که اگه چندبار لاگین ناموفق کرد، برای 30 دقیقه امکان لاگین رو غیر فعال کنم. برای اینکار چه راهی ایمن تر هست؟ ذخیره کردن یه رشته هش توی کوکی بهتره یا اینکه آی پی کاربر (با توجه به متغیر بودن آی پی کاربران ایرانی) رو توی دیتابیس ذخیره کنم و بر اساس ای پی تصمیم بگیرم؟
از هردو روش استفاده کنید . همچنین اگه لاگین فقط برای قسمت ادمین هست روی فولدر ادمین پسورد بزارید و اسمش رو هم تقیر بدید .
 

phpweb

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

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

برای این موضوع چکار باید کرد؟
 

tofan8

New Member
آخه نمی شه به آی پی کاربرها اطمینان کرد. چون داینامیک هستن.

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

برای این موضوع چکار باید کرد؟
در مورد کوکی ها چون سمت کلاینت هست نمیتونی کاریش بکنی (کلا در موارد امنیتی روی کد های سمت کلاینت حساب نکن ) .
شما لوگینتون باسا ادمین هست یا کاربر ؟
 

phpweb

Active Member
در مورد کوکی ها چون سمت کلاینت هست نمیتونی کاریش بکنی (کلا در موارد امنیتی روی کد های سمت کلاینت حساب نکن ) .
شما لوگینتون باسا ادمین هست یا کاربر ؟
هم کاربر وهم ادمین باید بتونن لاگین کنن.

اگر برنامه ای بیاد و توی هر درخواست کوکی ها رو حذف کنه، تقریبا سیستم لاگینی که بر پایه کوکی هست ناقص طراحی شده.

تشخیص آی پی هم چندان روش مناسبی نیست چون آی پی های داینامیک رو نمی تونه تشخیص بده.

البته بنظر خودم می شه یه فیلد مخفی ایجاد کرد و تعداد لاگین ها رو توی این فیلد قرار بدیم. اگر تعداد لاگین های نا موفق بیشتر از 5 تا بود امکان لاگین کردن رو غیر فعال کنیم. هرچند می شه فیلدهای یه فرم رو هم دستکاری کرد.

تنها راهی که جلوی اسپمر رو می گیره همین تصاویر captcha هستن که قابل اطمینان هستن.
 

tofan8

New Member
هم کاربر وهم ادمین باید بتونن لاگین کنن.

اگر برنامه ای بیاد و توی هر درخواست کوکی ها رو حذف کنه، تقریبا سیستم لاگینی که بر پایه کوکی هست ناقص طراحی شده.

تشخیص آی پی هم چندان روش مناسبی نیست چون آی پی های داینامیک رو نمی تونه تشخیص بده.

البته بنظر خودم می شه یه فیلد مخفی ایجاد کرد و تعداد لاگین ها رو توی این فیلد قرار بدیم. اگر تعداد لاگین های نا موفق بیشتر از 5 تا بود امکان لاگین کردن رو غیر فعال کنیم. هرچند می شه فیلدهای یه فرم رو هم دستکاری کرد.

تنها راهی که جلوی اسپمر رو می گیره همین تصاویر captcha هستن که قابل اطمینان هستن.

برنامه حذف و تقییر کوکی ها که خیلی وقته آمده شما اصلا روی اینا حساب باز نکن .
باسه لاگین یوزر ها که همون captchaکد مناسبه . اما اگه ادمین خیلی باست مهم هست یه سوال امنیتی هم ایجاد کن که جوابش رو خود ادمین بدونه و برای لوگین کردن به اون هم جواب بده .
 

phpweb

Active Member
برنامه حذف و تقییر کوکی ها که خیلی وقته آمده شما اصلا روی اینا حساب باز نکن .
باسه لاگین یوزر ها که همون captchaکد مناسبه . اما اگه ادمین خیلی باست مهم هست یه سوال امنیتی هم ایجاد کن که جوابش رو خود ادمین بدونه و برای لوگین کردن به اون هم جواب بده .

می خوام یکی دو بار لاگین کنه، اگر درست نبود اون وقت captcha رو نمایش بدم. با توجه به وجود نرم افزارهایی که کوکی ها رو تغییر می دن، برای اینکار باید از کوکی استفاده کنم یا راهی دیگه هم هست؟
 

tofan8

New Member
یه راه هست اونم اینه که وقتی برای لوگین شدن یه یوزر وارد میشه اونو توی پایگاه داده همراه با مقدار time() و تعداد تلاش برای لوگین ذخیره کنی . اما بازم یه مشکل داره اینه که وقتی یوزر اصلی بخواد لوگین کنه به مشکل میخوره . مثل یاهو
اگه خیلی باستون مهمه کلا captcha نمایش داده بشه ولی رو ip هم تا حدودی میشه حساب کرد آخه شرکت های isp تا یه رنج محدودی ip دارن در صورتی اگه بخوای پسورد یه یوزر رو حدث بزنی باید میلیون ها بار با پسورد تصادفی برای لوگین شدن تلاش کرد (البته با نرم افزار هایی که طراحی شده ):cool:
 

masima

Member
یه راه هست اونم اینه که وقتی برای لوگین شدن یه یوزر وارد میشه اونو توی پایگاه داده همراه با مقدار time() و تعداد تلاش برای لوگین ذخیره کنی . اما بازم یه مشکل داره اینه که وقتی یوزر اصلی بخواد لوگین کنه به مشکل میخوره . مثل یاهو
خوب معلومه اینجوری میشه ؛ مگه اینکه بخواد از رو DNA یا اثر انگشت ! :-? تشخیص بده که کسی که تلاش میکنه لاگین کنه واقعا یه مهاجمه یا بنده خدا پسوردشو یادش رفته ! :) :wink:
 

phpweb

Active Member

خوب معلومه اینجوری میشه ؛ مگه اینکه بخواد از رو dna یا اثر انگشت ! :-? تشخیص بده که کسی که تلاش میکنه لاگین کنه واقعا یه مهاجمه یا بنده خدا پسوردشو یادش رفته ! :) :wink:
شما چه راهی برای امنیت یه سیستم لاگین پیشنهاد می دید؟
 
آخرین ویرایش:

tofan8

New Member

خوب معلومه اینجوری میشه ؛ مگه اینکه بخواد از رو DNA یا اثر انگشت ! :-? تشخیص بده که کسی که تلاش میکنه لاگین کنه واقعا یه مهاجمه یا بنده خدا پسوردشو یادش رفته ! :) :wink:
اصلا متوجه حرف من نشدید :lol:
 

Domanjiri

Well-Known Member
سلام
پسورد رو چندبار هش می کنم

دوبار hash کردن برخلاف اونچه که به نظر میرسه، امنیت رو پایین میاره ! چه برسه به اینکه چند بار hash کنیم..

چرا: وقتی یه عبارت رو hash می کنید ، یه رشته با طول 32 و شامل اعداد0 تا 9 و حروفa تا f بهتون میده، حالا وقتی این رشته ی جدید رو hash میکنید در واقع یه عبارت ساده تر از عبارت اولیه رو دارین هش می کنید(عبارت اول ممکنه توش x ,z ,j و.. داشته باشه).حالا احتمال اینکه با یکبار هش کردن یه متن، عبارت دوبار هش شده ی شما تولید بشه بیشتره!!

مسلئه امنیت لاگین و .. مسئله ای نیست که بخواید توش ایده بزنید ( چون احتمال اینکه اشتباه کنید بسیار زیاده، حتی اگه یه تیم برنامه نویس هستید این یه ریسک هست!) توی اینترنت سرچ کنید، کم بحث نشده راجع به همین سوالایی که شما توی ذهنتون هست!


موفق باشید.
 

phpweb

Active Member
سلام


دوبار hash کردن برخلاف اونچه که به نظر میرسه، امنیت رو پایین میاره ! چه برسه به اینکه چند بار hash کنیم..

چرا: وقتی یه عبارت رو hash می کنید ، یه رشته با طول 32 و شامل اعداد0 تا 9 و حروفa تا f بهتون میده، حالا وقتی این رشته ی جدید رو hash میکنید در واقع یه عبارت ساده تر از عبارت اولیه رو دارین هش می کنید(عبارت اول ممکنه توش x ,z ,j و.. داشته باشه).حالا احتمال اینکه با یکبار هش کردن یه متن، عبارت دوبار هش شده ی شما تولید بشه بیشتره!!

مسلئه امنیت لاگین و .. مسئله ای نیست که بخواید توش ایده بزنید ( چون احتمال اینکه اشتباه کنید بسیار زیاده، حتی اگه یه تیم برنامه نویس هستید این یه ریسک هست!) توی اینترنت سرچ کنید، کم بحث نشده راجع به همین سوالایی که شما توی ذهنتون هست!


موفق باشید.
منظورم sha1 و md5 به همراه یه رشته دلخواه بود. شما دیکشنریهایی که رشتههای هش شده رو ترجمه می کنن رو هم باید در نظر بگیرید. درثانی طبق اصول، این الگوریتمها باید برای هر رشته، یه رشته منحصر به فرد ایجاد کنن، پس تحت هیچ شرایطی نباید رشته تکراری برگردونن حتتی اگه پشت سر هم 100 بار ازشون استفاده کنیم.

دنبال ایده نیستم، به هرحال کارهایی که می شه کرد استفاده از captcha ، کوکی و ثبت آی پی هست.

بهترین راهی که پیشنهاد شده چیه؟
 

masima

Member
tofan8
اصلا متوجه حرف من نشدی
بر عکس کاملا متوجه شدم ؛ فقط خوستم شوخی کنم!
هر روشی یه خوبی داره یه بدی دیگه ! اگه بخوای زیادی برای مهاجم سخت بگیری اونوقت ممکنه کاربرای سایت وقتی ببینن بیش از حد دارن اذیت میشن ممکنه بی خیال این سایته شن و برن ...

phpweb
می خوام یکی دو بار لاگین کنه، اگر درست نبود اون وقت captcha رو نمایش بدم. با توجه به وجود نرم افزارهایی که کوکی ها رو تغییر می دن، برای اینکار باید از کوکی استفاده کنم یا راهی دیگه هم هست؟
شما چه راهی برای امنیت یه سیستم لاگین پیشنهاد می دید؟
سایت کجا رو دارید طراحی میکنید؟ که این قدر امنیت براتون مهمه ! نکنه برا سازمان ناساست (که خیلی هم هک میشه!) ؟
از همین روش هایی که دیگران استفاده میکنن شما هم بهره ببرید ! به نظرم دارید خیلی سخت میگیرید!
 
آخرین ویرایش:

Domanjiri

Well-Known Member
منظورم sha1 و md5 به همراه یه رشته دلخواه بود. شما دیکشنریهایی که رشتههای هش شده رو ترجمه می کنن رو هم باید در نظر بگیرید. درثانی طبق اصول، این الگوریتمها باید برای هر رشته، یه رشته منحصر به فرد ایجاد کنن، پس تحت هیچ شرایطی نباید رشته تکراری برگردونن حتتی اگه پشت سر هم 100 بار ازشون استفاده کنیم.

درود بر شما

استفاده از همچین عباراتی sha1(md5($pass)) حتی بی فایده تر هم هست!!
چرا: چون شما یه داده 128 بیتی رو به عنوان آرگومان میدی و یه خروجی 256 بیتی می گیری، اگه خیلی نخوایم تخصصی بگیم، به زبون ساده 50 درصد خروجی حشو محسوب میشه!
مقابله با دیکشنری ها راه خودش رو داره که همون استفاده از salt هست..

بله، رشته ی تکراری ابدا بر نمی گردونن، بالا هم گفتم که وقتی یه عبارت یه بار هش میشه، خروجیش شامل اعدا 0 تا 9 و حروف a تا f هست، شما جایگشت اینو مقایسه کن با انتخابی که کاربر برای تعیین پسورد داره (0-9 و a-z و _ و.. ). الان عبارت هش شده ای که شما بدست میارید ممکنه هش شده ی a56c24dfbb8d باشه، در حالی که اصل پسورد zjhd5q4f1h این بوده باشه(متوجه شدین؟)، حالا کدوم زودتر پیدا میشه؟؟(نگین دومی!)
بهترین راهی که پیشنهاد شده چیه؟
نه دیگه، قرار شد سرچ کنید...(چه خوبه که عادت کنیم به این کار!)

پیروز باشید
 

phpweb

Active Member
درود بر شما

استفاده از همچین عباراتی sha1(md5($pass)) حتی بی فایده تر هم هست!!
چرا: چون شما یه داده 128 بیتی رو به عنوان آرگومان میدی و یه خروجی 256 بیتی می گیری، اگه خیلی نخوایم تخصصی بگیم، به زبون ساده 50 درصد خروجی حشو محسوب میشه!
مقابله با دیکشنری ها راه خودش رو داره که همون استفاده از salt هست..

بله، رشته ی تکراری ابدا بر نمی گردونن، بالا هم گفتم که وقتی یه عبارت یه بار هش میشه، خروجیش شامل اعدا 0 تا 9 و حروف a تا f هست، شما جایگشت اینو مقایسه کن با انتخابی که کاربر برای تعیین پسورد داره (0-9 و a-z و _ و.. ). الان عبارت هش شده ای که شما بدست میارید ممکنه هش شده ی a56c24dfbb8d باشه، در حالی که اصل پسورد zjhd5q4f1h این بوده باشه(متوجه شدین؟)، حالا کدوم زودتر پیدا میشه؟؟(نگین دومی!)

نه دیگه، قرار شد سرچ کنید...(چه خوبه که عادت کنیم به این کار!)

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

من اول md5 می کنم، بعد salt یه خطی اضافه می کنم و بعد sha1 و بعد دوباره saltاضافه می کنم. تا اینجا توی پروژه های مختلف فقط رشته سالت عوض می شه ولی برای تکراری نشدن الگوریتم یه چندباری هش می کنم (تعداد هش کردن توی پروژه های مختلف متفاوته ولی معمولا یک یا حداکثر دوبار بار هش می کنم).
 

Domanjiri

Well-Known Member
اینطور که شما می گید بهتره اصلا هش نکنیم. وقتی یبار هش کنیم، رشته برگشتی فقط از حروف و اعداد تشکیل می شه وقتی چندبار هش کنیم، رشته برگشتی بازم از حروف و اعداد تشکیل می شه.

اینکه خروجی اولین هش 0-9 a-f هست ، که هیچ ایرادی نداره! شما یه لحظه عمیقا(!) چیزایی که نوشتم رو بخونید و سعی کنید با تمام وجود منظورمو بگیرین (!!:green:)
من اول md5 می کنم، بعد salt یه خطی اضافه می کنم و بعد sha1 و بعد دوباره saltاضافه می کنم. تا اینجا توی پروژه های مختلف فقط رشته سالت عوض می شه ولی برای تکراری نشدن الگوریتم یه چندباری هش می کنم (تعداد هش کردن توی پروژه های مختلف متفاوته ولی معمولا یک یا حداکثر دوبار بار هش می کنم).
وسواس به خرج دادن همیشه هم مفید نیستااا..بلکه برخی مواقع باعث اتفاق هایی میشه که آدم اصلن انتظارش رو نداره، شما کاری رو بکن که "لازم" و "کافی" هست، نه بیشتر...[البته کد، کد شماست و ..اختیارش هم دست شما].انرژی خودتون رو در جای درست صرف کنید.

موفق باشید.
 

Cyletech

Member
این همه حرف و حدیث واسه چیه؟ راهی که من پیشنهاد میدم ، اول امنیت کل نرم افزارتونه. اگر جای دیگه باگ داشته باشه نیازی هم لوگین کردن نیست :) در قدم دوم بدترین اشتباه ممکن رو کردید که سشن رو در پایگاه داده ذخیره کردید. اصلاً سشن خودش جای دیگه ذخیره میشه شما دیگه چرا ذخیره می کنید؟ قدم سوم ، از دو تابع مشهور hash و md5 بصورت زیر استفاده کنید.
PHP:
hash( 'sha256', md5( 'passworde shoma' ) );
قدم چهارم ، هم زمان از کوکی و سشن استفاده کنید و این امکان رو به کاربر بدید که بتونه لوگینش رو حفظ کنه با تیک زدن دگمه remember me
 

phpweb

Active Member
این همه حرف و حدیث واسه چیه؟ راهی که من پیشنهاد میدم ، اول امنیت کل نرم افزارتونه. اگر جای دیگه باگ داشته باشه نیازی هم لوگین کردن نیست :) در قدم دوم بدترین اشتباه ممکن رو کردید که سشن رو در پایگاه داده ذخیره کردید. اصلاً سشن خودش جای دیگه ذخیره میشه شما دیگه چرا ذخیره می کنید؟ قدم سوم ، از دو تابع مشهور hash و md5 بصورت زیر استفاده کنید.
PHP:
hash( 'sha256', md5( 'passworde shoma' ) );
قدم چهارم ، هم زمان از کوکی و سشن استفاده کنید و این امکان رو به کاربر بدید که بتونه لوگینش رو حفظ کنه با تیک زدن دگمه remember me
می شه بگید اگه توی سرورهای اشتراکی، سسشن ها رو توی دیتابیس بریزم کجاش اشتباست؟ حتما اطلاعاتی در مورد ضعف امنیت در پوشه tmp دارید ولی نمی دونم چرا این حروف رو می زنید. لطفا دلیل بیارید.

می شه بگید sha256 با sha1 چه فرقی می کنه؟
 

Cyletech

Member
می شه بگید اگه توی سرورهای اشتراکی، سسشن ها رو توی دیتابیس بریزم کجاش اشتباست؟
سشن خودش روی سرور ذخیره میشه. چه نیازی هست که شما توی پایگاه داده ذخیره کنید؟ البته منظور من سشن مهم هست. مثلاً سشن آیدی یا همون phpsessid به هیچ وجه نباید در جایی غیر از سرور و مرورگر ذخیره بشن. از نظر امنیتی درست نیست.
اشتراکی بودن یا نبودن سرور اینجا مهم نیست.
 

جدیدترین ارسال ها

بالا