# زبان های اسکریپتی > PHP > امنیت در PHP >  session

## under22

با سلام خدمت دوستان
من شنیدم که بعضی افراد سشن رو درون دیتابس ذخیره می کنند و دلیلشون هم اینه که امنیت بالاتر است .
میخاستم بدونم چرا امنیتش بالاتره و چه فرقی داره؟؟؟
و اینکه مدیریت این سشن چطوری میشه؟

----------


## mfeizi

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

----------


## سوداگر

1) برخی سایت ها که نیاز دارند به جای یک سرور واحد، چند سرور داشته باشند به خاطر یکپارچگی باید session ها را در دیتابیس ذخیره کرد.
2) کارایی (معمولاً) بالاتر
3) امنیت بیشتر در هاستهای اشتراکی
[منبع]

----------


## MMSHFE

یکسری امتیازات دیگه هم داره. مثلاً بدونیم کی آنلاینه. چندتا آنلاین داریم! توسط مدیر، یکی رو Logout کنیم (سشنش رو پاک کنیم و اصطلاحاً بندازیمش بیرون)، ببینیم یک کاربر از چند جا یا با چند مرورگر و... همزمان بیش از یکبار لاگین نکرده باشه و...

----------


## omidabedi

> یکسری امتیازات دیگه هم داره. مثلاً بدونیم کی آنلاینه. چندتا آنلاین داریم! توسط مدیر، یکی رو Logout کنیم (سشنش رو پاک کنیم و اصطلاحاً بندازیمش بیرون)، ببینیم یک کاربر از چند جا یا با چند مرورگر و... همزمان بیش از یکبار لاگین نکرده باشه و...


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

----------


## MMSHFE

ببینید، اگه شما با لاگین کردن کاربر، شناسه کاربریش رو توی سشن ذخیره کنید، کافیه وقتی میخواد لاگین کنه، یک کوئری بزنید ببینید این نام کاربری الآن توی جدول سشنها دارای رکوردی هست که Expire نشده باشه یا نه. باز هم بنظرتون عملی نیست؟

----------


## omidabedi

> ببینید، اگه شما با لاگین کردن کاربر، شناسه کاربریش رو توی سشن ذخیره کنید، کافیه وقتی میخواد لاگین کنه، یک کوئری بزنید ببینید این نام کاربری الآن توی جدول سشنها دارای رکوردی هست که Expire نشده باشه یا نه. باز هم بنظرتون عملی نیست؟


بنظرتون این کار مشکلی در حالات مختلف بوجود نمیاره؟مثلا کاربر انلاین هست برق میره ایا سشن نابود میشه یا خیر هنوزم هست؟
اگر سشن نابود نشه باز وقتی خواست لاگین کنه سیستم بهش گیر میده میگه شما لاگین هستید باید منتظر بمونه تا سشن اتوماتیک expire بشه در صورتی که چنین مکانیزمی باشه که مثلا اگر 10 دقیقه با ای دی کار نکرد سشن اتوماتیک اکسپایر بشه
تو بعضی از سیستم ها این قابلیت تعبیه شده اما بعضی سیستمای دیگه نه
واسه همین یکم فکر کنم دست برنامه نویسو میبنده
البته همه ی این افکار تا اونجایی بود که علمم قد میداد !

----------


## abolfazl-z

> یکسری امتیازات دیگه هم داره. مثلاً بدونیم کی آنلاینه. چندتا آنلاین داریم! توسط مدیر، یکی رو Logout کنیم (سشنش رو پاک کنیم و اصطلاحاً بندازیمش بیرون)، ببینیم یک کاربر از چند جا یا با چند مرورگر و... همزمان بیش از یکبار لاگین نکرده باشه و...


قطعا این عملیات هم با حالت سشن عادی انجام پذیر هست.

----------


## omidabedi

> قطعا این عملیات هم با حالت سشن عادی انجام پذیر هست.


برای مدیریت و مانیتور tarce کاربران نیاز هست save بشه فکر کنم

----------


## سوداگر

> قطعا این عملیات هم با حالت سشن عادی انجام پذیر هست.


به نظر خودتون کدومش راحت تره و کارایی بیشتری داره؟!

----------


## abolfazl-z

> برای مدیریت و مانیتور tarce کاربران نیاز هست save بشه فکر کنم


نه لازم نیست دوباره ذخیره کنیم.

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

----------


## abolfazl-z

