ASP.NET درخواست جعل (XSRF /CSRF) حفاظت در این هسته

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط

ویژوال استودیو
  • ویژوال استودیو ۲۰۱۹
ASP.NET هسته
  • ۳/۰
  • ۳/۱

درخواست متقابل سایت forgeri چیست ؟

کراس سایت درخواست جعل (CSRF/XSRF) برای کسانی است که تنها در داخل سایت مورد علاقه پردازش شده است. حمله به آسیب پذیری که چنین فرآیند بروز رسانی را از یک سایت خارجی انجام می دهد.

به عنوان مثال ، فرض کنید شما توانایی ارسال نظرات در یک وب سایت را دارید. به طور معمول ، من فکر می کنم شما را با وارد کردن یک نظر از سایت ارسال ، این فرآیند ارسال اغلب برای پرتاب داده ها در URL هدف استفاده می شود.

بنابراین ، اگر شما داده های مشابه را به URL از کسی غیر از سایت هدف ارسال کنید ، این درمان همان شما نوشته شده است.

اگر فقط یک مهاجم می خواهد این کار ، آن را نمی خواهد یک تهدید است. چیز ترسناک در مورد CSRF این است که مهاجمان می توانند سایت های جعلی و یا جاسازی آدرس های پنهان در سایت ساخت. این جایی است که شخص دیگری ناخواسته به آن دسترسی پیدا می کند و مهاجم می شود.

من نمی خواهد به عمق اینجا بروید ، پس لطفا اطلاعات بیشتر در مورد صلیب سایت درخواست forgeri.

ASP.NET Core شامل این اقدام متقابل به چارچوب.

بررسی کراس سایت درخواست جعل به کار

سعی کنید ببینید که آیا روند به روز رسانی در واقع از سایت های خارجی و یا ابزار انجام شده است.

Index. cshtml ایجاد یک فرم ورودی است که می فرستد متن شما را به سرور وارد شده است. سپس viewdata را قرار دهید تا سرور پیام هایی را که برای مطابقت با متن ورودی ایجاد کرده اید نمایش می دهد.

Index. cshtml

