PDA

View Full Version : مسئلهء اختلاف زمان سرور و کلاینت در ست کردن کوکی ها با عمر کوتاه



eshpilen
شنبه 30 آذر 1392, 12:48 عصر
دیروز و پریروز میخواستم به سیستم رجیستر و لاگین خودم امکان تنظیم زمان لاگین خودکار از سوی کاربر موقع لاگین رو اضافه کنم.
میخواستم امکان تعیین زمان لاگین کوتاه، مثلا درحد 10 دقیقه رو هم توش بذارم، چون از نظر امنیتی این میتونه مفید باشه.
بعد به فکرم رسید که زمانی که بعنوان تاریخ انقضای کوکی از سمت سرور به کلاینت میفرستیم، اونوقت اون کلاینت طبیعتا ممکنه با سرور اختلاف زمان داشته باشه (بعلت تفاوت منطقهء زمانی)، و اون کوکی با کدام زمان سروکار خواهد داشت و آیا ممکنه عمرش کوتاهتر یا طولانی تر از چیزی بشه که ما میخواستیم؟

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

من بعنوان مثال در سمت سرور یک کوکی ست کردم با تایم 5 دقیقه با این دستور:


setcookie('time', '1', time()+5*60, '/');

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

بعد مثلا یک کوکی با تایم 20 دقیقه ست کردم در سمت سرور، اما در سمت کلاینت عمرش فقط 10 دقیقه بود، چون زمان سیستم محلی من حدود 10 دقیقه جلوتر از سرور بود.

حالا یوقتا هم هست ممکنه اصلا زمان کلاینت هم درست تنظیم نباشه. مثلا ممکنه تاریخش نادرست باشه. در اونطور موارد هم طبیعتا مشکل پیش میاد، اما فکر میکنم بعنوان برنامه نویس، شناسایی و حل اینطور موارد وظیفهء بدیهی و اولویت های اصلی ما نیست و شاید بتونیم ازش صرفنظر کنیم؛ اما شاید هم اگر بتونیم براحتی اینطور موارد رو حداقل شناسایی کنیم و به کاربر گوشزد کنیم بد نباشه؛ بخصوص از نظر امنیتی! مثلا اگر تاریخ سیستم کاربر یک ماه عقب تر باشه، و لاگین خودش رو 10 دقیقه ای تعیین کنه، اونوقت اختلاف بین یک ماه و 10 دقیقه برای امنیت میتونه فاجعه بار باشه! (البته از دید امنیتی، یک راه حل جایگزین یا مکمل برای اینطور موارد میتونه چک کردن عمر لاگین در سمت سرور هم باشه، ولی این به تنهایی نه همهء مشکلات غیرامنیتی رو هم حل میکنه و نه حتی برای امنیت لزوما در همهء شرایط و سناریوها کاملا بی عیب و نقص یا حتی قابل استفاده بنظر میاد).

خب پس ما با این مسئلهء اختلاف زمانی بین سرور و کلاینت چه کنیم بنظر شما؟
در اینکه باید شناسایی و حلش کنیم که شکی نیست بنظرم. اما میتونید تجربیات و راه حلهای مورد نظر خودتون رو بیان کنید. البته این تاپیک جنبهء آگاهی رسانی نسبت به این نکته رو هم داشت.

راستی اختلاف ساعت بین مناطق زمانی در جهان حداکثر تا 12 ساعت میتونه باشه دیگه؟

omidabedi
شنبه 30 آذر 1392, 12:54 عصر
گوگل دسترسی به جاهایی رو که نیاز به اینجور کوکی هایی هست رو محدود میکنه و از اونجا که با زبان سمت کلاینت تاریخ و زمان سیستم کاربر رو تشخیص میده و متوجه میشه out of date هست در صورتی که js غیر فعال باشه هیچ راه حلی فکر نکنم داشته باشه
یا اینکه خود برنامه سیستم کاربر رو بروز کنه (تاریخ و زمان) که اونم باید با اجازه ی خود کاربر باشه
فکر نکنم راه حلی باشه مگر با همکاری خود کاربر

eshpilen
شنبه 30 آذر 1392, 13:03 عصر
آره حداقل با JS باید یه کارهایی بکنیم دیگه.
من دنبال این نیستم که دیگه کمبودهای کلاینت و قصور کاربر رو هم گردن برنامه نویس بندازیم.
چند وقت پیش به این نتیجه رسیدم که دیگه باید حضور JS در کلاینت رو بعنوان یک پیشفرض برنامه نویسی بذاریم (مگر در شرایط خاص و اینکه خلافش نیاز باشه).

هرچند اگر JS هم نباشه، احتمالا بشه از روش دیگری مشکل در ست شدن و عمر کوکی ها رو تشخیص داد.
مثلا یه کوکی ست میکنیم با زمان چند ثانیه، بعد بوسیلهء تگ متا که امکان رفرش کردن صفحه بدون استفاده از جاوااسکریپت رو میده، اون صفحه رو که میتونه در یک iframe پنهان باشه، مجددا رفرش میکنیم، که نتیجتا باید در سمت سرور اون کوکی اگر در کلاینت ست شده باشه و موجود باشه دریافت بشه، اگر دریافت نشد یعنی مشکلی در ست کردن کوکی در سمت کلاینت داریم.

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

eshpilen
شنبه 30 آذر 1392, 13:05 عصر
یا اینکه خود برنامه سیستم کاربر رو بروز کنه (تاریخ و زمان) که اونم باید با اجازه ی خود کاربر باشه
فکر نکنم راه حلی باشه مگر با همکاری خود کاربر
اشتباه بودن تاریخ کلاینت که به کنار؛ نیاز به درنظر گرفتن زمان کلاینت در موارد عادی هم درمورد کوکی های با عمر کوتاه نیازه، بخاطر اختلاف زمانی مناطق.

eshpilen
شنبه 30 آذر 1392, 13:10 عصر
یه ایدهء دیگر هم میتونه این باشه که تاریخ انقضای کوکی رو در خود محتویات کوکی ذخیره کنیم.
بعدش عمر کوکی رو میتونیم مثلا یک سال یا اصلا هرچند سال بذاریم، ولی تاریخ انقضای کوکی که در خود کوکی هست در سمت سرور خونده میشه و بر اساس اون کار صورت میگیره (بر اساس زمان سرور).
البته این راهکار از دید اصول امنیت به هیچ وجه کافی نیست (ولی از هیچی بهتره)، چون کوکی اگر بیش از زمان تعیین شده روی سیستم کلاینت بمونه ممکنه اطلاعات حساسی مثل کلید لاگین و مشخصات کاربر توسط دیگرانی که به سیستم دسترسی پیدا میکنن مشاهده/سرقت بشه که میتونه مورد سوء استفاده برای دسترسی غیرمجاز به اکانت کاربر هم قرار بگیره، و خب تاریخی که در کوکی ذخیره کردیم هم میتونه توسط هکرها براحتی دستکاری بشه.

eshpilen
شنبه 30 آذر 1392, 13:15 عصر
ما از نظر امنیتی میتونیم زمان انقضای کوکی لاگین رو در سمت سرور ذخیره کنیم و با هر درخواست چک کنیم اگر زمان انقضاش گذشته بود، اون رو باطل کنیم.
اما عمر کوکی لاگین در سمت کلاینت هم بهتره یا اصلا واجبه که درست ست بشه. چون اگر درست ست نشه، ممکنه کوکی اصلا ست نشه یا خیلی زود منقضی بشه، و یا ممکنه خیلی بیش از زمان مورد انتظار روی کلاینت باقی بمونه و به این شکل ریسک امنیتی هست که افراد دیگری محتویات اون رو که ممکنه از نظر امنیتی حساس و قابل سوء استفاده باشن مشاهده/سرقت کنن.
البته برای این هم میشه از الگوریتم های خاصی یا روشهای رمزنگاری استفاده کرد.
فعلا فقط میخوام جوانب و راه حلهای کلی این مسئله رو روشن کنم.

