PDA

View Full Version : طریقه استفاده از Session_Regenerate_id



siavashsay
یک شنبه 24 دی 1391, 10:58 صبح
دوستان اول بگم که بنده با استفاده از این تابع مشکلی ندارم !
اما به هر حال میخوام بدونم در کجا بهتره که استفاده شه !
توی یک سایت دیدم بعد از اینکه Login موفقیت آمیز بود استفاده شده بود !
توی یک سایت دیگه باز دیدم در صفحه Logout استفاده شده !
و توی یک سایت هم دیدم که در هر 2 صفحه استفاده شده !
یعنی هم Login و هم Logout
حالا میخوام دوستان لطف کنن یه توضیح کلی - مختصر و مفید ارائه بدن ! :)
با تشکر

eshpilen
یک شنبه 24 دی 1391, 11:17 صبح
بالافاصله بعد از هر session_start از session_regenerate_id استفاده کنید واسه سلامتی خوبه!

خب خاصیتش چیه.
اینه که سشن آیدی طرف رو که شناختی و سشنش رو استارت کردی، بعدش میای و با session_regenerate_id سشن آیدیش رو عوض میکنی. در نتیجه اگر یه هکر به یک طریقی سشن آیدی طرف رو سرقت کرده باشه، و قبل از اینکه اون هکر بتونه از اون سشن آیدی سوء استفاده کنه کاربر واقعی یک ارتباط دیگر با سرور داشته بوده باشه، اون سشن آیدی ای که دست هکر هست بی ارزش میشه.

siavashsay
یک شنبه 24 دی 1391, 11:21 صبح
بالافاصله بعد از هر session_start از session_regenerate_id استفاده کنید واسه سلامتی خوبه!
یعنی توی همه صفحات بعد از اینکه session_start() کردیم و سشن کاربر رو گرفتیم و چک کردیم بعدش session_regenerate_id کنیم یا دقیقا بعد از کد session_start(); ؟

eshpilen
یک شنبه 24 دی 1391, 11:25 صبح
یعنی توی همه صفحات بعد از اینکه session_start() کردیم و سشن کاربر رو گرفتیم و چک کردیم بعدش session_regenerate_id کنیم یا دقیقا بعد از کد session_start(); ؟
آره دقیقا بعد از session_start بذارید که روزهء شک دار نشه.
جای دیگه و بعد از اینطور چکها هم شاید بشه گذاشت، اما خب نیاز به تفکر و تحلیل بیشتری داره که ببینیم مشکل امنیتی نداشته باشه، که حتی بنده هم الان تمرکز و حضور ذهن و وقتش رو ندارم. پس چرا بیخود خودمون رو اذیت کنیم؟ میذاریم بعد از هر استارت سشن بدون هیچ شرطی.

eshpilen
یک شنبه 24 دی 1391, 11:26 صبح
توی یک سایت دیگه باز دیدم در صفحه Logout استفاده شده !
موقع لاگ آوت هم خب قبلش باید session_start کرده باشه که session_regenerate_id کار کنه.
آره فکر کنم اینم از نظر امنیتی ایدهء خوبی باشه.
موقع Logout هم استفاده کنید.
البته session_destroy و اینها هم به جای خودش!!

siavashsay
یک شنبه 24 دی 1391, 11:45 صبح
البته session_destroy و اینها هم به جای خودش!!
اون که البته ! اما خوب توی یک فروم خارجی بحث سر همین بود که کجا استفاده شه !
2 نفر هم باهم بحثشون شده بود که موقع Logout بهتره و اون یکی میگفت login !
هرکدوم هم دلیل خودشون رو داشتن ! اونی که میگفت logout دلیلش این بود که بعد از لاگ اوت وقتی سشن رو عوض کنی حتی اگرم حک بشه دیگه سشن لاگین قبلی موجود نیست !
خلاصه اینجا بود که گیچ شدم دیگه !:))

mtchabok
یک شنبه 24 دی 1391, 11:46 صبح
سلام
جناب eshpilen چرا شما همه چی رو امنیتی می کنین .
این یه تابع خیلی ساده اس برای تغییر آی دی سشن .
خوب اگه هکر بخواد سشن آد رو سرقت بکنه ، بازم اینکار رو انجام میده و حتی با استفاده از این تابع هکر دیگه خیالش راحته که با یه بار بدست آوردن سشن آی دی کاربر واقعی دیگه نمیتونه دسترسی داشته باشه چونکه هکر با سشن آی دی سرقتی وارد میشه و با لطف این تابع سشن آی دی جدید برای هکر ارسال میشه و کل امکانات کاربری در اختیار هکر قرار میگیره .
بهتر است که موارد دیگه ای برای استفاده از این تابع اضافه بشه تا این مشکل برطرف بشه ، مثل آی پی

