PDA

View Full Version : سوال: دو سوال در مورد SESSION و cookie



reza10wert
سه شنبه 08 فروردین 1391, 00:47 صبح
سلام اساتید محترم
بنده 2 سوال داشتم
1- فرق بین session و cookie در چی هست ؟ ( به طور کامل )
2- مدت زمان انقضای پیش فرض هر کدام چند ثانیه هست و روش وارد نمودن زمان اعتبار ( انقضا ) هر کدام به چه نحوی هست ؟

reza10wert
سه شنبه 08 فروردین 1391, 09:25 صبح
به روز رسانی

eshpilen
سه شنبه 08 فروردین 1391, 10:28 صبح
کوکی چون در سمت کلاینت ذخیره میشه نمیشه به دست نخورده بودن اطلاعاتی که شما بعنوان برنامه نویس توش ذخیره میکنید اعتماد کرد.
فرضا اگر در کوکی ذخیره کنید user=reza156، کاربر میتونه اون رو به user=admin تغییر بده.
اما اطلاعاتی که در سشن ذخیره میکنید در سمت سرور ذخیره میشن و امنیت خیلی بیشتری دارن. کاربر در PC خودش قادر نیست اون اطلاعات رو دستکاری بکنه.

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

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

narsic
سه شنبه 08 فروردین 1391, 10:51 صبح
و برای سوآل دومتون هم:
Session در هر صورت به محض بسته شدن مرورگر کاربر از بیت میره (پایان جلسه کاری - در بعضی از مرورگر های جدید میتوان جلسه کاری را با بستن مرورگر نیز نگه داشت)، اما کوکی خیر شما میتونید با مقدار دهی زمان به کوکی طول عمرش رو مشخص کنید.
برای تعیین طول عمر کوکی از روش زیر استفاده میشه:

setcookie("TestCookie", $value, time()+3600);
همونطور که میبینید پارامتر سوم تعیین کننده طول عمر کوکی هست و این طول عمر براساس timestamp باید باشه، در مثال بالا من طول عمر رو برای یک ساعت تنظیم کردم.
اطلاعات کامل در مورد کوکی:
http://www.php.net/manual/en/reserved.variables.cookies.php
توضیحات کامل در مورد Session:
http://www.php.net/manual/en/reserved.variables.session.php
نوروز مبارک
موفق باشید.

eshpilen
سه شنبه 08 فروردین 1391, 20:40 عصر
Session در هر صورت به محض بسته شدن مرورگر کاربر از بیت میره
از بین رفتن سشن با بسته شدن مرورگر بخاطر اینه که شناسایی سشن به کوکی سشن نیاز داره و طول عمر کوکی سشن هم بطور پیشفرض تا زمان باز بودن مرورگر تنظیم شده.
اما میشه کاری کرد که کوکی سشن هم مثل بقیهء کوکی ها طول عمر بیشتری داشته باشه و با بسته شدن مرورگر پاک نشه.
برای این کار از تابع session_set_cookie_params باید استفاده بشه:


session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure]]] )


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

فکر میکنم اگر سشن رو درحالت پیشفرض بذاریم راحتتر باشه. چون حساسه و نمیشه براحتی بهش اعتماد کرد.
بنده شخصا برنامم (یک سیستم رجیستر و لاگین) رو طوری نوشتم که فرضا برای لاگین موندن کاربر از سشن استفاده میکنه، ولی اگر سشن پاک بشه میاد و از روی کوکی auto-login که قبلا ست شده دوباره کاربر رو شناسایی میکنه و دوباره یک سشن احراز هویت ست میکنه. در نتیجه در دفعات بعدهم بجای دیتابیس از سشن برای احراز هویت کاربر استفاده میشه، تا زمانیکه دوباره سشن از بین بره و این جریان دوباره تکرار میشه.
البته یادم نیست شاید طول عمر کوکی سشن رو در برنامه تغییر داده باشم.

reza10wert
چهارشنبه 09 فروردین 1391, 09:22 صبح
خوب دوست عزیز میشه هم زمان هم از سشن و هم از کوکی استفاده کرد ؟
با این کار میشه دو جا ذخیره کرد
میشه ؟

eshpilen
چهارشنبه 09 فروردین 1391, 13:15 عصر
شدنش که میشه. چرا نمیشه!
ولی اینکه این کار تاچه حد نیاز یا مفید باشه بستگی به هر مورد خاص داره.
اگر مثالی از اطلاعاتی که میخوای هم در سشن و هم در کوکی ذخیره کنی بزنی و بگی چرا بنظرت این مفید است میتونیم بررسیش کنیم.
البته بنده خودم مشابه یک همچین کاری رو کردم برای لاگین نگه داشتن کاربر به مدت طولانی. بهرحال این کار در اون مورد به دلایلی مفیده، اما بازم ضروری نیست.
دلیلش چی بود؟
دلیلش این بود که میخواستم از سشن برای لاگین خودکار کاربر استفاده کنم چون سشن از فایل برای ذخیرهء اطلاعات در سمت سرور استفاده میکنه و بنابراین نسبت به دیتابیس سریعتر و سبک تره. اما وقتی میخوایم کاربر تا 6 ماه لاگین باقی بمونه نمیشه براحتی به پایداری سشن برای این مدت اعتماد کرد و تنظیم صحیحش دردسر داره، بنابراین یک کوکی هم میذاریم با طول عمر 6 ماه که درش کلید لاگین مخصوص اون کاربر ذخیره شده. هروقت یک کاربر با استفاده از سشن احراز هویت نشد، چک میکنیم که آیا این کوکی وجود داره و آیا کلید لاگین داخلش با کلید لاگین اون کاربر خاص در دیتابیس تطابق داره یا خیر، اگر کلید صحیح بود دوباره کاربر رو لاگین میکنیم و یک سشن احراز هویت جدید هم براش ست میکنیم.
البته بنده استفاده از سشن رو بصورت قابل غیرفعال کردن قرار دادم تا اگر کسی به هر دلیلی نخواست برای لاگین از سشن هم استفاده بشه، بتونه اون رو براحتی با تعیین مقدار یک متغییر در فایلهای کانفیگ برنامه غیرفعال کنه.

mtchabok
چهارشنبه 09 فروردین 1391, 20:34 عصر
سلام
دوستان کوکی یه چیزه و سشن یه چیز دیگه . چرا ایندو رو باهم قاطی میکنین .
کوکی فقط یه اطلاعات بسیار کوچیک هس که در مرورگر کاربر توسط سرور و یا نرم افزارهای تحت کلاینت نوشته میشن و به همراه هر درخواست از سمت کلاینت به سرور ارسال میشن .
سشن هم به اطلاعاتی گفته میشه که فقط در سرور ذخیره شده و نحوه ایجاد ، ویرایش ، حذف فقط توسط برنامه نویس اجازه داده میشه .

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

کوکیها توسط تاریخ انقضا در مرورگر نگهداری میشن که اگه مقدار صفر بهشون داده بشه پس از بسته شدن مرورگر اون کوکی از بین میره و در غیر اینصورت در زمان گذشتن از تاریخ انقضا از بین خواهد رفت .

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

برای تنظیم زمان انقضای کوکی سشن از این تابع استفاده کنین : session_set_cookie_params
برای تنظیم زمان انقضای خود سشن از این تابع استفاده کنین : ini_set('session.gc_maxlifetime',$secondTime)
برای تنظیم زمان انقضای کوکی هم از پارامتر سوم تابع setcookie استفاده کنین .

eshpilen
چهارشنبه 09 فروردین 1391, 21:11 عصر
دوستان کوکی یه چیزه و سشن یه چیز دیگه . چرا ایندو رو باهم قاطی میکنین .

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


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


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