colors
شنبه 30 آذر 1392, 13:15 عصر
اصلا موافق این نیستم که بخوای کاربر رو مجبور به انجام یه سری یا حتی 1 عملیات بکنی. از نظر اصول دسترسی و قابلیت استفاده اصلا درست نیست و حتی به نظرم نباید کاربر رو مجبور به فعال یا غیرفعال کردن JS در مرورگرش کنی.
مثلا به نظرم اگه اختلاف زمانی سرور و کلاینت رو بررسی و در صورت اختلاف زیاد (اختلافی که برای ما مشکل ساز باشه) به کاربر اطلاع بدیم که "کاربر گرامی, به دلیل اختلاف زمانی سیستم شما با سرور, ما قادر به فعال کردن این بخش برای شما نیستیم, در صورت نیاز این صفحه را مشاهده کنید"
اگه جاواسکریپت رو هم خاموش کرده باشه میتونیم بازم یه همچین پیامی بدیم.

الانم من فکر میکنم بینم چه راه و روشهای میتونیم بزاریم.

colors
شنبه 30 آذر 1392, 13:21 عصر
اصلا اگه قبل از تنظیم کوکی, زمان رو خودمون در سرور با ساعت و تاریخ منظقه زمانی موجود کاربر ست کنیم, و بعد طبق اون کوکی رو تنظیم کنیم؟ :متفکر:.

eshpilen
شنبه 30 آذر 1392, 13:44 عصر
والا راه حل که داره.
با JS زمان سیستم کاربر رو میخونیم و میبینیم که برای ست کردن کوکی در سمت کلاینت باید چقدر Offset کنیم.
مثلا اگر کاربر 1 ساعت جلوتره، ما هم زمان انقضای کوکی رو یک ساعت اضافه میکنیم در سمت سرور.
اگر زمان کلاینت 2 ساعت عقب تره از سرور، ما هم زمان انقضای کوکی رو 2 ساعت عقب تر از زمان مورد نظر در سرور تنظیم میکنیم.

البته این راه حل هم ممکنه مشکلاتی داشته باشه :متفکر:
مثلا اگر تاریخ کلاینت اشتباه تنظیم شده و مثلا یک ماه جلوتره، بعد ما بیایم کوکی رو یک ماه جلوتر تنظیم کنیم؟ اونوقت ما روی یک تنظیم که میدونیم غلطه و هر لحظه ممکنه کاربر اصلاحش کنه یا بصورت خودکار اصلاح بشه، اتکا کردیم.
پس چطوره در اینطور موارد (کلاینتی که مشخصه تاریخش اشتباهه) فقط کاربر رو مطلع کنیم؟

در کل فقط سمت کلاینت یا فقط سمت سرور به تنهایی کافی بنظر نمیرسه برای تامین هردوی نیازهای کاربری/یوزرفرندلی و امنیت. باید هم در سمت کلاینت چک و تمهید کرد و هم در سمت سرور.

omidabedi
شنبه 30 آذر 1392, 13:58 عصر
راه حل 100% ای نداره چون سمت کاربر مهمه که اونم قابل تغییر و دستکاری هست
برای اختلاف منطقه ای هم خود سیستم زمان ثابت رو درنظر میگیره (گرینویچ فکر کنم) و میزان اختلاف ساعت اون منطقه رو به اون اضاف یا کم میکنه
اما خب اینجا باز بسته به کاربر هست که منطقشو درست انتخاب کرده باشه که اونم 99.9% درست هستن و اگر هم نباشه که دیگه مقصر خودشون هستن.
ولی برای اطمینان بیشتر هم میتونیم از روی ip منطقه ی زمانیشو بدست بیاریم اما باز اینجا مشکل استفاده از proxy پیش میاد

eshpilen
شنبه 30 آذر 1392, 14:59 عصر
راه حل 100% ای نداره چون سمت کاربر مهمه که اونم قابل تغییر و دستکاری هست
من تاحدی گفتم که دست برنامه نویسه و احتمالش زیاده.

برای اختلاف منطقه ای هم خود سیستم زمان ثابت رو درنظر میگیره (گرینویچ فکر کنم) و میزان اختلاف ساعت اون منطقه رو به اون اضاف یا کم میکنه
منکه تست کردم جواب نداد.
این رو از کجا میگی؟ دلیل و سند.
البته ممکنه اینطور باشه، ولی برای زمانهایی به کوچکی 10 دقیقه و اینها شاید جواب نمیده.
چون هم سرور و هم کلاینت گرچه ساعتشون و منطقهء زمانیشون درست تنظیم شده باشه، ممکنه در این حد و کمی بیشتر هم با هم اختلاف زمان داشته باشن.


