PDA

View Full Version : logout شدن با درخواست post یا درخواست Get ؟



pooya1072
جمعه 15 آذر 1398, 17:54 عصر
سلام دوستان
توی مقاله ای خوندم که جهت logout شدن از اکانت , به جای درخواست Get درخواست Post را به سرور ارسال کنید.
از دوستان کسی اطلاعی در این زمینه داره که آیا چنین مطلبی صحت داره یا نه و اگر صحت داره دلیلش چیه؟

مهدی کرامتی
جمعه 15 آذر 1398, 19:56 عصر
دلیلش اینه که کار رو برای اسکریپت هایی که به صورت اتفاقی ممکنه با ارسال دستور Get به آدرس /Account/Logout ممکنه کاربر رو از حساب کاربری خارج کنند سخت تر بشه.

pooya1072
جمعه 15 آذر 1398, 21:02 عصر
ممنون و متشکر

magicmilkom
چهارشنبه 30 بهمن 1398, 00:23 صبح
سلام:
دلیل آن واضح است. مرورگرها می توانند از حافظه پنهان استفاده کنند ، یا حتی می توانند URL های نوع GET را می توانند به قول معروف Pre-Fetch کنند یعنی از قبل دریافت کنند(و بسیاری از مرورگرهای مدرن نیز همین کار را انجام می دهند). اگر شما نمی خواهید مرورگر به طور اتفاقی شما را از مکانی که هستید خارج کند باید یادآور کنم که می تونید از نوع post استفاده کنید چرا که دیگر مرورگر نمی تواند به URL های از نوع پست به راحتی دسترسی داشته باشد چون که پیوندهایی هستند که می تواند با Javascript در ارتباط باشد.
مسئله مهمتر اینه که اگر متد شما برای logoff از نوع get باشه پس هر داده ی پست شده از طرف یوزر می تونه شما رو از سیستم خارج کنه! مثال عرض می کنم خدمتتون:
فرض کنید شما فرومی در سایت خودتون دارید:
به شما این امکان را دادند که بتونید تصاویر را پست کنید. حالا فرض کنید یه کاربری میاد و تصویری را به به نشانی http://url-to-log-off-the-site ارسال می کنه این کار می تونه خیلی راحت سایت شما را به هم بریزه چون شما نمی تونید صفحه ای را مشاهده کنید تا بتونی حذفش کنی تا شما را از سیستم خارج نکنه!
معمولا هم از فرم فیلد Anti-forgery token استفاده می کنن که به صورت GET انکود (encode) میشه. که در این صورت شما دیگه نیازی نیست در روش Post این کار رو انجام بدید.

در asp.net core این کار خیلی رعایت شده و از httppost برای لاگین و رجیستر و حتی لاگ آف استفاده میشه.

[Route("Register")]
public IActionResult Register()
{
return View();
}


[HttpPost]
[Route("Register")]
public IActionResult Register(RegisterViewModel register,IFormCollection form)
{
...
return View();
}
برای لاگ اف هم داریم:


public class LogoutController : Controller{
[HttpPost]
public async Task<IActionResult> Logout()
{
// SomeOtherPage is where we redirect to after signout
await HttpContext.SignOutAsync(CookieAuthenticationDefau lts.AuthenticationScheme);
HttpContext.Response.Cookies.Delete($".AspNetCore.{CookieAuthenticationDefaults.Authenti cationScheme}");
return Redirect("/");
}
}