siavashsay
یک شنبه 24 دی 1391, 12:04 عصر
سلام
جناب eshpilen چرا شما همه چی رو امنیتی می کنین .
این یه تابع خیلی ساده اس برای تغییر آی دی سشن .
خوب اگه هکر بخواد سشن آد رو سرقت بکنه ، بازم اینکار رو انجام میده و حتی با استفاده از این تابع هکر دیگه خیالش راحته که با یه بار بدست آوردن سشن آی دی کاربر واقعی دیگه نمیتونه دسترسی داشته باشه چونکه هکر با سشن آی دی سرقتی وارد میشه و با لطف این تابع سشن آی دی جدید برای هکر ارسال میشه و کل امکانات کاربری در اختیار هکر قرار میگیره .
بهتر است که موارد دیگه ای برای استفاده از این تابع اضافه بشه تا این مشکل برطرف بشه ، مثل آی پی
ممنون میشم اگر با مثال عنوان کنید :)

colors
یک شنبه 24 دی 1391, 12:13 عصر
سلام

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

این تابع Session_Regenerate_id تا حدودی کمک میکنه از این مشکل دوری کرد. مثلا

<?php
session_start();
$_SESSION['USER_SESS_TOKEN'] = false;
if(check_login()){
session_regenerate_id();
$_SESSION['USER_SESS_TOKEN'] = true;
}
?>

mtchabok
یک شنبه 24 دی 1391, 12:42 عصر
ممنون میشم اگر با مثال عنوان کنید :)

<?php
session_start();

$result = mysql_query('select `ip` from table where session_id="'.session_id().'"');

if($result && mysql_num_rows($result)==1){
$ip = mysql_result($result, 0, 0);
if($_SERVER['REMOTE_ADDR'] == $ip){
session_regenerate_id(true);
mysql_query('insert into table("session_id", "ip") values("'.session_id().'", "'.$_SERVER['REMOTE_ADDR'].'")');
}
}

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

eshpilen
یک شنبه 24 دی 1391, 12:46 عصر
اون که البته ! اما خوب توی یک فروم خارجی بحث سر همین بود که کجا استفاده شه !
2 نفر هم باهم بحثشون شده بود که موقع Logout بهتره و اون یکی میگفت login !
هرکدوم هم دلیل خودشون رو داشتن ! اونی که میگفت logout دلیلش این بود که بعد از لاگ اوت وقتی سشن رو عوض کنی حتی اگرم حک بشه دیگه سشن لاگین قبلی موجود نیست !
خلاصه اینجا بود که گیچ شدم دیگه !:))
از من میپرسی میگم بعد از هر استارت سشن استفاده بشه. حالا هرکجا میخواد باشه. حتی اگر کاربر لاگین نیست!
موقع logout هم بهتره انجام بشه. کار از محکم کاری عیب نمیکنه. چون این قضایای امنیت و انواع حمله ها و سیستم سشن پیچ در پیچ زیاد داره تحلیلش وقت و انرژی مطلبه و آخرش هم چرا روزهء شک دار؟ خب موقع لاگ آوت هم استفاده کنید که شکی توش نباشه. ضرر نداره.

البته قبل از استارت سشن این کدها رو هم همیشه اجرا کرده باشید:

ini_set('session.use_cookies', '1');
ini_set('session.use_only_cookies', '1');
ini_set("session.cookie_httponly", 1);
ini_set("session.use_trans_sid", 0);
این کدها باعث میشن که سشن آیدی فقط در کوکی ذخیره بشه و هیچوقت در لینک و جای دیگه نره که یوقت باعث نشت اتفاقیش بشه.
البته session.cookie_httponly برای امنیت بیشتر کوکی سشن هست در سمت کلاینت که نشه با استفاده از باگهای XSS اون رو سرقت کرد.

eshpilen
یک شنبه 24 دی 1391, 12:51 عصر
سلام
جناب eshpilen چرا شما همه چی رو امنیتی می کنین .
این یه تابع خیلی ساده اس برای تغییر آی دی سشن .
آیدی سشن رو واسه چی باید تغییر بدیم خب؟
تاجاییکه میدونم کاربرد اصلیش برای امنیته؛ اگر تنها کاربردش نباشه.


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


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

colors
یک شنبه 24 دی 1391, 13:18 عصر
ای داد بی داد! یه حفره امنیتی باحال!!!

در همین رابطه داشتم چندتا نمونه که تو ذهنم بود رو تست میکردم که به چیز جالبی رسیدم. عجب
میشه خیلی راحت از طریق url آی دی هر سشنی رو خودمون تعریف کنیم :قهقهه:
تو این مثال چون لازمه محتویات کوکی حامل آی دی سشن رو بخونیم، سشن هارو تو بانک ذخیره میکنم (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&highlight=%D8%B0%D8%AE%DB%8C%D8%B1%D9%87+%D8%B3%D8 %B4%D9%86) که راحت بهشون دسترسی داشته باشیم.

