مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

mohammadd

عضویت از 1395/12/08

امن کردن Session

  • دوشنبه 30 اردیبهشت 1398
  • 13:10
تشکر میکنم

سلام

من تو سایتم قسمت ورود به سیستم دارم که میره نام کاربری و رمز عبور رو بررسی میکنه و آی دی کاربر رو داخل یه سشن ذخیره میکنه و تو طول برنامه استفاده میکنه

حالا از نظر امنیتی به مشکل خوردم میخوام به هرکاربر بعد از لاگین یه Token بدم که با اون توکن تو سایت بچرخه نه یا آی دی کاربریش

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

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

salman_b

عضویت از 1396/02/18

  • چهارشنبه 1 خرداد 1398
  • 09:15

سلام

به اینکار نمیگن امن کردن Session

دوست من یه سری مهندس خیلی کاربلد توی مایکروسافت فریم ورک رو طراحی و پیاده‌سازی می‌کنن و با همه‌ی چالش‌های وب و امنیت و ... هم مسلط هستن.

پس امن کردن Session خیلی حرف عجیبی هستش!

حالا اگه از این نگرانی که چرا id کاربر رو میدی بهش و کلید session هم همونه و کاربر میتونه به راحتی یه id دیگه رو تست کنه مشکل از session نیست. اگه نگاه کنی زمانی که مایکروسافت کوکی‌های session based رو ایجاد میکنه اونها رو encrypt میکنه و میفرسته سمت client.

حالا شما هم همین کار رو باید بکنی. یه کلاس بساز که id کاربر داخلش باشه و یه مقدار random رو هم به عنوان salt واسه کلاست در نظر بگیر. این کلاس به json تبدیل کن و encrypt کن و بفرست سمت کلاینت.

واسه اینکار میتونی از jwt هم استفاده کنی که پیاده‌سازیش اصلا کاری نداره و توسط چندتا کتابخانه که مایکروسافت داده به راحتی انجام میشه. راجع بهش جستجو کن و انجام بده.

و این رو بدون که وقتی میگی token یعنی stateless. اگه میخوای از token به صورت statefull استفاده کنی پس میشه همون session! 

در کل tokenها برای اینکه نیاز نیست جایی ذخیره بشن و همه‌ی آنچه نیاز هست رو داخل خودشون دارن کاربردی هستن وگرنه اگه نیاز بود که واسشون جدول ساخته بشه و هر بار با اون داده پایگاه داده‌ای مقایسه بشه که دیگه به چه دردی میخورد اصلا!

شما token رو بده به کاربر که داخل اون هم هیچ چیزی به غیر از session id نیست. و اطلاعاتی که میخوای رو از session کاربر بخون.

tokenها کاربردهای خاصی دارن و اکثر authotizationهای دنیای واقعی با session پیاده میشن، چون نمیتونن stateless باشن!

کاربرد token هم مثلا زمان پرداخت بانکی یا سایت آنتن و یا استفاده کردن از یه api (مثلا نقشه گوگل) که نیاز به double check سمت سرور ندارن کاربرد داره.

فکر کنم الان بهتر بتونی راجع به کارت تصمیم‌گیری کنی.

اگه بخوای همین روش خودت رو بری جلو، ساختار جدولت که اصلا چیز خاصی نداره. فیلدهایی که نیاز داری برای سطوح دسترسی کاربر به جدولت اضافه کن (اگه خیلی این فیلدها زیاد هستن به صورت json داخل یه ستون نگهداری کن و واسه هر bool یه ستون درنظر نگیر) و یه رابطه یک به یک بین جدول کاربر و token ایجاد کن و تمام.
اینجا آقای وحید نصیری پیاده‌سازی این موضوعی که شما میخوای رو انجام داده و میتونی عین همین جلو بری. (من اصلا ذخیره‌سازی در پایگاه‌داده رو پیشنهاد نمیکنم اما خود دانی)

موفق باشی.wink

کاربر سایت

mohammadd

عضویت از 1395/12/08

  • چهارشنبه 1 خرداد 1398
  • 10:16

منم عنوان رو بد زدم شاید

من الان با نرم افزار Brup Suit نه سایت خودم خیلی از سایت های دیگرو که رفتم و لاگین کردم سشن رو ذخیره کردم و بعد از logout دوباره با نرم افزار به سورو پاس دادم دوباره بدون پرسیدم نام کاربری و پس وارد شدم

منظورم از امن ککردن سشن اینه

اینکه کاربر نتونه سشن رو کپی کنه و بعد بتونه بدون احراض هویت وارد سایت بشه یا حتی بتونه به نوعی با تغییر دادن مقدار داخل سشن سطح کاربری غیر مجاز رو داشته باشه

امیدوارم تونسته باشم اینبار منظورمو کامل برسونم

الان خیلی سایتها رو چک کردم و با کمی تست موفق شدم سطح دسترسی ادمین پیدا کنم و این مشکل رو سایت خودمم داره

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

کاربر سایت

salman_b

عضویت از 1396/02/18

  • چهارشنبه 1 خرداد 1398
  • 15:03

آهان
ببین اون سایت‌هایی که تست کردی از Session استفاده نمیکردن. چون اگه Session بود موقع logout حتما پاک یا invalid میشد.

یه راه ساده‌اش اینه که سایت خودت رو وقتی local داری تست میکنی وقتی برنامه سمت سرور رو reset میکنی باز هم لاگین هستی به سیستم و این یعنی هیچ session سمت سرور نبوده و با reset شدن سرور session پاک نشده.

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

مثل Basic Authentication در ASP.MVC
زمانی که Logout میکنی صرفا کوکی رو از سمت کلاینت پاک کردی و چیزی سمت سرور دست نمیخوره! و چون با این نرم افزار کوکی رو ذخیره کردی میاره میذاره سرجاش و ...

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

حتی تلگرام و گوگل هم اینطوری مشکل امنیتی دارن!!!

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

این آسیب پذیری همیشه وجود داره. البته مرورگر‌ها یه سری تنظیمات امنیتی دارن مثلا کوکی احراز هویت توسط جاوااسکریپت خونده نشه یا مثل این... اینطوری کسی نمیتونه از بیرون کوکی تو رو بدزده و ... اما اینکه خودت کوکی خودت رو جابه جا کنی یا یه بدفزار روی سیستمت به یه نحوی به این کوکی دست پیدا کنه دیگه مشکل سایت نیست. البته مروگر‌های معروف بسیار ایمن هستن در این موارد و کاربر رو چیزی تهدید نمیکنه مگر اینه خود کاربر این دسترسی رو تعریف کنه.

موفق باشی.

کاربر سایت

mohammadd

عضویت از 1395/12/08

  • یکشنبه 5 خرداد 1398
  • 13:56

ممنون از راهنماییت ولی بهتر بود زمانی که از جواب سوالی مطمئن هستیم جواب بدیم

راه کاری که خودم دارم استفاده میکنم مشکلم رو حل میکنه فقط مشکلم ارتباط بیش از حد با بانک هست که به مرور میتونه سرعتم رو بیاره پایین و سایتم رو کند کنه

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)