@{
  ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<form method="post">
  <input type="text" name="text" />
  <button type="submit">送信</button>
</form>

<p>@ViewData["Message"]</p>

سرور سمت HomeController.cs پردازش متن ارسال و خروجی آن را به یک استودیوی بصری ردیابی. یک متن را برای نمایش داده ها تنظیم کنید تا بتوانید آن را به مشتری نشان دهید.

HomeController.cs

public class HomeController : Controller
{
  // 省略

  [HttpPost]
  public IActionResult Index(string text)
  {
    System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
    ViewData["Message"] = $"「{text}」が入力されました。";
    return View();
  }

  // 省略
}

سعی کنید برای انجام قابلیت های شما فقط در مراحل عادی ایجاد شده است. هنگامی که شما اشکال زدایی را اجرا می کنید و صفحه نمایش ظاهر می شود ، متن را وارد کنید و روی دکمه ارسال کلیک کنید.

متن پردازش شده بر روی صفحه نمایش به عنوان انتظار می رود.

از آنجا که آن را نیز خروجی به ردیابی ، پنجره ویژوال استودیو خروجی نیز نمایش متن. در واقع ، ما چیزهایی مانند ثبت داده های ورودی در یک پایگاه داده ، اما ما قصد داریم به ساده کد در اینجا.

در حال حاضر ، سعی کنید به برنامه از خارج از سایت هدف در حالی که اشکال زدایی و در حال اجرا دسترسی داشته باشید. برای سادگی ، من یک پیام ارسال با استفاده از یک ابزار به نام ویژوال استودیو کد. اگر شما می توانید ارسال کنید ، شما می توانید از ابزارهای دیگر و یا استفاده از ساخت برنامه سایت دیگری برای حمله.

هنگامی که یک فرمت به نام مشتری REST را در کد ویژوال استودیو نصب می کنید ، شما می توانید از یک ویژگی است که به شما اجازه می دهد تا به راحتی عملکرد بقیه API فقط با باز کردن فایل. http را بررسی کنید.

هنگامی که یک فایل. http را شبیه به زیر در یک فایل متنی ایجاد می کنید ، و سپس فایل را در کد ویژوال استودیو باز کنید ، می توانید با کلیک روی ارسال درخواست ارسال یا ارسال کنید .

اگر داده های پستی زیر را ایجاد کنید ، تقریبا همان مقدار داده ای که متن را روی صفحه تایپ می کنید ارسال می شود و دکمه ارسال را فشار دهید. (Localhost شماره پورت باید همان محیط اعدام باشد.)

RestTest. http://www.restTest.http

### Form で POST 送信
POST https://localhost:44372/home/index HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"

なんらかのテキスト
------WebKitFormBoundary7MA4YWxkTrZu0gW--

وقتی آن را ارسال میکنید ، می توانید ببینید که سرور متن را دریافت می کند و آن را پردازش می کند.

ویژوال استودیو کد می تواند نتایج را دریافت کنید. اگر نگاهی دقیق تر به کد نتیجه داشته باشید ، می توانید ببینید که مقدار تعیین شده برای ViewData نمایش داده میشود. (آن را در یونیکد نمایش داده می شود ، اما متن به درستی نمایش داده می شود اگر در مرورگر وب مشاهده شده است.)

آدرس کراس سایت درخواست آسیب پذیری forgeri

همانطور که در ابتدا ذکر شد ، ASP.NET Core شامل اقدامات علیه درخواست جعل متقابل سایت در چارچوب. اندازه گیری مشترک است که به صدور یک نشانه منحصر به فرد به مشتری در پیشبرد بر روی صفحه نمایش که نیاز به ارسال ، و غیره. شما لازم نیست که برای پذیرش پردازش مگر اینکه شما پرتاب رمز به سرور.

البته ، اگر شما دسترسی به URL به طور مستقیم از یک سایت خارجی ، نشانه ناشناخته است و پردازش را قبول نمی کند.

اول ، من می خواهم در مورد صدور نشانه به مشتری (HTML) صحبت کنید ، اما واقعیت این است که چارچوب قادر به انجام این کار نیست. خواهد رفت. اگر یک روش پستی را در برچسب فرم مشخص کنید ، می توانید پارامترهای نشانه را بدون اجازه به HTML ترکیب کنید.

در نسخه متنی زیر ، آن است که نام ورودی = "__RequestVerificationToken" نوع = "پنهان". این است که به سرور ارسال با هم زمانی که دکمه ارسال فشار داده شده است. به هر حال ، آن است که توسط روش دریافت اضافه نشده است.

در سمت سرور ، خدمات Startup.cs. گزینه های AddControllersWithViews روش. فیلتر برای AutoValidateAntiforgeryTokenAttribute ، تمام اقدامات این بررسی نشانه به طور خودکار اضافه شده به (به دقیق تنها روش های HTTP از ارسال ، قرار دادن ، پچ ، و حذف).

اگر شما می خواهید برای اضافه کردن این محدودیت تنها به اقدامات خاص ، نه همه اقدامات ، در هر کنترل ، در هر عمل همچنین ممکن است به مجموعه.

برعکس ، اگر شما می خواهید برای اعمال محدودیت در اکثر اقدامات ، اما شما می خواهید به حذف اقدامات خاص ، اگر شما مجموعه ای از ویژگی های IgnoreAntiforgeryToken به کنترل و عمل ، آن را خوب است.

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews(options =>
  {
    // 全ての「POST, PUT, PATCH, DELETE」アクションに自動で ValidateAntiForgeryToken を付与。
    // 個別に除外したい場合は「IgnoreAntiforgeryToken」属性を指定すること
    // API では HTML 側にトークンを発行できないのでコントローラーに「IgnoreAntiforgeryToken」を指定する必要がある。
    options.Filters.Add(new Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute());
  });
}

بیایید ببینیم چگونه کار می کند. اول از همه ، فرایند انتقال از روی صفحه نمایش به طور معمول انجام می شود.

نتایج بر روی صفحه نمایش به عنوان انتظار می رود منعکس شد.

همچنین خروجی به ردیابی است.

در حال حاضر ، اجازه می دهد سعی کنید به آن دسترسی داشته باشید از خارج.

دسترسی به ed ، اما درخواست بد بازگردانده شد. این یک نتیجه متفاوت از زمانی که شما اقدامات گرفتن نیست. این قابل درک است که آن را نگهبانی است ، زیرا خروجی به ردیابی نیست.

خلاصه

این بار من سعی کردم برای پیاده سازی اقدامات علیه کراس سایت درخواست forgeri. این بسیار آسان بود برای پیاده سازی به دلیل آن را در حال حاضر به چارچوب ساخته شده بود.

ساختمان یک وب سایت نیاز به آسیب پذیری بسیار بیشتری نسبت به CSRF. شما می توانید چک کنید چه چیزی در خارج وجود دارد ، یا شما می توانید از ابزارهایی مانند OWASP برای بررسی آسیب پذیری در سایت خود استفاده کنید.