خب، کدهای زیرو بریزید تو یه صفحه

require_once('sssh.class.php');
$session=new MySessionHandler('localhost','root','','session_db ');
session_start();

$_SESSION['user'] = 'colors';
حال اون صفحه رو توسط مرورگر باز میکنم.
و نتیجه برای من این شد.(تصویر ضمیمه اول). یعنی آی دی سشن برای من : df1kp0qjqc2ttgij40g5mmvaa0 شد.
خب الان اون سطر از جدول(سشن تولید شده) رو حذف کنید و مرورگرو exit و مجددا run کنید.
الان بدونه اینکه به آدرسی برید مستقیما این آدرس رو فراخوانی کنید:
http://localhost/test1/example.php?PHPSESSID=idad
یعنی قبل از اینکه اون صفحه رو باز کنید حتما اون پارامتر PHPSESSID رو با مقداری دلخواه مثلا idad به urlتون اضافه و بعد go کنید.(تصویر ضمیمه دوم).
و نتیجه برای من این شد.(تصویر ضمیمه سوم). یعنی آی دی سشن برای من : IDAD شد. یعنی همون مقداری که برای پارامتر PHPSESSID در نظر گرفتیم. :لبخند:

خوب هکر میتونه مث آب خوردن یه لینکی چیزی به ما بده که با باز کردنش سشن آی دی ما اونی بشه که دوس داره و ...

برای جلوگیری از این آبروریزی فقط کافیه تابع session_regenerate_id به کار بگیریم. مثلا

require_once('sssh.class.php');
$session=new MySessionHandler('localhost','root','','session_db ');
session_start();

session_regenerate_id();
$_SESSION['user'] = 'colors';
الان شما هرجوری که سایت رو باز کنید ( چه با اون پارامتر PHPSESSID ) یا بدون اون، یک آی دی رندوم برای سشن ایجاد میشه.
ولی بازم با این کار فقط جلوی اینو میگیریم که بچه هکر نتونه با استفاده از URL برای خودش هر غل..ی خواست بکنه. ولی میتونه با بدست آوردن اون آی دی حال کنه. پس اون کدی که تو چند پست بالاتر گذاشتم میتونه راه کار نهایی باشه.

eshpilen
یک شنبه 24 دی 1391, 13:36 عصر
ای داد بی داد! یه حفره امنیتی باحال!!!

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

خسته نباشید.
تازه کشف کردی؟ :متفکر:
همینه دیگه این چیزا رو نمیدونید بعد خب چطوری میخواید روی امنیتش کار کنید.


خوب هکر میتونه مث آب خوردن یه لینکی چیزی به ما بده که با باز کردنش سشن آی دی ما اونی بشه که دوس داره و ...
Session fixation به همین میگن دیگه.


برای جلوگیری از این آبروریزی فقط کافیه تابع session_regenerate_id به کار بگیریم.
ولی بازم با این کار فقط جلوی اینو میگیریم که بچه هکر نتونه با استفاده از URL برای خودش هر غل..ی خواست بکنه. ولی میتونه با بدست آوردن اون آی دی حال کنه. پس اون کدی که تو چند پست بالاتر گذاشتم میتونه راه کار نهایی باشه.

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

ini_set('session.use_cookies', '1');ini_set('session.use_only_cookies', '1');ini_set("session.cookie_httponly", 1);ini_set("session.use_trans_sid", 0);
باعث میشن که دیگه از طریق URL نشه سشن آیدی داد.
یه نکتهء دیگر هم اینه که اگر سشن آیدی در URL مجاز باشه اونوقت ممکنه کاربر مثلا لینک صفحه ای رو که داره مشاهده میکنه در یک فروم یا چت بذاره و بدون اینکه بدونه سشن آیدی خودش رو که در اون URL هست در اختیار هکرها بذاره.

eshpilen
یک شنبه 24 دی 1391, 13:39 عصر
اینه که میگم سشن تنظیم زیاد داره و زیادی پیچ در پیچه!
یکسری قابلیت ها مثل سشن آیدی در URL از قدیم بوده، ولی امروزه کاربردش خیلی کمه، ولی بصورت پیشفرض فعاله و ضعف امنیتی ایجاد میکنه.

colors
یک شنبه 24 دی 1391, 14:14 عصر
خسته نباشید.
تازه کشف کردی؟ :متفکر:
همینه دیگه این چیزا رو نمیدونید بعد خب چطوری میخواید روی امنیتش کار کنید.

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

saeed-71
یک شنبه 14 مهر 1392, 18:44 عصر
سلام.اقا این تاپیک 14 رو چجوری باید بکار ببریم؟
این کد منه