ini_set('session.use_only_cookies', 1);
چون کلا سشن آیدی در کوئری استرینگ با خودش مشکلات امنیتی و پیچیدگی و نیاز به دقت برای حل اونها میاره و باعث افزایش ریسک امنیتی و باگ در برنامه میشه در عین حالی که ضرورت خاصی نداره امروزه. کوکی همون کار رو بصورت امن تر و تمیزتری انجام میده.


برای تنظیم زمان انقضای خود سشن از این تابع استفاده کنین : ini_set('session.gc_maxlifetime',$secondTime)
بله دستور لازم اینه.
اما نکات مرتبط مهمی هم داره.
نکاتش اینه که این دستور باید در هر اسکریپت قبل از session_start اجرا بشه. حتی یک بار هم اگر این ترتیب رعایت نشه میتونه باعث پاک شدن فایلهای سشن بشه. نه فقط فایل اون صفحه و برنامه و سشن اون کاربر خاص، بلکه هر فایل سشنی مال هر صفحه ای در هر زمانی حتی اونهایی که با این ترتیب ایجاد و استفاده شده بودن و به صفحه و برنامهء جاری ارتباطی ندارن.
و این نکته باید در تمام برنامه ها و بخشها و صفحات سایت که محل ذخیرهء سشن اونها مشترکه اجرا بشه.
حتی سایتهای دیگری هم که مال شما نیستن ولی محل ذخیرهء سشن اونها با مال شما یکسان است (مثلا در /tmp) در این قضیه تاثیر میذارن و اگر اونا تنظیمی غیر از مال شما داشته باشن (که حتما همینطور خواهد بود) دستورات شما به تنهایی بی فایده خواهند بود. بنابراین باید غیر از تنظیم session.gc_maxlifetime مکان ذخیرهء سشن های برنامهء خودتون رو هم جدا کنید و با استفاده از تابع session_save_path قبل از هرگونه session_start در هر صفحه اون رو مشخص کنید.
خلاصه همهء اینا باید با دقت تنظیم بشن و کوچکترین خطای تایپی یا منطقی و فقط یک بار اجرای اون میتونه همه چیز رو بهم بریزه و نه فقط یک فایل سشن بلکه صدها و هزاران فایل سشن متعلق به کاربران مختلف دلیت بشن. بخاطر همین همیشه باید یک جایی برای شانس از بین رفتن پیش از موعد سشن ها هم درنظر گرفت تا اگر چنین شرایطی پیش اومد همه چیز دچار گیج گوجه نشه!!

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

mtchabok
پنج شنبه 10 فروردین 1391, 12:06 عصر
جناب eshpilen من دیدم که شما دارین اینقدر ساده سشن و کوکی رو با هم مقایسه میکنین . واسه همین به این شکل گفتم که هرکدوم یه چیز هستن . بله منم قبول دارم که هر دوی اینها برای ذخیره و بازیابی اطلاعات به کار میره .

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

از اطلاعاتتون ممنون .

یه سوال خودم داشتم و اونم اینکه زمان خاتمه یه اسکریپت سشن شروع میکنه به ذخیره اطلاعات خودش و بعد ارتباط خودش رو با فایل و یا دیتابیس قطع میکنه . میخواستم بدونم که آیا در php این حالت به صورت درونی وجود داره و یا نه از قابلیت زمان تخریب کلاس و یا یه چنین چیزی استفاده شده ؟

MMSHFE
پنج شنبه 10 فروردین 1391, 14:42 عصر
این کار به طور درونی در PHP هست. اگه به سورس کدهاش نگاهی بندازین، میبینید که بعد از خاتمه پردازش اسکریپت و رسیدن به EOF و قبل از ارسال خروجی به مرورگر کلاینت، روال Update سشن فراخوانی میشه. موفق باشید.

eshpilen
پنج شنبه 10 فروردین 1391, 19:24 عصر
این سورس PHP هم چیز خوبیه. آدم با خوندنش چیزهای جالب و مفیدی یاد میگیره.
امروز دنبال منبع آنتروپی تابع lcg_value بودم (چون در seed خودکار mt_rand دخالت داره) و از روی سورس C اون (http://svn.php.net/viewvc/php/php-src/tags/php_5_3_2/ext/standard/lcg.c?revision=295794&view=markup) به اطلاعاتی که میخواستم رسیدم.
این اطلاعات رو هیچ جای دیگری پیدا نکردم.
واقعا Open source چیز خوبیه!

رضا قربانی
پنج شنبه 17 فروردین 1391, 20:52 عصر
کسی اینجا هست که بتونه سیشن مدت دار بسازه ؟ ممنون می شم راهنماییمون کنه.
اینجا یه چیزایی می گه ولی نه به کار ما نیامد :
http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes

من توی یک صفحه مثلا 4 تا سیشن ریجستر کرده دارم و حالا می خوام یک سیشن دیگه مثلا به مدت 1 دقیقه ایجاد کنم و وقتی که این یک دقیقه تمام شده فقط همین سیشن حذف بشه و به بقیه کاری نداشته باشه

اگه کسی می دونه راهنماییمون کنه.
تشکر

MMSHFE
جمعه 18 فروردین 1391, 00:21 صبح
اون کلاسی که برای ذخیره سشن توی دیتابیس نوشته بودم رو اگه نگاه کنید، ایده تغییر روش کار سشن دستتون میاد. مثلاً توی همون کلاس سشن تا 10 دقیقه معتبر هست. کار زیاد سختی نیست. اگه فرصت کنم یک نمونه درست میکنم. موفق باشید.

رضا قربانی
جمعه 18 فروردین 1391, 00:51 صبح
اون کلاسی که برای ذخیره سشن توی دیتابیس نوشته بودم رو اگه نگاه کنید، ایده تغییر روش کار سشن دستتون میاد. مثلاً توی همون کلاس سشن تا 10 دقیقه معتبر هست. کار زیاد سختی نیست. اگه فرصت کنم یک نمونه درست میکنم. موفق باشید.


من کلاسی رو ندیدم و نمی دونم کدوم رو می گید.

ممنون می شم اگه فرصت کردی همینجا ارسال کنید

MMSHFE
جمعه 18 فروردین 1391, 00:57 صبح
اینجا (http://barnamenevis.org/showthread.php?286634-%D8%B0%D8%AE%D9%8A%D8%B1%D9%87-Session-%D8%AF%D8%B1-DB-%D8%A8%D9%87-%D8%AC%D8%A7%D9%8A-%D9%81%D8%A7%D9%8A%D9%84) رو ببینید.

Dead Space
جمعه 18 فروردین 1391, 11:48 صبح
سلام دوستان.
یک سوالی برای من پیش اومد:
دوستمون در صفحه قبل گفتن که برای مثال اگر کوکی به صورت user=ali ایجاد کنیم کاربر می تونه در کامپیوترش user رو به admin تغییر بده.
حالا سوال اینجا هستش
سایت ها مثل همین سایت موقع ورود تیک به یاد موندن رو اگر بزنید تا مدت ها شما بدون اینکه مجددا لاگین کنید در سایت هستید.
خوب مشخصه که از کوکی دارن استفاده می کنن دیگه ؟
سوال اینه که چه چیزی رو در کلاینت ذخیره می کنن که بعدا مشکل امنیتی براشون ایجاد نشه
مثلا اگر اسم یوزر کاربر رو ذخیره کنن که کاربر می تونه اون رو admin کنه و موقع ورود مجدد به سایت PHP مشخصات ادمین رو بهش نشون بده.
با تشکر

MMSHFE
جمعه 18 فروردین 1391, 12:02 عصر
معمولاً برای هر کاربر یک هش منحصر به فرد هم در دیتابیس ذخیره میشه که اون هش توی کوکی قرار میگیره و اگه نام کاربری و هش که توی کوکی هست، با موارد معادل در دیتابیس یکسان باشه، کاربر میتونه وارد بشه. موفق باشید.