نشست net/http/session
نشست کاربر با کوکی: نگه داشتن داده میان درخواستها و توکن CSRF.
واردسازی شبکه.اچ تی تی پی.نشست
نشست دادهی هر بازدیدکننده را روی سرور نگه میدارد و فقط یک شناسهی تصادفی را در کوکی HttpOnly به مرورگر میدهد. برای ورود کاربر، سبد خرید و توکن فرم در سایتی که با اچ تی تی پی ساخته شده به کار میرود. وقتی کارخواه مرورگر نیست، یا چند سرور باید یک ورود را بدون حافظهی مشترک بپذیرند، معمولاً توکن امضاشدهی جی دبلیو تی گزینهی بهتری است.
روند کار در گرداننده: شروع نشست بازدیدکننده را از روی کوکی پیدا میکند یا تازه میسازد (و کوکی را میگذارد)، مقدارها را با مقدار و تنظیم مقدار میخوانید و تغییر میدهید، و ذخیره نشست را برمیگرداند. مقدارها رشتهاند. نشست پس از max_age ثانیه بیدرخواست منقضی میشود و هر درخواستی که آن را پیدا کند شمارش را از نو شروع میکند.
اشتباههای رایج:
- فراموش کردن
ذخیره.شروعیک رونوشت برمیگرداند و تغییرها فقط با ذخیره به انبار میرسند. - نگه داشتن رشتههای درخواست.
پارامتر زمینه،فرم زمینهو مانند آنها با برگشتن گرداننده آزاد میشوند، پس پیش از ذخیره بارشته.رونوشترونوشتشان را بگیرید (سبد خرید را ببینید). - صدا نزدن
بازتولیدپس از ورود، که شناسهای را که مهاجم ممکن است در مرورگر کاشته باشد معتبر نگه میدارد. - انتظار ماندگاری نشستها. نشستها در حافظهی همین فرایند هستند: راهاندازی دوباره همه را بیرون میکند و دو فرایند سرور آنها را با هم شریک نیستند. دو درخواست همزمان از یک بازدیدکننده هر کدام رونوشت خودش را ذخیره میکند و
ذخیرهی دیرتر برنده است.
ورود و خروج
شکل معمول: گردانندهی ورود گذرواژه را بررسی میکند، بازتولید را صدا میزند تا کاربر شناسهی تازه بگیرد، با تنظیم مقدار نگه میدارد که او کیست و به صفحهی دیگری میفرستد. هر صفحهی محافظتشده شروع را صدا میزند و مقدار دارد را بررسی میکند. خروج با پایان انجام میشود که نشست را روی سرور پاک میکند و کوکی را هم پاک میکند.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.نشست
واردسازی شبکه.مسیریاب
تابع ورود(ز: صحیح۶۴):
اگر اچ تی تی پی.فرم(ز، "user") نابرابر "sara" یا اچ تی تی پی.فرم(ز، "password") نابرابر "open sesame":
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۱)
اچ تی تی پی.متن(ز، "نام کاربری یا گذرواژه نادرست است")
برگشت
پایان
ناپایا ن := نشست.شروع(ز)
نشست.بازتولید(ز، ن)
نشست.تنظیم مقدار(ن، "user"، "sara")
نشست.ذخیره(ن)
اچ تی تی پی.تغییرمسیر(ز، "/me")
پایان
تابع من(ز: صحیح۶۴):
ن := نشست.شروع(ز)
اگر وارونه نشست.مقدار دارد(ن، "user"):
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۱)
اچ تی تی پی.متن(ز، "لطفا وارد شوید")
برگشت
پایان
اچ تی تی پی.متن(ز، "سلام " + نشست.مقدار(ن، "user"))
پایان
تابع خروج(ز: صحیح۶۴):
نشست.پایان(ز)
اچ تی تی پی.متن(ز، "خارج شدید")
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.ارسال(م، "/login"، ورود)
مسیریاب.دریافت(م، "/me"، من)
مسیریاب.ارسال(م، "/logout"، خروج)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۹۰)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
پایه := "http://127.0.0.1:19790"
ناپایا مرورگر := اچ تی تی پی.کارخواه جدید()
مرورگر.تنظیم سرصفحه("Content-Type"، "application/x-www-form-urlencoded")
سرچاپ اچ تی تی پی.بدنه(مرورگر.دریافت(پایه + "/me"))
بد := مرورگر.ارسال(پایه + "/login"، "user=sara&password=guess")
سرچاپ اچ تی تی پی.وضعیت(بد)، اچ تی تی پی.بدنه(بد)
خوب := مرورگر.ارسال(پایه + "/login"، "user=sara&password=open+sesame")
سرچاپ اچ تی تی پی.وضعیت(خوب)، اچ تی تی پی.دریافت سرصفحه(خوب، "location")
سرچاپ اچ تی تی پی.بدنه(مرورگر.دریافت(پایه + "/me"))
سرچاپ اچ تی تی پی.بدنه(مرورگر.ارسال(پایه + "/logout"، ""))
سرچاپ اچ تی تی پی.بدنه(مرورگر.دریافت(پایه + "/me"))
پایاناچ تی تی پی.کارخواه جدید کوکیها را میان درخواستها مثل مرورگر نگه میدارد؛ برای همین /me دوم ورود را میبیند. یک اچ تی تی پی.دریافت ساده کوکی نمیفرستد و همیشه بازدیدکنندهی تازه به نظر میرسد.
محافظت از فرمها با توکن CSRF
مرورگر کوکی نشست را با هر درخواست به سایت شما میفرستد، حتی درخواستی که فرمی در سایت دیگر آغاز کرده است. توکن CSRF جلوی این را میگیرد: توکن سی اس آر اف یک توکن تصادفی در نشست میگذارد، شما آن را در یک فیلد پنهان قرار میدهید، و گردانندهای که فرم را میگیرد آن را با تایید سی اس آر اف بررسی میکند. فرم جعلی توکن را نمیداند و رد میشود.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.نشست
واردسازی شبکه.مسیریاب
تابع فرم(ز: صحیح۶۴):
ناپایا ن := نشست.شروع(ز)
توکن := نشست.توکن سی اس آر اف(ن)
نشست.ذخیره(ن)
اچ تی تی پی.اچ تی ام ال(ز، `<form method="post" action="/email"><input type="hidden" name="csrf" value="` + توکن + `"><input name="email"></form>`)
پایان
تابع تغییر ایمیل(ز: صحیح۶۴):
ن := نشست.شروع(ز)
اگر وارونه نشست.تایید سی اس آر اف(ن، اچ تی تی پی.فرم(ز، "csrf")):
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۳)
اچ تی تی پی.متن(ز، "فرم منقضی شده است، صفحه را دوباره باز کنید")
برگشت
پایان
اچ تی تی پی.متن(ز، "ایمیل به " + اچ تی تی پی.فرم(ز، "email") + " تغییر کرد")
پایان
تابع توکن صفحه(صفحه: رشته): رشته:
آغاز := صفحه.بیاب(`value="`) + ۷
باقی := صفحه.زیررشته(آغاز، صفحه.طول() - آغاز)
برگشت باقی.زیررشته(۰، باقی.بیاب(`"`))
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/email"، فرم)
مسیریاب.ارسال(م، "/email"، تغییر ایمیل)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۹۱)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
نشانی := "http://127.0.0.1:19791/email"
ناپایا مرورگر := اچ تی تی پی.کارخواه جدید()
مرورگر.تنظیم سرصفحه("Content-Type"، "application/x-www-form-urlencoded")
توکن := توکن صفحه(اچ تی تی پی.بدنه(مرورگر.دریافت(نشانی)))
سرچاپ "طول توکن:"، توکن.طول()
جعلی := مرورگر.ارسال(نشانی، "email=evil%40example.com")
سرچاپ اچ تی تی پی.وضعیت(جعلی)، اچ تی تی پی.بدنه(جعلی)
واقعی := مرورگر.ارسال(نشانی، "csrf=" + توکن + "&email=sara%40example.com")
سرچاپ اچ تی تی پی.وضعیت(واقعی)، اچ تی تی پی.بدنه(واقعی)
پایانپس از توکن سی اس آر اف، ذخیره را صدا بزنید، چون بار اول توکن در رونوشت شما از نشست ساخته میشود.
نگه داشتن داده میان درخواستها: سبد خرید
مقدارها رشتهاند، پس عددها با تبدیل.رشته به عدد رفت و برگشت میکنند. هر بازدیدکننده نشست جداگانه دارد، پس دو کارخواه که همزمان سبد پر میکنند هرگز کالاهای هم را نمیبینند. پاک کردن مقادیر نشست را خالی میکند اما شناسهی کاربر را نگه میدارد.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.نشست
واردسازی شبکه.مسیریاب
واردسازی تبدیل
واردسازی رشته
تابع افزودن(ز: صحیح۶۴):
کالا := رشته.رونوشت(اچ تی تی پی.پارامتر(ز، "item"))
ناپایا ن := نشست.شروع(ز)
ناپایا تعداد := ۰
اگر نشست.مقدار دارد(ن، کالا):
تعداد = تبدیل.رشته به عدد(نشست.مقدار(ن، کالا))
پایان
نشست.تنظیم مقدار(ن، کالا، "" + (تعداد + ۱))
نشست.ذخیره(ن)
اچ تی تی پی.متن(ز، کالا + " افزوده شد")
پایان
تابع سبد(ز: صحیح۶۴):
ن := نشست.شروع(ز)
ناپایا متن := ""
هر کالا در ["tea"، "bread"، "cheese"]:
اگر نشست.مقدار دارد(ن، کالا):
متن = متن + (متن برابر "" ? "" : "، ") + کالا + " x" + نشست.مقدار(ن، کالا)
پایان
پایان
اچ تی تی پی.متن(ز، متن برابر "" ? "سبد خالی است" : متن)
پایان
تابع خالی کردن(ز: صحیح۶۴):
ناپایا ن := نشست.شروع(ز)
نشست.پاک کردن مقادیر(ن)
نشست.ذخیره(ن)
اچ تی تی پی.متن(ز، "خالی شد")
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.ارسال(م، "/cart/:item"، افزودن)
مسیریاب.دریافت(م، "/cart"، سبد)
مسیریاب.حذف(م، "/cart"، خالی کردن)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۹۲)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
پایه := "http://127.0.0.1:19792/cart"
ناپایا سارا := اچ تی تی پی.کارخواه جدید()
ناپایا رضا := اچ تی تی پی.کارخواه جدید()
_ := سارا.ارسال(پایه + "/tea"، "")
_ := سارا.ارسال(پایه + "/tea"، "")
_ := سارا.ارسال(پایه + "/bread"، "")
_ := رضا.ارسال(پایه + "/cheese"، "")
سرچاپ "سارا:"، اچ تی تی پی.بدنه(سارا.دریافت(پایه))
سرچاپ "رضا:"، اچ تی تی پی.بدنه(رضا.دریافت(پایه))
سرچاپ اچ تی تی پی.بدنه(سارا.حذف(پایه))
سرچاپ "سارا:"، اچ تی تی پی.بدنه(سارا.دریافت(پایه))
سرچاپ "رضا:"، اچ تی تی پی.بدنه(رضا.دریافت(پایه))
پایانبه رشته.رونوشت دور پارامتر زمینه دقت کنید. مقدارهایی که از درخواست خوانده میشوند وقتی گرداننده برمیگردد آزاد میشوند و نشست از درخواست بیشتر عمر میکند؛ پس هر چیزی از درخواست را پیش از آنکه کلید یا مقدار نشست کنید رونوشت بگیرید. بدون رونوشت، کلیدهای سبد به حافظهی آزادشده اشاره میکنند و سبد خالی به نظر میرسد.
تنظیمات کوکی و طول عمر
پیکربندی نام کوکی، مدت زنده ماندن نشست بدون فعالیت، فقطHTTPS بودن کوکی و حالت SameSite آن را تعیین میکند. آن را یک بار و پیش از راه افتادن سرور صدا بزنید. در سایتی که روی HTTPS است برای secure مقدار درست بدهید؛ Strict کوکی را از هر درخواستی که از سایت دیگری آغاز شده دور نگه میدارد و Lax، که پیشفرض است، وقتی کاربر روی پیوندی میزند آن را میفرستد.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.نشست
واردسازی شبکه.مسیریاب
واردسازی رشته
تابع سلام(ز: صحیح۶۴):
ن := نشست.شروع(ز)
اچ تی تی پی.متن(ز، "نشست " + (ن.شناسه.طول() > ۰))
پایان
تابع ریشه:
نشست.پیکربندی("shop_sid"، ۱۸۰۰، درست، "Strict")
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/"، سلام)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۹۳)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
پ := اچ تی تی پی.دریافت("http://127.0.0.1:19793/")
سرچاپ اچ تی تی پی.بدنه(پ)
خط := اچ تی تی پی.خطوط کوکی(پ).دریافت(۰)
هر تکه در رشته.تفکیک کردن(خط، "; "):
اگر تکه.شروع با("shop_sid="):
سرچاپ "shop_sid=<شناسهی تصادفی>"
وگرنه وارونه تکه.شروع با("Expires="):
سرچاپ تکه
پایان
پایان
ناپایا ن := نشست.جدید()
نشست.تنظیم مقدار(ن، "theme"، "dark")
نشست.ذخیره(ن)
سرچاپ "نگهداری به مدت"، ن.بیشترین عمر، "ثانیه"
سرچاپ "پاکشدهها:"، نشست.پاکسازی منقضی شده ها()
نشست.نابودسازی(ن.شناسه)
ناپایا یافت := درست
_ := نشست.دریافت(ن.شناسه، یافت)
سرچاپ "پس از نابودسازی:"، یافت
پایانکوکی همیشه HttpOnly است، پس اسکریپتهای صفحه نمیتوانند شناسه را بخوانند. نشستهای منقضی در هر صد بار صدا زدن جدید یا دریافت پاک میشوند؛ پاکسازی منقضی شده ها همین کار را فوری انجام میدهد و شمار پاکشدهها را برمیگرداند. نشستها در حافظهی یک فرایند زندگی میکنند، پس با راهاندازی دوباره همه خارج میشوند و دو نسخهی سرور پشت توزیعکنندهی بار آنها را با هم شریک نیستند. برای این کار داده را در پایگاه دادهای مثل ردیس نگه دارید.
گونهها
داده نشست SessionData
ساختار داده نشست| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| مقدارها | items | نگاشت<رشته، رشته> | مقدارها. |
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.اچ تی تی پی.نشست
واردسازی شبکه.مسیریاب
واردسازی تبدیل
تابع بازدید(ز: صحیح۶۴):
ناپایا ن := نشست.شروع(ز)
ناپایا شمار := ۱
اگر نشست.مقدار دارد(ن، "visits"):
شمار = تبدیل.رشته به عدد(نشست.مقدار(ن، "visits")) + ۱
پایان
نشست.تنظیم مقدار(ن، "visits"، "" + شمار)
نشست.ذخیره(ن)
اچ تی تی پی.متن(ز، "بازدید " + شمار)
پایان
تابع ورود(ز: صحیح۶۴):
ناپایا ن := نشست.شروع(ز)
نشست.بازتولید(ز، ن)
نشست.تنظیم مقدار(ن، "user"، "ali")
توکن := نشست.توکن سی اس آر اف(ن)
نشست.ذخیره(ن)
اچ تی تی پی.متن(ز، "" + نشست.تایید سی اس آر اف(ن، توکن) + " " + نشست.تایید سی اس آر اف(ن، "x"))
پایان
تابع خروج(ز: صحیح۶۴):
نشست.پایان(ز)
اچ تی تی پی.متن(ز، "خداحافظ")
پایان
تابع ریشه:
نشست.پیکربندی("sid"، ۳۶۰۰، نادرست، "Lax")
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/"، بازدید)
مسیریاب.ارسال(م، "/login"، ورود)
مسیریاب.ارسال(م، "/logout"، خروج)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۰۶)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
ناپایا ک := اچ تی تی پی.کارخواه جدید()
پایه := "http://127.0.0.1:19606"
سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/"))
سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/"))
سرچاپ اچ تی تی پی.بدنه(ک.ارسال(پایه + "/login"، ""))
سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/"))
سرچاپ اچ تی تی پی.بدنه(ک.ارسال(پایه + "/logout"، ""))
سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/"))
ناپایا ن := نشست.جدید()
نشست.تنظیم مقدار(ن، "a"، "1")
نشست.تنظیم مقدار(ن، "b"، "2")
سرچاپ نشست.حذف مقدار(ن، "a")، ن.داده.مقدارها.اندازه()
نشست.ذخیره(ن)
ناپایا یافت := نادرست
ب := نشست.دریافت(ن.شناسه، یافت)
سرچاپ یافت، نشست.مقدار(ب، "b")، ب.بیشترین عمر، ن.شناسه.طول() > ۰
نشست.پاک کردن مقادیر(ن)
نشست.نابودسازی(ن.شناسه)
_ := نشست.دریافت(ن.شناسه، یافت)
سرچاپ یافت، نشست.پاکسازی منقضی شده ها() >= ۰
سرچاپ نشست.نام پیش فرض کوکی، نشست.حداکثر عمر پیش فرض
پایاننشست Session
ساختار نشست| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| شناسه | id | رشته = "" | شناسهی تصادفی که در کوکی است. |
| داده | data | داده نشست | دادههای نشست. |
| زمان ساخت | created_at | صحیح۶۴ = 0 | زمان ساختن. |
| آخرین استفاده | last_seen | صحیح۶۴ = 0 | آخرین استفاده. |
| بیشترین عمر | max_age | صحیح = 0 | چند ثانیه نشست بدون درخواست زنده میماند؛ صفر یا کمتر یعنی هرگز منقضی نمیشود. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
پایاها و متغیرها
نام پیش فرض کوکی DefaultCookieName
پایا نام پیش فرض کوکی: رشته = "salam_sid"نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
حداکثر عمر پیش فرض DefaultMaxAge
پایا حداکثر عمر پیش فرض: صحیح۳۲ = 86400نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
تابعها
پیکربندی Configure
تابع پیکربندی(cookie_name: رشته، max_age_seconds: صحیح، secure: منطقی، same_site: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
پاکسازی منقضی شده ها CleanupExpired
تابع پاکسازی منقضی شده ها(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
جدید New
تابع جدید(): نشستنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
دریافت Get
تابع دریافت(id: رشته، ok &: منطقی): نشستok نادرست است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
ذخیره Save
تابع ذخیره(s: نشست)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
نابودسازی Destroy
تابع نابودسازی(id: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
مقدار Value
تابع مقدار(s: نشست، key: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
مقدار دارد HasValue
تابع مقدار دارد(s: نشست، key: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
تنظیم مقدار SetValue
تابع تنظیم مقدار(s &: نشست، key: رشته، value: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
حذف مقدار DeleteValue
تابع حذف مقدار(s &: نشست، key: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
پاک کردن مقادیر ClearValues
تابع پاک کردن مقادیر(s &: نشست)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
شروع Start
تابع شروع(h: صحیح۶۴): نشستنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
پایان End
تابع پایان(h: صحیح۶۴)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
بازتولید Regenerate
تابع بازتولید(h: صحیح۶۴، s &: نشست)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
توکن سی اس آر اف CSRFToken
تابع توکن سی اس آر اف(s &: نشست): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam
تایید سی اس آر اف CSRFVerify
تابع تایید سی اس آر اف(s: نشست، token: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-session-Session.salam