گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

آیا session ها امن هستند و میتوان از آن‌ها با خیال راحت استفاده کرد ؟

3 دیدگاه‌ها

من با این سؤال خیلی جا ها روبرو شدم و حتی خوندم که بعضی از همکاران به دوستان برنامه نویس تازه کار میگویند session ها امن نیستند و نباید از آن‌ها استفاده کرد. خوب اینجاست که مغز آدم سوت میکشه که چرا هر کسی میاد هر حرفی را دوست داشت اونم به یک تازه کار میزنه ؟ من سعی میکنم هر چی در مورد session ها میدونم توضیح بدم تا شاید دوستان من ازش استفاده کنند.

به طور کلی ما برای بازیابی ، پروسس و انجام محاسبات مرتبط با فرد یا افرادی که در حال بازدید از سایت ما هستند از session ها استفاده میکنیم. یکی از مهمترین استفاده هاش هم در زمان پیاده سازی Login و کلاً Authentication هست. امنیت session ها را باید در سمت client و server بررسی کنیم.

برای اینکه کاربرای تازه کار که شاید متأسفانه از بحث‌های امنیتی لذت نبرند هم این مطلب کمکشون کنه توصیه میکنم به آخر مطلب بروند و قسمت راه حل را بخونند. اما توضیحات فنی تر :

در سمت client تنها اثری که از session وجود داره فایل کوکی هست که مشخص کننده session برای سمت سرور هستش. پس در‌ واقع اگه کسی بتونه محتوای این cookie را بدست بیاره در‌ واقع session hijacking انجام داده و میتونه خودش را جای قربانی جا بزنه ! این کار به سه روش معمول انجام میشه ،‌ روش اول session fixation هست که در‌ واقع هکر میاد و با ارسال یک لینک به قربانی از طریق POST یا GET (بعضی زبان‌ها هم از GET و هم POST برای ست کردن session استفاده میکنند) session مورد نظرش را برای قربانی ست میکنه و به حساب شخص دسترسی پیدا میکنه. روش دوم که بهش میگن session sidejacking در‌ واقع همون packet sniffing هست و در‌واقع با بررسی packet های رد و بدل شده cookie مورد نظر و در نهایت session لو میره. در روش سوم هم از طریق Cross Site Scripting یا همون XSS هکر میتونه به session ها دسترسی پیدا کنه.

اما در سمت server هم مشکلات امنیتی در زمان استفاده از session وجود داره. این مشکلات مربوط به هاست های اشتراکی میشه و در‌ واقع همسایه های ما میتونند برامون دردسر ساز بشوند. مثلاً من متوجه میشم قربانی از کجا هاست میگیره و با گرفتن هاست از اون شرکت شروع به سوء‌ استفاده میکنم.

در‌ واقع به صورت پیش‌ فرض همه session ها توی پوشه tmp/ ذخیره می‌شوند و این فایل‌ها متعلق به کاربری هست که web server داره تحتش اجرا میشه ، از اونجا که همه سایت‌ها با همین کاربر به این پوشه و فایل‌ها دسترسی دارند پس میتونند هر بلایی سر این فایل‌ها بیارند و کلاً امنیت سایت شما در مورد session ها از بین میره. راه حل‌های متفاوتی برای مقابله هست که بهترینش استفاده از FastCGI یا suPHP به منظور اختصاص یک کاربر برای هر سایت هستش که در این حالت دیگه کاربر ها نمیتونند به فایل‌های session هم دیگه دسترسی داشته باشند.

راه حل : برای جلوگیری از session hijacking در گام اول باید مانع از ست شدن session از طریق GET و POST بشین.
توجه : به صورت پیش‌فرض یک HOST خوب مانع از این کار شده ولی برای اطمینان دو خط زیر را در فایل htaccess. توی root قرار بدین :

php_flag session.use_trans_sid off
php_flag session.use_only_cookies on

در گام دوم باید هر زمانی که نوع دسترسی کاربر تغییر میکنه ما هم session id جدید ایجاد کنیم. مثلاً بعد از login کاربر session id جدید ایجاد کنیم تا اگه session fixation اتفاق افتاده بی اثر بشه.

در گام سوم برای جلوگیری از session sniffing تنها راه استفاده از SSL هستش.

در مورد مشکل امنیتی server باید بگم بهتره از هاست های معتبر استفاده کنین که براتون از این نظر مشکلی وجود نداشته باشه ولی اگه مطمئن نیستین من سه تا راه را پیشنهاد میکنم که به الویت اینها هستند :

– PHP به شما این امکان را میده که کنترل کنین session چطوری handle بشه. در‌واقع شما میتونید به جای اینکه خود PHP بیاد و session های شما را مدیریت کنه با استفاده از session_set_save_handler مدیریت session ها را بدست بگیرین و به جای استفاده از فایل سیستم اونها را توی database یا حافظه (از طریق Memcache) ذخیره و بازیابی کنید.

– PHP به شما این امکان را میده که از طریق session_save_path مسیر مربوط به ذخیره فایل‌های session را تغییر بدین و امنیت پوشه مربوط مربوط به شما و در اختیار شما خواهد بود.

– کار دیگه ای که میتونید انجام بدین encrypt کردن محتوای session ها هسش تا اگه هم لو رفتند قابل استفاده نباشن.

توجه : تمام مطالب بالا تجربیات و مطالعات شخصی خود من هستش و من هیچ مسئولیتی در صورت بروز هر مشکلی به خاطر استفاده از اونها به عهده ندارم و با مسئولیت خودتون ازش استفاده کنین.



برچسب‌ها:

  1. مهدی گفت:

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

  2. محمدحسین گفت:

    ممنون. بسیار استفاده کردم.

  3. ez گفت:

    خیلی عالی ….

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *