در حال بارگذاری...
بررسی طرح و مکانیزمهای مدیریت نشست (Session Management) شامل نحوه ایجاد، نگهداری و خاتمه نشستها در برنامههای وب.
اهداف این درس
مدیریت نشست (Session Management) مکانیزمی است که وضعیت کاربر بین درخواستهای HTTP حفظ میکند. پروتکل HTTP بدون حالت (stateless) است و هر درخواست مستقل است. نشستها به برنامه اجازه میدهند کاربر را شناسایی و وضعیت او را حفظ کنند.
مکانیزمی که وضعیت کاربر را روی سرور ذخیره میکند. یک شناسه منحصربهفرد (Session ID) به کاربر اختصاص داده میشود و در درخواستهای بعدی ارسال میشود.
یک رشته منحصربهفرد و غیرقابل پیشبینی که به هر نشست اختصاص داده میشود. این شناسه معمولاً در Cookie ذخیره و در هر درخواست ارسال میشود.
مدیریت نشست ضعیف میتواند منجر به تصاحب حساب کاربری، سرقت اطلاعات حساس و دسترسی غیرمجاز شود. بسیاری از حملات وب بر ضعفهای مدیریت نشست تکیه دارند.
بررسی کنید نشست چگونه ایجاد و به کاربر اختصاص داده میشود:
Session ID را از نظر امنیتی بررسی کنید:
1# دریافت Cookie2curl -v https://target.com/login 2>&1 | grep -i 'set-cookie'34# بررسی طول Session ID5curl -v https://target.com/login 2>&1 | grep -i 'session'67# بررسی ویژگیهای Cookie8# باید شامل HttpOnly، Secure و SameSite باشد910# بررسی تغییر Session ID بعد از ورود11curl -v https://target.com/login -d 'user=admin&pass=admin' 2>&1 | grep -i 'set-cookie'بررسی کنید نشست چگونه خاتمه مییابد:
حملات رایج مدیریت نشست را تست کنید:
| حمله | روش | تأثیر |
|---|---|---|
| Session Fixation | تحمیل Session ID به قربانی | تصاحب حساب |
| Session Hijacking | سرقت Session ID | تصاحب حساب |
| Session Prediction | حدس زدن Session ID | تصاحب حساب |
| Session Sidejacking | سرقت Session از ترافیک | تصاحب حساب |
| Cross-Site Scripting | سرقت Session از طریق XSS | تصاحب حساب |
| ویژگی | توضیح | حداقل مقدار |
|---|---|---|
| طول | حداقل ۱۲۸ بیت آنتروپی | ۱۶ بایت |
| تصادفی | غیرقابل پیشبینی | استفاده از CSPRNG |
| منحصربهفرد | برای هر نشست منحصربهفرد | بدون تکرار |
| اعتبار | دارای زمان انقضا | ۳۰ دقیقه عدم فعالیت |
| انتقال | فقط از طریق HTTPS | Secure flag |
| دسترسی | غیرقابل دسترسی از JavaScript | HttpOnly flag |
مدیریت نشست ضعیف میتواند منجر به تصاحب حساب کاربری، سرقت اطلاعات حساس، دسترسی غیرمجاز و نقض حریم خصوصی شود.
1const session = require('express-session');2const crypto = require('crypto');34app.use(session({5 secret: crypto.randomBytes(64).toString('hex'),6 name: 'sessionId', // نام سفارشی به جای connect.sid7 resave: false,8 saveUninitialized: false,9 cookie: {10 secure: true, // فقط HTTPS11 httpOnly: true, // غیرقابل دسترسی از JavaScript12 sameSite: 'strict', // جلوگیری از CSRF13 maxAge: 30 * 60 * 1000 // 30 دقیقه14 }15}));1617// تغییر Session ID بعد از ورود18app.post('/login', (req, res) => {19 // احراز هویت کاربر20 req.session.regenerate((err) => {21 req.session.userId = user.id;22 res.redirect('/dashboard');23 });24});2526// معتبر زدایی نشست بعد از خروج27app.post('/logout', (req, res) => {28 req.session.destroy((err) => {29 res.clearCookie('sessionId');30 res.redirect('/login');31 });32});توصیه عملی
همیشه Session ID را بعد از ورود کاربر تغییر دهید. این کار از حمله Session Fixation جلوگیری میکند.
Session ID باید حداقل ۱۲۸ بیت آنتروپی داشته باشد.
نشست باید بعد از خروج کاربر معتبر زدایی (invalidate) شود.
از HTTPS برای انتقال Session ID استفاده کنید.
Session ID نباید در URL قرار گیرد.
کدام ویژگی برای Session ID امن ضروری است؟
Session و Cookie چه تفاوتی دارند؟
Session دادهای است که وضعیت کاربر را روی سرور ذخیره میکند. Cookie دادهای است که روی مرورگر کاربر ذخیره میشود. معمولاً Session ID در Cookie ذخیره میشود تا سرور بتواند نشست کاربر را شناسایی کند.
Session ID امن چه ویژگیهایی دارد؟
Session ID امن باید: حداقل ۱۲۸ بیت آنتروپی داشته باشد، غیرقابل پیشبینی باشد، بعد از خروج معتبر زدایی شود، فقط از طریق HTTPS ارسال شود، و در URL قرار نگیرد.
حمله Session Fixation چیست؟
در حمله Session Fixation، مهاجم Session ID خود را به قربانی تحمیل میکند. وقتی قربانی با آن Session ID وارد میشود، مهاجم میتواند به حساب قربانی دسترسی پیدا کند.