PDA

View Full Version : سوال: آیا لازم هست که مقدار PHPSESSID رو چک کنیم یا خود پی اچ پی این کار رو می کنه؟



i-php-i
شنبه 03 اردیبهشت 1390, 13:35 عصر
با توجه به اینکه مقدار PHPSESSID توی یه کوکی روی سیستم کاربر ذخیره می شه و کاربر می تونه اون رو تغییر بده. آیا لازم هست که ما مقدار $_COOKIE[PHPSESSID] رو چک کنیم یا اینکه پی اچ پی اینکار رو انجام می ده.

در ضمن آیا ممکن هست که پی اچ پی در این مورد باگ داشته باشه؟

alonemm
شنبه 03 اردیبهشت 1390, 15:20 عصر
باسلام:
اگر با توابع چک کنید مطمعن تر خواهید بود و از طزیق کد در این صورت جلو گیری کردید. (فقط رشته و کاراکتر های مجاز باشد)

i-php-i
شنبه 03 اردیبهشت 1390, 15:51 عصر
باسلام:
اگر با توابع چک کنید مطمعن تر خواهید بود و از طزیق کد در این صورت جلو گیری کردید. (فقط رشته و کاراکتر های مجاز باشد)

یعنی به اعتبار سنجی خود پی اچ پی نباید اطمینان کنم؟

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

mtchabok
شنبه 03 اردیبهشت 1390, 16:56 عصر
عزیزم سشن ، آی دی رو اعتبار سنجی میکنه ولی کامل نیس و بهتره که قبل از استارت سشن خودمون این کار رو انجام بدیم تا در سشن استارت خطائی رخ نده .

eshpilen
شنبه 03 اردیبهشت 1390, 18:28 عصر
بنظرم PHPSESSID خوبخود اعتبار سنجی میشه. چون اگر صحیح نباشه سشن قبلی کاربر باز نمیشه. نهایتا یه سشن جدید استارت میشه که خالیه.
شما میخواید چیش رو چک کنید؟

i-php-i
شنبه 03 اردیبهشت 1390, 19:03 عصر
عزیزم سشن ، آی دی رو اعتبار سنجی میکنه ولی کامل نیس و بهتره که قبل از استارت سشن خودمون این کار رو انجام بدیم تا در سشن استارت خطائی رخ نده .

می شه یه نمونه کد مثل بزنید؟

i-php-i
شنبه 03 اردیبهشت 1390, 19:06 عصر
بنظرم PHPSESSID خوبخود اعتبار سنجی میشه. چون اگر صحیح نباشه سشن قبلی کاربر باز نمیشه. نهایتا یه سشن جدید استارت میشه که خالیه.
شما میخواید چیش رو چک کنید؟

کاربر می تونه با تغییر کوکی PHPSESSIDکدهای محرب تزریق کنه. نظر شما چیه؟

eshpilen
شنبه 03 اردیبهشت 1390, 23:23 عصر
نه بابا مگه کشکیه!
کاربر با این کوکی هیچ غلطی نمیتواند بکند - از بیانات استاد اشپیلن :لبخندساده:

عزیزم شما دیگه به سیستمهای درونی PHP هم کار داری همینطوری ندونسته میگه اشکال داره و میخوای نقصش رو برطرف کنی؟
نه بابا هیچ خطری نداره خیالت راحت. کارها بصورت خودکار توسط PHP انجام میشن.
این PHPSESSID فکر میکنی چیه؟ یک رشتهء رندوم که PHP میاد موقع استارت سشن چک میکنه اگر فایل سشنی با همون نام در دایرکتوری ذخیرهء سشن ها بود اون فایل رو بعنوان سشن کاربر باز میکنه. مسلما برای بقیهء تمهیدات لازم و جلوگیری از خرابکاری و حمله از سمت کلاینت هم سیستم PHP پاسخگو هست. اینقدر دیگه درپیت و مسخره نبوده که یه همچین حفرهء بزرگی توش بذارن. البته خودمونیم بگذریم از اون داستان دسترسی همگانی به سشن ها در دایرکتوری tmp :لبخند:
ولی بهرحال همچین موردی نیست که اگر بود تاحالا گندش در اومده بود و کلی ملت اینطوری هک شده بودن و من و شما خبر داشتیم و راهکار هم داده بودن واسش. شما نیازی نیست مقدار PHPSESSID رو قبل از PHP ولیدیت کنید.
راستی دقیقا چطوری میخواید ولیدیتش کنید؟ با چه معیاری؟

i-php-i
شنبه 03 اردیبهشت 1390, 23:36 عصر
نه بابا مگه کشکیه!
کاربر با این کوکی هیچ غلطی نمیتواند بکند - از بیانات استاد اشپیلن :لبخندساده:

عزیزم شما دیگه به سیستمهای درونی PHP هم کار داری همینطوری ندونسته میگه اشکال داره و میخوای نقصش رو برطرف کنی؟
نه بابا هیچ خطری نداره خیالت راحت. کارها بصورت خودکار توسط PHP انجام میشن.
این PHPSESSID فکر میکنی چیه؟ یک رشتهء رندوم که PHP میاد موقع استارت سشن چک میکنه اگر فایل سشنی با همون نام در دایرکتوری ذخیرهء سشن ها بود اون فایل رو بعنوان سشن کاربر باز میکنه. مسلما برای بقیهء تمهیدات لازم و جلوگیری از خرابکاری و حمله از سمت کلاینت هم سیستم PHP پاسخگو هست. اینقدر دیگه درپیت و مسخره نبوده که یه همچین حفرهء بزرگی توش بذارن. البته خودمونیم بگذریم از اون داستان دسترسی همگانی به سشن ها در دایرکتوری tmp :لبخند:
ولی بهرحال همچین موردی نیست که اگر بود تاحالا گندش در اومده بود و کلی ملت اینطوری هک شده بودن و من و شما خبر داشتیم و راهکار هم داده بودن واسش. شما نیازی نیست مقدار PHPSESSID رو قبل از PHP ولیدیت کنید.
راستی دقیقا چطوری میخواید ولیدیتش کنید؟ با چه معیاری؟

رشته های PHPSESSIDفقط عدد و حروف هستند. باید چک کنیم که آیا PHPSESSIDاز حروف یا اعداد تشکیل شده یا نه.

درثانی من به پی اچ پی ایراد نگرفتم. به بعضی از توابع و رویه های پی اچ پی ایراد گرفتم. یکیشون رو هم خودتون گفتید (پوشه تمپ).

راستی چطور می تونم مدت زمان اعتبار یه سسشن رو تغییر بدم؟

eshpilen
یک شنبه 04 اردیبهشت 1390, 01:22 صبح
رشته های PHPSESSIDفقط عدد و حروف هستند. باید چک کنیم که آیا PHPSESSIDاز حروف یا اعداد تشکیل شده یا نه.

منکه دلیلی برای این کار نمیبینم.
چون این یه بخشی از سیستم داخلی و خودکار PHP هست و به شما ربطی نداره و جایی نیامده که باید شما کاری بکنید. شما فقط ازش استفاده میکنید. این کارها وظیفهء این سیستم و طراحان و برنامه نویسان اون بوده.


درثانی من به پی اچ پی ایراد نگرفتم. به بعضی از توابع و رویه های پی اچ پی ایراد گرفتم. یکیشون رو هم خودتون گفتید (پوشه تمپ).
خب مورد تمپ مدتهاست کشف شده. اما تاحالا از منبع معتبری نشنیدم که نیاز هست فرمت PHPSESSID رو خودمون چک بکنیم!


راستی چطور می تونم مدت زمان اعتبار یه سسشن رو تغییر بدم؟ زمان اعتبار سشن بستگی به دو طرف داره. یکی سمت کلاینت که همون کوکی سشن هست و دیگری سمت سرور با تنظیم زمانی که رفتگر سشن PHP فایلهای سشنی رو که طول عمری بیشتر از اون زمان داشته باشن Delete میکنه.

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

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

اگر خواستید از تابع session_set_cookie_params استفاده کنید باید بدونید که اگر مقدار زمان رو صفر بدید، کوکی تا زمان باز بودن برنامهء مرورگر زنده خواهد بود.