<?php
ob_start();
session_start();
session_regenerate_id();
if($_SESSION['login']!=true)
{
header("location:../noregister.php");
exit();
}
?>

colors
یک شنبه 14 مهر 1392, 19:59 عصر
سلام.اقا این تاپیک 14 رو چجوری باید بکار ببریم؟
این کد منه


<?php
ob_start();
session_start();
session_regenerate_id();
if($_SESSION['login']!=true)
{
header("location:../noregister.php");
exit();
}
?>


نیازی به اجراش نیست!
الان کد شما از تابع session_regenerate_id بهره میبره که اون روش پست 14 رو خنثی میکنه.
البته کدهای زیرروهم به اول کدهاتون اضافه کنید.

ini_set('session.use_cookies', '1');ini_set('session.use_only_cookies', '1');ini_set("session.cookie_httponly", 1);ini_set("session.use_trans_sid", 0);
معمولا تو boot میزارنش

saeed-71
یک شنبه 14 مهر 1392, 22:01 عصر
البته کدهای زیرروهم به اول کدهاتون اضافه کنید.

ini_set('session.use_cookies', '1');ini_set('session.use_only_cookies', '1');ini_set("session.cookie_httponly", 1);ini_set("session.use_trans_sid", 0);
معمولا تو boot میزارنش
مرسی اقا فقط این کد رو قبل سشن استارت اضاف کنم یا بعدش؟؟؟؟؟؟/

navid3d_69
یک شنبه 14 مهر 1392, 22:34 عصر
قبلش باید بزارید

mbf5923
یک شنبه 14 مهر 1392, 22:47 عصر
چرا بعضی دوستان بحث ها رو پیچیده میکنن که بعد خودشون هم نفهمن چی گفتن ....
بعضی مواقع هکرها دست به حملاتی میزنن به نام hijacking که به نوعی سرقت session کاربران سایت ها هستش
برای اینکه کار هکر محترم کمی دشوار بشه بهتره از session_regenerate_id در موارد زیر استفاده بشه نه همه جا
1- موقع ورود کاربر وقتی قراره سشن برای اون ساخته بشه(صفحه لوگین)
2-موقع خروج کاربر (صفحه لاگ اوت)
3-برای ادمین در تمامی قسمت هایی که سشن تغییر میکنه.
لازم هست بعد از استارت کردن سشن از این دستور استفاده بشه:

session_start();
session_regenerate_id(true);
این true که توی پرانتز به عنوان ورودی تابع داده شده به این معنی هست که سشن ساخته شده قبی از بین بره و سشن جدید جایگزین اون بشه

saeed-71
دوشنبه 15 مهر 1392, 09:26 صبح
چرا بعضی دوستان بحث ها رو پیچیده میکنن که بعد خودشون هم نفهمن چی گفتن ....
بعضی مواقع هکرها دست به حملاتی میزنن به نام hijacking که به نوعی سرقت session کاربران سایت ها هستش
برای اینکه کار هکر محترم کمی دشوار بشه بهتره از session_regenerate_id در موارد زیر استفاده بشه نه همه جا
1- موقع ورود کاربر وقتی قراره سشن برای اون ساخته بشه(صفحه لوگین)
2-موقع خروج کاربر (صفحه لاگ اوت)
3-برای ادمین در تمامی قسمت هایی که سشن تغییر میکنه.
لازم هست بعد از استارت کردن سشن از این دستور استفاده بشه:

session_start();
session_regenerate_id(true);
این true که توی پرانتز به عنوان ورودی تابع داده شده به این معنی هست که سشن ساخته شده قبی از بین بره و سشن جدید جایگزین اون بشه
این true رو نباید جایی تعریف کرد؟تعریف شدست؟
یا اینکه شما طبق کد من true رو گذاشتید؟

mbf5923
دوشنبه 15 مهر 1392, 11:33 صبح
نه دوست عزیز این ورودی تابع هستش نه طبق کد شماست و نه تعریف نیاز داره
اگه False بدین تابع با حفظ سشن آیدی قبل یک سشن آیدی جدید به کاربر اختصاص میده که یعنی کشک اما وقتی True میدیم یعنی قبلی رو ازبین ببر یه سشن آیدی جدید به کاربر بده

abolfazl-z
دوشنبه 15 مهر 1392, 19:05 عصر
اگه False بدین تابع با حفظ سشن آیدی قبل یک سشن آیدی جدید به کاربر اختصاص میده که یعنی کشک اما وقتی True میدیم یعنی قبلی رو ازبین ببر یه سشن آیدی جدید به کاربر بده

دقیقا درست فرمودید.

می خواستم همی رو بگم.

من این کار رو در دو مرورگر تست کردم و دیدم راحت بدون استفاده از true هک میشه !