بررسی Attribute های AllowHtml و ValidationInput

ASP.NET MVC به طور پیش فرض از پذیرش model هایی که دارای تگ های html هستند اجتناب میکند و دلیل این کار هم جلوگیری از حملات هکر ها از طریق XSS می باشد .  اگر View یی که حاوی کدهای Html می باشد را به سمت Controller ارسال کنیم با پیغام خطای زیر رو به رو خواهیم شد :

HtmlInput

با این وضعیت چاره چیست ؟ در مواقعی لازم است که از یک ادیتور متن استفاده کنیم ،با این شرایط چاره ای جز استفاده از یک Textarea معمولی وجود نخواهد داشت .

برای رفع این مشکل می توانیم از دو Attribute زیر کمک بگیرم تا بتوان کدهای Html را هم از کاربر دریافت کرد :

1- AllowHtml

2- ValidationInput

 

ValidationInput Attribute :

یکی از راه های ساده برای پذیرش رشته های حاول تگ های HTML استفاده از ValidationInput می باشد . این Attribute را هم می توان به Action Method ها اعمال کرد که در این حالت فقط بر روی Action Method مورد نظر اعمال می شود و یا اینکه می توان آن را سراسری بر روی تمامی Action های یک Controller اعمال کرد که در این حالت باید این Attribute را بر روی Controller مورد نظر اعمال کرد .

قطعه کد زیر نمونه ای از نحوه استفاده از این Attribute می باشد :

[ValidateInput(false)]
public class HomeController : Controller
{
 public ActionResult AddArticle()
 {
 return View();
 }
 
 [HttpPost]
 public ActionResult AddArticle(BlogModel blog)
 {
 if (ModelState.IsValid)
 {
 
 }
 return View();
 }
}

 و اگر بخواهیم فقط بر روی یک Action Method اعمال شود همانند زیر خواهد بود :

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 ما به صورت زیر است :

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 به صورت زیر استفاده می کنیم :

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  و مقابله با آن مقاله زیر پیشنهاد می شود :

مقابله با XSS ، یکبار برای همیشه


توسط : عثمان رحیمی  1 ماه قبل ، شنبه 6 تیر 1394 ساعت 04:11  0  2087

نظر شما برای ما مهم است و به ما در بهبود سایت کمک میکند.


ارسال نظر
  • نام (اختیاری ) :
  • پست الکترونیک :
  • توضیحات :

مطالب مرتبط