> به نظر خودتون کدومش راحت تره و کارایی بیشتری داره؟!


قطعا دیتابیس !

ولی باز هم نمی تونم دقیق بگم.

اما مثلا برای خواندن تک تک سشن های با حجم کم نباید زیاد کار سنگینی باشه.

----------


## abolfazl-z

> 3) امنیت بیشتر در هاستهای اشتراکی


از چه لحاظی ؟

----------


## سوداگر

> از چه لحاظی؟


از لحاظ اینکه مسیر پیشفرض ذخیره شدنش در دسترس بقیه است ولی می توان با session.save_path مسیرش رو به صورت دستی به جایی که فقط خودتون دسترسی دارید تعیین کنید.
http://www.supernifty.org/blog/2008/...hosting-hack-3
و
http://phpsec.org/projects/guide/5.html رو هم یه نگاه بندازید.

----------


## abolfazl-z

> از لحاظ اینکه مسیر پیشفرض ذخیره شدنش در دسترس بقیه است


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

اصلا بحث هایی نظیر "به دلیل غیر امن بودن پوشه سشن و یا  ..." اشتباه است ! چراکه اگر هکر به پوشه سشن شما دسترسی پیدا کند یعنی سایت شما هک شده و این باگ هست.

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

در واقع ما داریم با این بحث ها به هر یک از روش های ذخیره سازی سشن درصد امنیت می دهیم که اینکار بستگی به برنامه ما دارد نه درصد امنیت. البته درصد امنیت هم کمی تاثیر گذار هست.

----------


## MMSHFE

> بنظرتون این کار مشکلی در حالات مختلف بوجود نمیاره؟مثلا کاربر انلاین هست برق میره ایا سشن نابود میشه یا خیر هنوزم هست؟
> اگر سشن نابود نشه باز وقتی خواست لاگین کنه سیستم بهش گیر میده میگه شما لاگین هستید باید منتظر بمونه تا سشن اتوماتیک expire بشه در صورتی که چنین مکانیزمی باشه که مثلا اگر 10 دقیقه با ای دی کار نکرد سشن اتوماتیک اکسپایر بشه
> تو بعضی از سیستم ها این قابلیت تعبیه شده اما بعضی سیستمای دیگه نه
> واسه همین یکم فکر کنم دست برنامه نویسو میبنده
> البته همه ی این افکار تا اونجایی بود که علمم قد میداد !


برای اینجور مواقع هم راهکار هست. مثلاً توی Gmail میاد پیام میده شما الآن با فلان IP هم لاگین هستین و اگه میخواین، اون یکی رو بندازم بیرون و برای این کار ازتون سؤال امنیتی و... رو میپرسه.
بهرحال خواستم بگم امکان انجام چنین کارهایی هم از امتیازات مدیریت دستی سشنهاست (حالا چه تو دیتابیس، چه توی فایلهایی توی مسیری که خودمون تعیین میکنیم). دیگه اینکه کی و کجا و چطور از این قابلیتها استفاده کنیم، بستگی به تجزیه و تحلیل خودمون داره و البته ارتباطی هم به موضوع تاپیک نداره که اینجا بخوایم پیگیریش کنیم.

----------


## MMSHFE

> اصلا بحث هایی نظیر "به دلیل غیر امن بودن پوشه سشن و یا  ..." اشتباه است ! چراکه اگر هکر به پوشه سشن شما دسترسی پیدا کند یعنی سایت شما هک شده و این باگ هست.


بنظرم این حرفتون کمی اشتباه باشه چون لزوماً ممکنه یک هکر دسترسی پیدا نکنه بلکه یک نفر که روی همون هاست اشتراکی، سرویس خریداری کرده دسترسی پیدا کنه (یکی از راههای هک کردن هم همینه و یکی از دلایل اینکه میگن امنیت سرور اختصاصی بیشتره هم همین مسئله است). بهرحال توی هاست اشتراکی همه کاربران به پوشه سشن دسترسی دارن ولی اگه هاست به خوبی تنظیم شده باشه، با Permission میشه جلوی دسترسی کاربران سرور رو به فایلهای سایر کاربران گرفت. اگه سرور ویندوز باشه هم که دیگه کویته!

----------


## omidabedi

