Bu Çekirdekte ASP.NET İstek Sahteciliği (XSRF/CSRF) koruması

Sayfa güncel :
Sayfa oluşturma tarihi :

Ortam

Görsel Stüdyo
  • Visual Studio 2019
ASP.NET Çekirdek
  • 3.0
  • 3.1

Site arası istek sahtesi nedir?

Site arası istek sahteciliği (CSRF/XSRF) yalnızca ilgi alanı içinde işlenenler içindir. Harici bir siteden böyle bir güncelleştirme işlemi gerçekleştiren bir güvenlik açığına yapılan bir saldırı.

Örneğin, bir Web Sitesinde yorum gönderebildiğinizi varsayalım. Normalde, ben, siteden bir yorum girerek yayınlayacak düşünüyorum Bu gönderme işlemi genellikle hedef URL'ye veri atmak için kullanılır.

Bu nedenle, URL'ye hedef site dışında başka birinden benzer veriler gönderirseniz, Senin gönderdiğin ikramın aynısı.

Sadece bir saldırgan bunu yapsaydı, bu bir tehdit olmazdı. CSRF hakkında korkutucu şey saldırganların sahte siteler inşa edebilirsiniz veya siteye gizli URL'ler gömmek. Başka birinin istemeden eriştiği ve saldırgan olduğu yerdir.

Ben burada derinlemesine gitmeyeceğim, bu yüzden çapraz site istek forgeri hakkında daha fazla bilgi edinin lütfen.

ASP.NET Core bu karşı önlemi çerçeveye dahil eder.

Çalışmak için site arası istek sahtesini denetleme

Güncelleştirme işleminin gerçekten harici sitelerden veya araçlardan gerçekleştirilip gerçekleştirildiğini görmeye çalışın.

Index.cshtml, girdiğiniz metni sunucuya gönderen bir giriş formu oluşturur. Ardından, sunucunun giriş metniyle eşleşecek şekilde oluşturduğunuz iletileri görüntülemesi için görünüm verileri yerleştirin.

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>

Sunucu tarafı HomeController.cs gönderilen metni işler ve Visual Studio izleme için çıktıları. İstemciye görüntülenebilsin diye aynı metni ViewData'ya ayarlayın.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Oluşturduğunuz işlevselliği normal adımlarda gerçekleştirmeye çalışın. Hata ayıklama çalıştırdığınızda ve ekran göründüğünde, metni girin ve Gönder düğmesini tıklatın.

İşlenen metin beklendiği gibi ekranda görünür.

Aynı zamanda iz çıktı olduğundan, görsel stüdyo çıkış penceresi de metin görüntüler. Aslında, giriş verilerini veritabanına kaydetmek gibi şeyler yapıyoruz, ama buradaki kodu basitleştirmeyeceğiz.

Şimdi, hata ayıklama ve çalışırken hedef site dışından programa erişmeye çalışın. Basitlik için, ben Visual Studio Code adlı bir araç kullanarak bir yazı yayınlayacağız. POST gönderebiliyorsanız, başka araçlar kullanabilir veya saldırı için başka bir site programı oluşturabilirsiniz.

Visual Studio Code'a REST Client adlı bir uzantı yüklediğinizde, SADECE .http dosyasını açarak REST API'nin çalışmasını kolayca kontrol etmenizi sağlayan bir özellik kullanabilirsiniz.

Bir metin dosyasında aşağıdakine benzer bir .http dosyası oluşturduğunuzda ve dosyayı Visual Studio Code'da açtığınızda, GET veya POST'u gönder isteğini tıklayarak gönderebilirsiniz.

Aşağıdaki POST verilerini oluşturursanız, ekrana metin yazarken ve gönder düğmesine bastığınız da hemen hemen aynı miktarda veri gönderilir. (Localhost bağlantı noktası numarası yürütme ortamı ile aynı olmalıdır.)

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--

Gönderdiğiniz zaman, sunucunun metin aldığını ve işlediğini görebilirsiniz.

Visual Studio Code sonuçları alabilir. Sonuç koduna daha yakından bakarsanız, ViewData için değer kümesinin görüntülendiğini görebilirsiniz. (Unicode'da görüntülenir, ancak bir Web tarayıcısında görüntülendiğinde metin doğru şekilde görüntülenir.)

Adres çapraz site isteği sahte güvenlik açığı

Ben başında belirtildiği gibi, ASP.NET Core çerçevesinde çapraz site isteği sahtekarşı önlemler içermektedir. Ortak bir önlem, posta, vb gerektiren bir ekranda önceden istemciye benzersiz bir belirteç vermektir. Belirteci sunucuya atmadıkça işleme kabul etmek zorunda değilsiniz.

Elbette, URL'ye doğrudan harici bir siteden erişirseniz, belirteç bilinmemektedir ve işleme kabul etmez.

İlk olarak, istemci (HTML) belirteçleri veren hakkında konuşmak istiyorum, ama aslında çerçeve bunu yapmak mümkün değildir. Gidecek. Form etiketinde bir POST yöntemi belirtirseniz, belirteç parametrelerini izinsiz olarak HTML'ye dahil edebilirsiniz.

Aşağıdaki HTML'de giriş adı="__RequestVerificationToken" type="hidden". Bu, gönder düğmesine basıldığında sunucuya birlikte gönderilir. Bu arada, GET yöntemi ile eklenen değildir.

Sunucu tarafında, Startup.cs hizmetleri. AddControllersWithViews yöntem seçenekleri. Filtreler için AutoValidateAntiforgeryTokenAttribute, tüm eylemler Bu belirteç denetimi otomatik olarak eklenir (tam olarak yalnızca POST, PUT, PATCH ve DELETE'in HTTP yöntemleri).

Bu kısıtlamayı yalnızca belirli eylemlere eklemek istiyorsanız, tüm eylemler, denetleyici başına, eylem başına Ayarlamak da mümkündür.

Tam tersine, çoğu eyleme kısıtlamalar getirmek istiyorsanız, ancak belirli eylemleri hariç tutmak istiyorsanız, IgnoreAntiforgeryToken özniteliğini denetleyiciye ve eyleme ayarlarsanız, sorun yok.

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());
  });
}

Bakalım nasıl olacak. Her şeyden önce, iletim işlemi normal ekrandan yapılır.

Sonuçlar beklendiği gibi ekrana yansıtıldı.

Aynı zamanda iz çıktı.

Şimdi, dışarıdan erişmeye çalışalım.

Erişildi, ancak Kötü İstek döndürüldü. Önlem almadığınız dan farklı bir sonuç. İze çıkış olmadığı için korunduğu anlaşılmaktadır.

Özet

Bu sefer, saha lar arası istek forgeri'ye karşı önlemler almaya çalıştım. Zaten çerçeve içine inşa edildi, çünkü uygulanması çok kolay oldu.

Web sitesi oluşturmak, CSRF'den çok daha fazla güvenlik açığı gerektirir. Dışarıda neler olup olmadığını kontrol edebilir veya sitenizdeki güvenlik açıklarını kontrol etmek için OWASP gibi araçları kullanabilirsiniz.