جلوگیری از خطرات احتمالی برای مقدار دریافت شده از Request.Form در ASP.Net MVC
با سلام در این مقاله، با یک مثال توضیح خواهیم داد که چگونه خطا در ASP.Net MVC حل شود یعنی یک مقدار بالقوه خطرناک Request.Form از client شناسایی شود .
حملات XSS (Cross Site Scripting)
در حملات XSS (Cross Site Scripting)، هکر تلاش می کند تا کد HTML یا جاوا اسکریپت را به یک وب سایت از طریق زمینه های INPUT مانند TextBoxes، TextAreas و غیره ارسال کند.
مسئله

علت
ASP.Net به طور پیش فرض تمامی کنترل های ورودی را برای محتویات بالقوه ناامن که می تواند حملات XSS (Cross Site Scripting) را منجر شود، تایید می کند. به طور پیش فرض توصیه می شود این چک را در هر فرم ارسال کنید مگر اینکه نیاز خاصی باشد.
راه حل
اگرچه خطرات امنیتی وجود دارد، اما در برخی موارد ما نیاز به کد POST و محتوای HTML به سرور است، بنابراین برای چنین موارد ASP.Net MVC دارای سه راه حل است.
1. ویژگی AllowHtml [ توصیه شده ]
ویژگی AllowHtml را می توان به یک Property Model اعمال کرد و معتبر سازی آن توسط ASP.Net MVC تنها برای آن ویژگی خاص غیرفعال می شود .
مزایا
ویژگی AllowHtml برای کلاس Model توسعه داده شده است.
دامنه محدود به ویژگی خاص کلاس Model است.
این راه حل ایمن و توصیه شده است.
مثال :
Model
public class PersonModel
{
[Display(Name = "Resume:")]
[AllowHtml]
public string Resume { get; set; }
}
Controller
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(PersonModel person)
{
return View();
}
}
View
@model Potential_Dangerous_MVC.Models.PersonModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Index</title>
</head>
<body>
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<table>
<tr>
<td>@Html.LabelFor(m => m.Resume)</td>
<td>@Html.TextAreaFor(m => m.Resume)</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"/></td>
<td></td>
</tr>
</table>
}
</body>
</html>
2. ویژگی ValidateInput در سطح اقدام [ SECOND BEST RECOMMENDED ]
ویژگی ValidateInput را می توان به یک روش Action Controller اعمال کرد و اعتبار آن توسط ASP.Net MVC تنها برای آن روش Action خاص غیرفعال می شود .
مزایا
دامنه محدود به روش خاصی از کلاس کنترل می باشد.
اگر خواص چندگانه محتوای HTML را قبول کرده باشید، این روش باعث کاهش کارآیی می شود.
هنگامی که کلاس Model برای طراحی عناصر فرم استفاده نمی شود، این ویژگی مورد نیاز است.
معایب
تمام فیلدهای فرم ارسال اطلاعات به یک روش می تواند محتوای HTML را ارسال کند، هرچند تنها یک یا چند مورد ممکن است برای ارسال نیاز باشد.
مثال :
Model
public class PersonModel
{
[Display(Name = "Resume:")]
public string Resume { get; set; }
}
Controller
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
[HttpPost]
[ValidateInput(false)]
public ActionResult Index(PersonModel person)
{
return View();
}
}
View
@model Potential_Dangerous_MVC.Models.PersonModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Index</title>
</head>
<body>
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<table>
<tr>
<td>@Html.LabelFor(m => m.Resume)</td>
<td>@Html.TextAreaFor(m => m.Resume)</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"/></td>
<td></td>
</tr>
</table>
}
</body>
</html>
3. ویژگی ValidateInput در سطح کنترل [ THIRD BEST RECOMMENDED ]
ویژگی ValidateInput همچنین می تواند به یک Controllerاعمال شود و اعتبار سنجی توسط ASP.Net MVC برای تمام روش آن کنترل خاص غیر فعال خواهد شد.
مزایا
دامنه محدود به کلاس کنترل خاص است.
اگر چندین روش عمل پذیری محتوای HTML را قبول کرده باشید، این روش باعث کاهش کارآیی می شود.
هنگامی که کلاس Model برای طراحی فرم های چندگانه استفاده نمی شود، این روش مفید است.
معایب
تمام فیلدهای فرم ارسال اطلاعات به تمام روش ها می تواند محتوای HTML را ارسال کند، هرچند تنها یک یا چند مورد ممکن است برای ارسال نیاز باشد.
مثال :
Model
public class PersonModel
{
[Display(Name = "Resume:")]
public string Resume { get; set; }
}
Controller
[ValidateInput(false)]
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(PersonModel person)
{
return View();
}
}
View
@model Potential_Dangerous_MVC.Models.PersonModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Index</title>
</head>
<body>
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<table>
<tr>
<td>@Html.LabelFor(m => m.Resume)</td>
<td>@Html.TextAreaFor(m => m.Resume)</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"/></td>
<td></td>
</tr>
</table>
}
</body>
</html>