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

دوشنبه 10 آبان 1395

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

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید