بررسی Attribute های AllowHtml و ValidationInput
ASP.NET MVC به طور پیش فرض از پذیرش model هایی که دارای تگ های html هستند اجتناب میکند و دلیل این کار هم جلوگیری از حملات هکر ها از طریق XSS می باشد . اگر View یی که حاوی کدهای Html می باشد را به سمت Controller ارسال کنیم با پیغام خطای زیر رو به رو خواهیم شد :
با این وضعیت چاره چیست ؟ در مواقعی لازم است که از یک ادیتور متن استفاده کنیم ،با این شرایط چاره ای جز استفاده از یک Textarea معمولی وجود نخواهد داشت .
برای رفع این مشکل می توانیم از دو Attribute زیر کمک بگیرم تا بتوان کدهای Html را هم از کاربر دریافت کرد :
1- AllowHtml
2- ValidationInput
ValidationInput Attribute :
یکی از راه های ساده برای پذیرش رشته های حاول تگ های HTML استفاده از ValidationInput می باشد . این Attribute را هم می توان به Action Method ها اعمال کرد که در این حالت فقط بر روی Action Method مورد نظر اعمال می شود و یا اینکه می توان آن را سراسری بر روی تمامی Action های یک Controller اعمال کرد که در این حالت باید این Attribute را بر روی Controller مورد نظر اعمال کرد .
قطعه کد زیر نمونه ای از نحوه استفاده از این Attribute می باشد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[ValidateInput(false)] public class HomeController : Controller { public ActionResult AddArticle() { return View(); } [HttpPost] public ActionResult AddArticle(BlogModel blog) { if (ModelState.IsValid) { } return View(); } } |
و اگر بخواهیم فقط بر روی یک Action Method اعمال شود همانند زیر خواهد بود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class HomeController : Controller { public ActionResult AddArticle() { return View(); } [ValidateInput(false)] [HttpPost] public ActionResult AddArticle(BlogModel blog) { if (ModelState.IsValid) { } return View(); } } |
AllowHtml Attribute :
فرض کنید Model ما به صورت زیر است :
1 2 3 4 5 6 7 8 9 |
public class AddPostViewModel { public int Id{get;set;} public int Title{get;set;} public int Body{get;set;} } |
مشکلی که ValidationInput دارد این است که اجازه می دهد تمامی Property های Model مورد نظر حاوی تگ های HTML باشند که این این تا حدودی ناامن می باشد. برای محدود کردن Property های یک Model به پذیرش تگ های Html می توان از AllowHtml استفاده نمود . در Model فوق می خواهیم تنها خاصیت Body آن اجازه نگه داشتن تگ های HTML را داشته باشد ، برای این کار از AllowHtml به صورت زیر استفاده می کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 |
using System.ComponentModel.DataAnnotations; using System.Web.Mvc; public class AddPostViewModel { public int Id{get;set;} public int Title{get;set;} [AllowHtml] public int Body{get;set;} } |
در این حالت فقط خاصیت Body مجاز به مقدار دارای HTML می باشد و اگر کاربر در خاصیت Title تگ های HTML را وارد کند با خطای فوق که در ابتدا مقاله ذکر آن کذشت برخورد خواهد کرد .
برای آشنایی بیشتر با XSS و مقابله با آن مقاله زیر پیشنهاد می شود :
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.