> برای اینجور مواقع هم راهکار هست. مثلاً توی Gmail میاد پیام میده شما الآن با فلان IP هم لاگین هستین و اگه میخواین، اون یکی رو بندازم بیرون و برای این کار ازتون سؤال امنیتی و... رو میپرسه.
> بهرحال خواستم بگم امکان انجام چنین کارهایی هم از امتیازات مدیریت دستی سشنهاست (حالا چه تو دیتابیس، چه توی فایلهایی توی مسیری که خودمون تعیین میکنیم). دیگه اینکه کی و کجا و چطور از این قابلیتها استفاده کنیم، بستگی به تجزیه و تحلیل خودمون داره و البته ارتباطی هم به موضوع تاپیک نداره که اینجا بخوایم پیگیریش کنیم.


گوگل رو مطمئنید چونکه الان تست کردم با دوتا مرورگر لاگین شد بدون مشکل

----------


## MMSHFE

نه بحث IP هست. چند روز پیش با V-P-N وصل بودم (توی موبایل). اومدم با PC هم وصل شدم و بهم گفت ایمیل شما الآن توی امریکا هم لاگین شده. میخواین رمزتون رو عوض کنید (ضمن بیرون انداختن اون کلاینت) یا نادیده میگیرین؟

----------


## abolfazl-z

> بنظرم این حرفتون کمی اشتباه باشه چون لزوماً ممکنه یک هکر دسترسی پیدا نکنه بلکه یک نفر که روی همون هاست اشتراکی، سرویس خریداری کرده دسترسی پیدا کنه (یکی از راههای هک کردن هم همینه و یکی از دلایل اینکه میگن امنیت سرور اختصاصی بیشتره هم همین مسئله است). بهرحال توی هاست اشتراکی همه کاربران به پوشه سشن دسترسی دارن ولی اگه هاست به خوبی تنظیم شده باشه، با Permission میشه جلوی دسترسی کاربران سرور رو به فایلهای سایر کاربران گرفت. اگه سرور ویندوز باشه هم که دیگه کویته!


من قبلا که یک هاست اشتراکی داشتم، پوشه سشن ام داخل خود هاستم بود یعنی خارج از public_html .




> لزوماً ممکنه یک هکر دسترسی پیدا نکنه بلکه یک نفر که روی همون هاست اشتراکی،


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

اینطوری هم میشه که مثلا دو نفر در هاست اشتراکی به نام های A و B  هاست دارند.

هکر shell را در هاست A طزریق می کند و از طریق هاست A هاست B  را هم مورد حمله قرار می دهد.

----------


## MMSHFE

> من قبلا که یک هاست اشتراکی داشتم، پوشه سشن ام داخل خود هاستم بود یعنی خارج از public_html .


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



> کسی که از هر طریقی بدون اجازه صاحب هاست به اطلاعاتی که به وسیله روش های امنیتی محافظت می شود دسترسی پیدا کند هکر نامیده میشود.
> اینطوری هم میشه که مثلا دو نفر در هاست اشتراکی به نام های A و B  هاست دارند.
> هکر shell را در هاست A طزریق می کند و از طریق هاست A هاست B  را هم مورد حمله قرار می دهد.


بله میشه اینطوری هم به قضیه نگاه کرد. فقط منظور من این بود که ممکنه اون کسی که به اطلاعات شما دسترسی پیدا میکنه، واقعاً یک هکر (کسی که کارش همیشه نفوذ کردن به سایتهای دیگه است) نباشه و برحسب اتفاق بتونه دسترسی پیدا کنه و اگه اطلاعات سایتتون ارزشمند هست، بهتره برای امنیتش خودتون هم دست بکار بشین. کسی که توی خونه اش اشیاء قیمتی داره، فقط به بودن پلیس در شهر اکتفا نمیکنه و برای منزلش درب ضد سرقت و دزدگیر و... هم تهیه میکنه.

----------


## mahdi_1986

این مورد برای زمانی استفاده می شود که نشود با یک نام کاربری دو نفر همزمان لاگین کند،
من برای یک بانکی کنسول مانیتورینگ نوشتم انها می گفتن که نباید دو نفر بتونن با یک نام کاربری لاگین باشن( اگر نفر دوم لاگین کرد نفر اول باید logout بشه)
برای حل این مشکل من از روش دخیره کردن تو دیتا بیس استفاده کردم که جواب داد، هر بار که user لاگین می کرد سیشن عوض می‌شد.

----------


## majid1605