اما خب اینجا باز بسته به کاربر هست که منطقشو درست انتخاب کرده باشه که اونم 99.9% درست هستن و اگر هم نباشه که دیگه مقصر خودشون هستن.
فکر نمیکنم آمارش اینقدر باشه.
مگه همه اروپا و آمریکا هستن؟ :لبخند:
من خودم گاهی جرات نمیکنم مکان رو روی ایران بذارم و میذارم روی آمریکا، عراق یا افغانستان و غیره. یعنی فکر میکنم ممکنه اینطوری بعضی سایتها یا نرم افزارها بخاطر مسائل سیاسی و جاسوسی و تحریم و غیره یجور دیگری رفتار کنن!
تازه خیلی ها که ویندوز نصب میکنن اصلا اینو تنظیم نمیکنن و کاربر هم بعدا انجام نمیده. همه که اینقدر سواد و دقت ندارن و اهمیت نمیدن.
مهم اینه تاریخ و ساعتش به وقت اون منطقه درست باشه.
البته ویندوز اگر با تایم سرور سینک کنه اونوقت بنظرم مشکل پیش میاد!

eshpilen
شنبه 30 آذر 1392, 15:28 عصر
من الان چندتا تست دیگه انجام دادم دیدم در این مورد ظاهرا حق با شماست.
یعنی کوکی ها در سمت سرور بر اساس زمان GMT ارسال میشن به مرورگر، و مرورگر هم که بر اساس زمان سیستم زمان انقضای کوکی رو میسنجه (حالا روی هر منطقه ای که میخواد، درست یا غلط، تنظیم شده باشه).
اینطوری پس خوبه!
ولی مسئله ای که منو گمراه کرد اون تستی بود که انجام دادم.
و البته مسئلهء امکان اشتباه بودن زمان سیستم کلاینت به گمانم هنوز هم تاحدی وجود داره، مثل سیستم خودم که زمانش دقیق نبود.
درواقع من الان با سینک کردن زمان سیستم در ویندوز از طریق سرورهای زمان اینترنتی زمان سیستم رو دقیق کردم؛ ولی قبلش این داستان خاموش بود (یادم نیست بخاطر چی غیرفعالش کرده بودم).
شاید زیاد نمیشه بهش اعتبار کرد. سرور اولی (time.windows.com) که انگار کار نمیکرد زدم روی سرور دوم (time.nist.gov). یعنی میگم نکنه بخاطر تحریم بوده!
بعدشم حالا که فعالش کردم باید چک کنم ببینم دقتش تا چه حده. یعنی مثلا دیگه همیشه ساعت سیستم حتی چند دقیقه هم بهم نمیخوره؟
بعد مسئلهء دیگر اینکه بهرحال همینطور مثل من ممکنه سیستمهای دیگری هم در این حد چند دقیقه و اینها حداقل ساعتشون دقیق نباشه، که این روی کوکی های با عمر کوتاه تاثیر میذاره. یک مسئله هم سیستمهایی که به هر علتی ممکنه اصلا تاریخشون اشتباه باشه در اون موقعی که در سایت لاگین میشه. مثلا تازه اومده بالا و تنظیم نبوده و هنوزم وقت نکرده از اینترنت سینک کنه. بعضی سیستمها هست به هر علتی موقعی که میان بالا تاریخ سیستم غلطه.

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

eshpilen
یک شنبه 01 دی 1392, 07:56 صبح
بقول یکی از دوستان در فروم دیگر، اینم یک سناریوی دیگر:

یا اگر کامپیوتر در محیط اینترنت نبود و داخل شبکه داخلی کار می کرد چی؟

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

eshpilen
شنبه 07 دی 1392, 11:07 صبح
من نمیدونم چرا بار اول طور دیگه جواب داد، ولی بعدا هرچی تست کردم زمان و تاریخ کلاینت هم نادرست بود بازم کوکی ها بر اساس تاریخ و زمان خود کلاینت درست ست شدن!!
در تست اولیه اینطور نبود و مثلا ساعت کلاینت 10 دقیقه جلوتر از زمان صحیح بود من از سمت سرور کوکی 5 دقیقه ای ست میکردم اصلا ست نمیشد.

چی شد پس :متفکر: