درخواست های جعلی Cross Site در MVC

در این مقاله ما با درخواست های جعلی cross-site در MVC آشنا خواهیم شد و در ادامه چگونگی محافظت از برنامه در برابر این درخواست ها را شرح خواهیم داد .

درخواست های جعلی 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

دانلود نسخه ی PDF این مطلب