> سلام
>   خیلی جاها رو گشتم و مطالعه کردم راهها زیادی واسه امنیت سشن  ها معرفی کرده بودند ولی دوتا راه بود که بیشترین استفاده رو ظاهرا دارند  یکی کد کردن اطلاعات درون خود سشن هاست یکی دیگه ذخیره سشن ها درون دیتابیس  و جلوگیری از ایجاد فایل سشن در پوشه tmp
> این روشها هم بیشتر به خاطر اشتراکی بودن سرورها مد نظره وگرنه در سرورهای  اختصاصی و مجازی بحث فرق می کنه منظور بنده هم همین سرورهای اشتراکی هست.
> البته یه راه دیگه هم هست اینه که از ip و اطلاعات سیستم طرف کمک بگیریم و  یک سش که محتویاتش اطلاعات سیستم یا ip و... کاربره که همیشه اونو چک می  کنیم و در صورت مغایرت کاربر باید دوباره لاگین کنه که راه ساده و میتونه  تا حدودی مفید باشه
> 
> اما کد گذاری اطلاعات خب ما باید اطلاعات رو به نوعی کد گذاری کنیم بر فرض  با sha256 حالا یک salt هم بزاریم تنگش واسه محکم کاری اما این روش هم واسه  بررسی نیاز داره هر سشن به دیتابیس رجوع کنیم تا به طور مثال username رو  بگیریم هش کنیم و با مقدار سشن بررسی کنیم .حالا راه دیگه ایی هست بگید  ممنون میشم
> راه دیگه ذخیره کامل سشنها در دیتابیس هست که اون هم نیاز به رجوع کردن به دیتابیس هست
> وقتی داریم از سشن ها استفاده می کنیم یکی از دلایلش می تونه عدم مراجعه  مکرر به پایگاه داده باشه اگه قرار باشه هربار که سشنی رو بررسی می کنیم چه  دلیلی داره از سشنها واسه ذخیره سایر دادهها استفاده کنیم؟ از همون  دیتابیس مستقیما واکشی می کنیم.
> یه سوال دیگه،سایتهای که سیستم ثبت نام دارن اکثر امکانات سایت رو در  اختیار کاربران ثبت نام کننده قرار میدن حالا وقتی یک سایت 90% صفحاتش  اینجوری قابل دسترسه ایا این رجوع اضافی واسه سش به پایگاه داده کار  درستیه؟


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

----------


## MMSHFE

> وقتی داریم از سشن ها استفاده می کنیم یکی از دلایلش می تونه عدم مراجعه  مکرر به پایگاه داده باشه اگه قرار باشه هربار که سشنی رو بررسی می کنیم چه  دلیلی داره از سشنها واسه ذخیره سایر دادهها استفاده کنیم؟ از همون  دیتابیس مستقیما واکشی می کنیم.


مطمئنید به راحتی سشن میتونید فقط با دیتابیس بحث لاگین و لاگ اوت کاربر و اینکه الان لاگین هست یا نه رو مدیریت کنید؟ توی هر صفحه چطور میخواین بفهمین کاربر لاگین شده یا نه؟ اگه مرورگر رو بدون کلیک روی لینک خروج از سایت بست، چطور میخواین بطور خودکار سشن رو Expire کنید؟ از Cron استفاده میکنید تا کاربرانی که فرضاً 20 دقیقه است کاری نکردن رو پیدا کنید و بندازین بیرون؟ فکر نمیکنید این کار دردسر زیادی داره و باعث میشه همه جای برنامه نگران این مسئله باشین و از تمرکز روی منطق اصلی برنامه دور بشین؟



> یه سوال دیگه،سایتهای که سیستم ثبت نام دارن اکثر امکانات سایت رو در  اختیار کاربران ثبت نام کننده قرار میدن حالا وقتی یک سایت 90% صفحاتش  اینجوری قابل دسترسه ایا این رجوع اضافی واسه سش به پایگاه داده کار  درستیه؟


رجوع به دیتابیس وقتی موتور دیتابیس و موتور PHP روی یک سرور هستن، آنچنان بار اضافه ای ایجاد نمیکنه. بعلاوه مجبور نیستین با دیتابیس کار کنید. میتونید با همون سیستم فایل کار کنید ولی پوشه ذخیره سازی سشن رو عوض کنید و توی سایت خودتون بیارین و از پوشه مشترک استفاده نکنید. مهم، ایده استفاده نکردن از تنظیمات پیشفرض سشن توی هاستهای اشتراکیه.

----------