در سمت سرور:
برای تعیین زمانی که رفتگر سشن PHP فایلهای سشن کهنه تر از اون زمان رو دلیت میکنه، میتونید از دستور زیر استفاده کنید:

ini_set('session.gc_maxlifetime', time);
بجای time زمان رو برحسب ثانیه بدید.
این تابع باید در ابتدای هر اسکریپت شما قبل از هرگونه استارت سشن فراخوانی بشه.
اگر بخواید تنظیم دائمی داشته باشید و نیازی به فراخوانی این تابع هربار در هر اسکریپت نباشه باید مقدار session.gc_maxlifetime رو در فایل php.ini تعیین کنید. هرچند بنظر من فراخوانی این تابع مشکلی نداره و انعطاف برنامه به این شکل بیشتر هست (مقدارش رو در یک فایل تنظیم برنامه قرار بدید و همهء فراخوانی ها از اون مقدار استفاده کنن). فقط هیچ جایی فراموشش نکنید، وگرنه تنظیم موجود در فایل php.ini کار خودش رو میکنه!
توجه کنید که این تنظیم بر روی تمام فایلهای سشن اعمال میشه. یعنی اگر فرضا قبلا سشنی داشته بوده باشید که برای زمان زیادی درنظر گرفته شده و موقع استفاده از اون سشن زمان انقضای زیادتری رو برای رفتگر سشن تعیین کرده بودید اما الان یه زمان کمی رو برای این تنظیم تعیین کنید، ممکنه فایل سشن قبلی هم قبل از اینکه زمانی که شما اون موقع درنظر داشتید فرا برسه دلیت بشه. میگم ممکنه، چون سیستم رفتگر PHP تاجایی که میدونم بصورت تصادفی از هر چند بار دسترسی به سشن ها اجرا میشه. مثلا ممکنه حدودا در هر 5 باری که از سشن استفاده میکنید یک بار اجرا بشه. در بار اول، دوم، سوم، چهارم یا پنجم و شاید هم ششم و هفتم... تنظیمش بصورت احتمالاتی هست. اگر تنظیم شده با احتمال یک پنجم رخ بده، یعنی بطور متوسط از هر پنج بار یک بار رخ میده اما وقتی رخ داد باعث میشه هر فایل سشنی که در مدتی بیش از gc_maxlifetime مورد دسترسی قرار نگرفته دلیت بشه. من الان نگاه کردم در تنظیمات php.ini روی سیستم خودم این احتمال یک بار از هر هزار بار هست! بنابراین احتمالش زیاده که یک فایل سشن تا مدتها بعد از منقضی شدن باقی بمونه.

خب نتیجه میگیریم که پس شما باید این کار رو بکنید:

- زمان انقضای سشن ها رو در سمت سرور (گفتم که این یه تنظیم کلی برای تمام سشنهاست و برای یک سشن تنها قابل تنظیم نیست) برابر حداکثر طول عمری که برای سشنهای خودتون نیاز دارید تعیین کنید. مثلا اگر طولانی ترین زمان اعتبار سشن ممکن در سایت شما 12 ساعت هست، اون رو روی 12*60*60 قرار بدید.

- بعد زمان اعتبار هر سشن رو برای هر کاربر میتونید با استفاده از تعیین زمان انقضای کوکی سشن تعیین کنید.
این تابع رو هم باید در هر اسکریپت قبل از استارت سشن مورد نظر فراخوانی کنید. مگر اینکه تنظیم کلی اون رو در فایل php.ini برای تمام کاربران تعیین کنید (تنظیم session.cookie_lifetime در این فایل).

اما یه نکتهء خیلی مهم دیگه!
باید از تابع session_save_path هم استفاده کنید و محل ذخیرهء فایلهای سشن برنامهء خودتون رو در یک دایرکتوری مختص خودش و جایی غیر از پوشهء عمومی /tmp تعیین کنید. چون اگر این کار رو نکنید یه برنامهء دیگر یا حتی برنامهء یک سایت دیگر که روی سرور مشترک هاست شما هست میتونه باعث بشه که فایلهای سشن شما قبل از زمانی که شما درنظر داشتید دلیت بشن! چون برنامه های دیگه ممکنه با تنظیم پیشفرض php.ini برای session.gc_maxlifetime اجرا بشن یا این تنظیم رو به دلخواه خودشون مقدار دیگری تعیین کنن.

پ.ن:
البته این اطلاعات و روشهایی که بنده به شما ارائه کردم مربوط به چند سال پیش میشه و از طریق کامنت های پروژه ای که قبلا نوشته بودم و توش روی سیستم سشن زیاد کار کرده بودم الان درآوردم. وگرنه خودم درست و حسابی چیزی یادم نبود. فکر میکنم این سیستم باید هنوز هم به همین شکل و با همین جزییات و خصوصیات باشه. ولی ممکنه تغییراتی کرده باشه! پس مسئولیت تحقیق و تست کافی برای مطمئن شدن پای خودتون.
ضمنا اگر میخواید تست کنید باید تنظیم احتمال اجرای رفتگر سشن رو روی مقدار خیلی محتمل تری بذارید یا اصلا روی احتمال 100% اگر میشه تنظیم کنید.
دو متغییر مربوط به این کار هست در php.ini
session.gc_probability و session.gc_divisor
احتمال مورد نظر از تقسیم session.gc_probability بر session.gc_divisor بدست میاد.

eshpilen
یک شنبه 04 اردیبهشت 1390, 01:42 صبح
فقط من روی یک مورد تردید دارم و یادم نمیاد.
اونم اینکه آیا رفتگر سشن PHP فایلهای سشنی رو که عمری بیشتر از session.gc_maxlifetime دارن پاک میکنه یا فایلهایی رو که در مدتی برابر با session.gc_maxlifetime ثانیه مورد دسترسی قرار نگرفتن؟ یعنی مثلا تا زمانی که کاربر در سایت فعالیت میکنه و فایل سشن مورد دسترسی قرار میگیره جزو طول عمر فایل سشن بحساب نمیاد، اما بعد اگر به مدت session.gc_maxlifetime ثانیه مورد دسترسی قرار نگرفت اون سشن دیگه منقضی شده تلقی میشه. من توی کامنت های برنامم اینطور نوشتم و حتما تستش کرده بودم. ولی در منوال این مطلب مقداری مبهم هست.
البته این موضوع در کل در روشی که به شما گفتم تغییری نمیده بنظرم. شما برای تعیین زمان مربوط به سشن هر کاربر باید از تعیین طول عمر کوکی سمت کلاینت استفاده کنید و باید طول عمر فایلهای سشن روی سرور رو برابر مقدار حداکثر زمان ممکن برای اعتبار یک سشن، یا بیشتر از اون حداکثر، قرار بدید.
ضمنا برای منقضی کردن سشن میتونید زمان رو بصورت یک متغییر در خود سشن هم ذخیره کنید و بعد هربار که سشن رو استارت میکنید اون زمان رو چک کنید و اگر بیش از طول عمر تعیین شده بوده سشن رو تخریب کنید. مزیت این روش اینه که به اینصورت طول عمر سشن به صحت تنظیم تاریخ و ساعت کلاینت وابسته نخواهد بود. البته فکر میکنم در اینصورت البته باید طول عمر کوکی رو خیلی افزایش بدید تا اگر تاریخ و ساعت کلاینت اشتباه بود، کوکی سشن زودتر از موعد از بین نره.

اما نکته اینه که برای افزایش طول عمر سشن به بیش از پیشفرض PHP، باید خودتون با استفاده از توابع مربوطه که ذکر کردیم این کار رو انجام بدید. پیشفرض PHP برای طول عمر کوکی روی سیستم بنده، تا مدت باز بودن مرورگر هست (مقدار صفر) و مقدار برای طول عمر فایلهای سشن روی سرور هم برابر 1440 ثانیه یا 24 دقیقه تعیین شده. بنابراین تنظیمات سشن بصورت پیشفرض طوری هستن که سشن های شما نمیتونن بیش از 24 دقیقه یا بعد از بسته شدن مرورگر دوام بیارن. اگر شما میخواید سشن های شما بعد از بسته شدن مرورگر یا بعد از گذشت 24 دقیقه هم اعتبار داشته باشن باید این تنظیمات رو تغییر بدید.