درخواست های جعلی Cross Site در MVC
دوشنبه 10 آبان 1395در این مقاله ما با درخواست های جعلی cross-site در MVC آشنا خواهیم شد و در ادامه چگونگی محافظت از برنامه در برابر این درخواست ها را شرح خواهیم داد .
درخواست های جعلی Cross-site را معمولا با نام مخفف Cross-Site Request Forger) CSRF) میشناسند .
CSRF چیست ؟
CSRF یک نوع حمله است که کاربر در یک سایت log in میکند (مثلا سایت ABC.com ) T و در ادامه کاربر login شده در یک tab جدید یکسری سایت های دیگر را باز میکند که آنها با نام سایت های malicious (سایت های بدجنس) شناخته میشوند ، سپس این سایت ها از طریق اعتبار نامه آن کاربر درخواست هایی را به منظور حمله به آن سایت ارسال میکنند . سایت ABC.Com فرض میکند که این درخواست ها معتبر است و از سمتِ یک کاربر معتبر ارسال میشود ، پس اقدام به اجرای درخواست ها میکند و اینگونه است که سایت هک میشود .

بعد از شناخته شدن این نوع حمله ، ماکروسافت صفتی را با نام AntiForgeryToken ارائه داد . استفاده از این بسیار ساده است ، فقط کافیست که Html.AntiForgeryToken@ را به View مورد نظر اضافه کنیم و در ادامه هم در بالای Controller آن صفت [ValidateAntiForgeryToken] را اضافه کنیم . اساسا AntiForgery Token برای HttpPost مورد استفاده قرار میگیرد .
در ادامه ، برای درک بهتر این موضوع ، مثالی را بررسی خواهیم کرد :
Visual studio را باز کرده و یک پروژه جدید ASP.Net MVC Web Application با نام CSRFInMVCApplication ایجاد کنید . در مرحله بعد Basic Template را انتخاب کنید .


بعد از ساخته شدن پروژه ، روی فولدر model کلیک راست کرده و یک کلاس با نام CollageInfo.cs به آن اضافه کنید و کد های زیر را در آن قرار دهید :
public class CollageInfo
{
[Key]
public int CollageID
{
get;
set;
}
[Required(ErrorMessage = " please Enter Name")]
public string CollageName
{
get;
set;
}
[Required(ErrorMessage = "pleaes Enter Address")]
public string CollageAddress
{
get;
set;
}
[Required(ErrorMessage = "please Enter Department")]
public string CollageDepartment
{
get;
set;
}
}
بعد از اتمام ساخت کلاس model ، یک Controller با نام CollageController به پروژه اضافه میکنیم . برای این کار روی فولدر Controller راست کلیک کرده و Add Conntroller را بزنید و در پنجره باز شده ، Empty MVC Controller را انتخاب کنید :

بعد از اضافه کردن Controller ما Action Method ای با نام collageInfo را با صفت های [httpGet] و [httpPost] باید به پروژه اضافه میکنیم ، برای این کار میتوانید کدهای زیر را جایگزین کنید :
[HttpGet]
public ActionResult collageInfo()
{
return View();
}
[HttpPost]
public ActionResult collageInfo(CollageInfo _clgInfo)
{
return View(_clgInfo);
}
بعد از اضافه کردن Action Method ها ما باید View آنها را نیز اضافه کنیم . برای این کار روی CollageInfo راست کلیک کرده و add view را بزنید :

بعد کلیک بر روی Add view ، آن کد هایی را تولید خواهد کرد ، در زیر کدهای مربوط به view را مشاهده میکنید :
@model CSRFInMVCApplication.Models.CollageInfo
@{
ViewBag.Title = "collageInfo";
}
<h2>collageInfo</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>CollageInfo</legend>
<div class="editor-label">
@Html.LabelFor(model => model.CollageName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.CollageName)
@Html.ValidationMessageFor(model => model.CollageName)
< /div>
<div class="editor-label">
@Html.LabelFor(model => model.CollageAddress)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.CollageAddress)
@Html.ValidationMessageFor(model => model.CollageAddress)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.CollageDepartment)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.CollageDepartment)
@Html.ValidationMessageFor(model => model.CollageDepartment)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
حال برنامه را اجرا کنید و به URL مربوطِ رفته و خروجی را مشاهده کنید :
http://localhost:50688/Collage/Collageinfo

بعد از دیدن خروجی ، روی صفحه راست کلیک کنید و View Source را بزنید ، کدهایی را که مشاهده میکنید را در یک فایل HTML ذخیره کنید :

بعد از ذخیره ، فایل HTML را باز کنید :
کدهای آن همانند زیر است :
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>collageInfo</title>
<link href="/Content/site.css" rel="stylesheet" />
<script src="/Scripts/modernizr-2.6.2.js"></script>
</head>
<body>
<h2>collageInfo</h2>
<form action="http://localhost:50688/Collage/Collageinfo" method="post">
<fieldset>
<legend>CollageInfo</legend>
<div class="editor-label"> <label for="CollageName">CollageName</label> </div>
<div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-required=" please Enter Name" id="CollageName" name="CollageName" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="CollageName" data-valmsg-replace="true"></span> </div>
<div class="editor-label"> <label for="CollageAddress">CollageAddress</label> </div>
<div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-required="pleaes Enter Address" id="CollageAddress" name="CollageAddress" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="CollageAddress" data-valmsg-replace="true"></span> </div>
<div class="editor-label"> <label for="CollageDepartment">CollageDepartment</label> </div>
<div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-required="please Enter Department" id="CollageDepartment" name="CollageDepartment" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="CollageDepartment" data-valmsg-replace="true"></span> </div>
<p> <input type="submit" value="Create" /> </p>
</fieldset>
</form>
<div> <a href="/Collage">Back to List</a> </div>
<script src="/Scripts/jquery-1.8.2.js"></script>
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
</body>
</html>
حال فایل HTML را در مرورگر بازکنید و اطلاعاتی را وارد کرده و دکمه "ثبت" را بزنید :

زمانی که شما دکمه ثبت را بزنید، خواهید دید که به CollageInfo هدایت خواهید شد، این CSRF Attack میباشد .
برای جلوگیری از آن ، به تصاویر زیر نگاه کنید :

ما نیاز داریم که به Controller نیز صفتی را اضافه کنیم :

حال اگر دوباره فایل HTML را اجرا کنید و کلید ثبت را بزنید ، اینبار با خطا مواجه خواهید شد . پس با این روش ، شما از برنامه خود در برابر حملات CSRF محافظت کردید .
آموزش asp.net mvc
- ASP.net MVC
- 2k بازدید
- 5 تشکر