ورود

View Full Version : سوال: فرستادن اطلاعات از طریق url



My_LoVe_IRAN
دوشنبه 22 خرداد 1396, 17:59 عصر
سلام
تازه کار با mvc رو شروع کردم سوالی واسم پیش اومده ،وقتی با خود mvc یه مدل نوع دار میسازی که مثلا delete بکنه اطلاعات فیلد delete شونده رو تو url میفرسته اونم از طریق id ! یا حتی برای نمایش هم به همین طریق ! سوالم اینه این روش درستیه ؟ از نظر امنیت درسته که id فیلد من رو به کاربر نمایش بده (منظورم از id کلید اصلی هست) علاوه بر اون امکان داره موتور جستجو بیاد داخل سایت و این دستور رو بده اونوقت اطلاعات من حذف میشه !!! (البته نظر خودمه) این روش فرستادن اطلاعات درست هست یا نه ؟(با توجه به اینکه خود mvc به صورت پیش فرض اینطوری مینویسه)

_behnam_
دوشنبه 22 خرداد 1396, 18:42 عصر
سلام.
فرمی که قراره اطلاعات رو حذف کنه Post باشه ، اینجوری مقادیر توی Url توسط کاربر قابل رویت نیست.
ببینید ، نمایش ID رکورد به تنهایی نمیتونه امنیت سایت رو تحت تاثیر قرار بده. خیلی از سایت ها هستن که توی url ایدی رکورد نمایش میدن و اصلا امنیتشون زیر سوال نرفته. سایت های خبری ، سایت های موزیک ، فیلم و ....
حتی همین تاپیک اگه Url رو ببینید معلومه که آیدی 539185 شناسه هستش.
مهم بستن باگ ها در برنامه نویسی هست.
باید ببینید که کاربر با داشتن آیدی چه کارهایی و از چه طریقی میتونه انجام بده و بیاید اون روش رو ببنید.

My_LoVe_IRAN
دوشنبه 22 خرداد 1396, 18:57 عصر
سلام.
فرمی که قراره اطلاعات رو حذف کنه Post باشه ، اینجوری مقادیر توی Url توسط کاربر قابل رویت نیست.
ببینید ، نمایش ID رکورد به تنهایی نمیتونه امنیت سایت رو تحت تاثیر قرار بده. خیلی از سایت ها هستن که توی url ایدی رکورد نمایش میدن و اصلا امنیتشون زیر سوال نرفته. سایت های خبری ، سایت های موزیک ، فیلم و ....
حتی همین تاپیک اگه Url رو ببینید معلومه که آیدی 539185 شناسه هستش.
مهم بستن باگ ها در برنامه نویسی هست.
باید ببینید که کاربر با داشتن آیدی چه کارهایی و از چه طریقی میتونه انجام بده و بیاید اون روش رو ببنید.
خب خوده mvc به صورت پیش فرض از get استفاده میکنه ! میخام بدونم دلیلی داره واسه این کار ؟ چون پیشنهاد شده از فرم های آماده mvc استفاده بشه ! اما خب این فرم ها دارن از get استفاده میکنن !!!
خب سوالم همینه ،چطور این راه رو ببندیم ؟ اصلا تو mvc که از EF استفاده میکنه لازمه جلوی این کار رو گرفت ؟ تا چه حد ؟

Moien Tajik
دوشنبه 22 خرداد 1396, 20:09 عصر
خب خوده mvc به صورت پیش فرض از get استفاده میکنه ! میخام بدونم دلیلی داره واسه این کار ؟ چون پیشنهاد شده از فرم های آماده mvc استفاده بشه ! اما خب این فرم ها دارن از get استفاده میکنن !!!
خب سوالم همینه ،چطور این راه رو ببندیم ؟ اصلا تو mvc که از EF استفاده میکنه لازمه جلوی این کار رو گرفت ؟ تا چه حد ؟

در MVC ما 2 اکشن Delete داریم ، یکی بصورت GET که اطلاعات رکوردی که قصد حذفش رو دارید رو نمایش میده و اکشن دوم که یک Attribute به اسم ActionName داره که POST هستش ( اطلاعات تکمیلی برای ActionName (http://www.tutorialsteacher.com/mvc/action-selectores-in-mvc) ) ، به این صورت :

// GET: Administrator/News/Delete/5
public async Task<ActionResult> Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
News news = await _db.News.FindAsync(id);
if (news == null)
{
return HttpNotFound();
}
return View(news);
}


// POST: Administrator/News/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DeleteConfirmed(int id)
{
News news = await _db.News.FindAsync(id);
if (news != null) _db.News.Remove(news);
await _db.SaveChangesAsync();
return RedirectToAction("Index");
}


فرمی که POST هست از ValidateAntiForgeryToken استفاده میکنه و از حملات XSS جلوگیری میکنه .
در مرحله بعدی ، کاربر نهایتا کاری که میتونه با ID انجام بده ، دیدن اطلاعات یک رکورد هست که این هم بستگی به Authorization که شما برای اکشن هاتون قرار دادید داره .
شما وقتی اکشن Delete رو براش Authorize قرار میدید ، فقط به کاربر مورد نظر ( مدیر ) امکان حذف میدید و کاربران دیگه از این ID هیچ استفاده دیگه نمیتونن بکنن .