Güvenlik açıkları için tehdit azaltma ASP.NET Core Blazor Server
Blazor Server uygulamaları, sunucu ve istemcinin uzun süreli bir ilişki sürdüren durum bilgi işlem modelini benimser. Kalıcı durum, potansiyel olarak uzun süreli bağlantılarıyayabilecek bir bağlantı hattı tarafından korunur.
Kullanıcı bir siteyi Blazor Server ziyaret edinca sunucu, sunucunun belleğinde bir bağlantı hattı oluşturur. Bağlantı hattı tarayıcıya, kullanıcı kullanıcı arabiriminde bir düğmeyi seçerken olduğu gibi hangi içeriğin işlen ve olaylara yanıt ver istediğini gösterir. Bu eylemleri gerçekleştirmek için, bağlantı hattı kullanıcının tarayıcısında JavaScript işlevlerini ve sunucusundaki .NET yöntemlerini çağırır. Bu iki yol tabanlı JavaScript tabanlı etkileşim JavaScript birlikte çalışma (JS birlikte çalışma) olarak adlandırılır.
JS birlikte çalışabilirliği İnternet üzerinden oluştuğu için ve istemci uzak bir tarayıcı kullandığı için, Blazor Server uygulamalar çoğu web uygulaması güvenlik endişesini paylaşır. Bu konu, uygulamalara yönelik yaygın Blazor Server tehditleri açıklar ve İnternet'e yönelik uygulamalara odaklanan tehdit azaltma kılavuzu sağlar.
Kurumsal ağların veya intranetlerin içinde olduğu gibi kısıtlanmış ortamlarda, risk azaltma kılavuzlarının bazıları:
- Kısıtlanmış ortamda geçerli değildir.
- Kısıtlı bir ortamda güvenlik riski düşük olduğundan, uygulanması gereken maliyete değer bir şey değil.
Blazor ve paylaşılan durum
Blazor sunucu uygulamaları sunucu belleğinde canlıdır. Bu, aynı işlem içinde barındırılan birden çok uygulama olduğu anlamına gelir. Her uygulama oturumu için kendi Blazor DI kapsayıcı kapsamına sahip bir bağlantı hattı başlatır. Bu, kapsamlı hizmetlerin oturum başına benzersiz olduğu anlamına Blazor gelir.
Uyarı
Çok dikkatli olunmadıkça tekli hizmetleri kullanarak aynı sunucu paylaşım durumuna sahip uygulamalar önerilmez çünkü bu durum bağlantı hatlarında kullanıcı durumunun sızması gibi güvenlik açıklarına neden olabilir.
Durum bilgisi olan tekli hizmetleri uygulamalar Blazor için özel olarak tasarlanmışsa kullanabilirsiniz. Örneğin, kullanıcıların hangi önbellek anahtarlarının hangi önbellek anahtarlarının üzerinde denetime sahip olmadığını varsayarak, belirli bir girişe erişmek için bir anahtar gerektirdiği için bir bellek önbelleğini tekli olarak kullanmak sorun değildir.
Ayrıca güvenlik nedenleriyle uygulamaları IHttpContextAccessor kullanmamanız Blazor gerekir. Blazoruygulamaları, uygulama işlem hattının bağlamının ASP.NET Core çalıştırabilirsiniz. içinde kullanılabilir olması veya uygulamayı başlatan bağlamı tutması HttpContext IHttpContextAccessor garanti Blazor edilemez.
İstek durumunu uygulamaya iletirken önerilen yol, uygulamanın ilk işlemesinde kök Blazor bileşene parametrelerden geçer:
- Uygulamaya geçmek istediğiniz tüm verilerle bir sınıf Blazor tanımlayın.
- Sayfasındaki verileri o Razor anda kullanılabilir olan ile HttpContext doldurmak.
- Verileri uygulamaya parametre Blazor olarak kök bileşene (Uygulama) iletir.
- Uygulamaya geçirilen verileri tutmak için kök bileşende bir parametre tanımlayın.
- Uygulama içinde kullanıcıya özgü verileri kullanma; alternatif olarak, uygulama genelinde kullanılas için bu verileri içindeki OnInitializedAsync kapsamlı bir hizmete kopyalayın.
Daha fazla bilgi ve örnek kod için bkz. ASP.NET Core Blazor Server ek güvenlik senaryoları .
Kaynak tükenmesi
Bir istemci sunucuyla etkileşim kurduğunda ve sunucunun aşırı kaynak tükettiğinde kaynak tükenmesi oluşabilir. Aşırı kaynak tüketimi öncelikli olarak şunları etkiler:
Hizmet reddi (DoS) saldırıları genellikle bir uygulamanın veya sunucunun kaynaklarını tüketin. Ancak kaynak tükenmesi mutlaka sisteme yapılan bir saldırının sonucu değildir. Örneğin, sonlu kaynaklar yüksek kullanıcı talebi nedeniyle tükenmiş olabilir. DoS, Hizmet reddi (DoS) saldırıları bölümünde daha ayrıntılı olarak ele almaktadır.
Çerçevenin dışında veritabanları ve dosya tanıtıcıları (dosyaları okumak ve yazmak için kullanılır) gibi kaynaklar Blazor da kaynak tükenmesi ile sonuçlanabilir. Daha fazla bilgi için bkz. ASP.NET Core Performansa Yönelik En İyi Yöntemler.
CPU
Cpu tükenmesi, bir veya daha fazla istemci sunucuyu yoğun CPU çalışması gerçekleştirmeye zorlarsa oluşabilir.
Örneğin, Blazor Server Fibonnacci sayısını hesapan bir uygulamayı düşünün. Bir Fibonnacci numarası, bir Fibonnacci dizisinde oluşturulur ve dizide yer alan her sayı, yukarıdaki iki sayanın toplamıdır. Yanıta ulaşmak için gereken iş miktarı, sıranın uzunluğuna ve başlangıç değerinin boyutuna bağlıdır. Uygulama bir istemcinin isteğine sınırlar uygulamazsa YOĞUN CPU kullanımına sahip hesaplamalar CPU'nun süresinde baskın olabilir ve diğer görevlerin performansını azaltabilirsiniz. Aşırı kaynak tüketimi, kullanılabilirliği etkileyen bir güvenlik sorunudur.
CPU tükenmesi, genele yönelik tüm uygulamalar için bir sorundur. Normal web uygulamaları, istekler ve bağlantılar bir koruma olarak zaman alır, Blazor Server ancak uygulamalar aynı korumaları sağlamaz. Blazor Server uygulamaların CPU kullanımı yoğun olabilecek işler gerçekleştirmeden önce uygun denetimleri ve sınırları içermesi gerekir.
Bellek
Bir veya daha fazla istemci sunucuyu büyük miktarda bellek tüketmeye zorlarsa bellek tükenmesi oluşabilir.
Örneğin, öğe listesini Blazor kabul eden ve görüntüleyen bir bileşene sahip bir -server tarafı uygulaması düşünün. Uygulama izin verilen öğe sayısına veya istemciye geri işlenen öğe sayısına sınırlar getiremese, yoğun bellek kullanımına sahip işleme ve işleme, sunucunun performansının düşük olduğu noktaya kadar sunucunun belleğinde baskın Blazor olabilir. Sunucu kilitlenmesi veya kilitlenmesi gibi görünen noktaya kadar yavaş olabilir.
Sunucudaki olası bir bellek tükenmesi senaryosuyla ilgili öğelerin listesini korumak ve görüntülemek için aşağıdaki senaryoyu düşünün:
- Bir özellik veya
List<MyItem>alanda yer alan öğeler sunucunun belleğini kullanır. Uygulama öğe listesinin sınırsız olarak büyümesine izin verirse, sunucunun belleğinin tükenmiş olduğu riski vardır. Yetersiz bellek, geçerli oturumun sona erer (kilitlenmeye) neden olur ve bu sunucu örneğinde tüm eş zamanlı oturumlar yetersiz bellek özel durumu alır. Bu senaryonun gerçekleşmesini önlemek için uygulamanın eş zamanlı kullanıcılara öğe sınırı ekleyen bir veri yapısı kullanması gerekir. - İşleme için bir disk belleği düzeni kullanılmazsa, sunucu kullanıcı arabiriminde görünür olmayan nesneler için ek bellek kullanır. Öğe sayısı sınırı olmadan, bellek talepleri kullanılabilir sunucu belleğini tüketmiş olabilir. Bu senaryoyu önlemek için aşağıdaki yaklaşımlardan birini kullanın:
- İşleme sırasında sayfa sayfalı listeleri kullanın.
- Yalnızca ilk 100-1.000 öğe görüntülenir ve kullanıcının görüntülenen öğelerin ötesinde öğeleri bulmak için arama ölçütü girmelerini gerektirir.
- Daha gelişmiş bir işleme senaryosu için sanallaştırmayı destekleyen listeler veya kılavuzlar kullanın. Sanallaştırmayı kullanarak listeler yalnızca o anda kullanıcıya görünür olan öğelerin bir alt kümesini işler. Kullanıcı kullanıcı arabiriminde kaydırma çubuğuyla etkileşim kurduğunda, bileşen yalnızca görüntülemek için gereken öğeleri işler. Şu anda görüntüleme için gerekli olmayan öğeler ikincil depolamada tutularak ideal yaklaşımdır. Daha az ideal olan, oynatılmaz öğeler de bellekte tutulabilirsiniz.
Blazor Serveruygulamaları WPF, Windows Forms veya gibi durum bilgisi olan uygulamalar için diğer kullanıcı arabirimi çerçeveleri için benzer bir programlama modeli Blazor WebAssembly sağlar. Temel fark, birkaç kullanıcı arabirimi çerçevesinde uygulama tarafından tüketilen belleğin istemciye ait olduğu ve yalnızca bu istemciyi etkilediğidir. Örneğin, bir Blazor WebAssembly uygulama tamamen istemci üzerinde çalışır ve yalnızca istemci bellek kaynaklarını kullanır. Senaryoda, Blazor Server uygulama tarafından tüketilen bellek sunucuya aittir ve sunucu örneğinde istemciler arasında paylaşılır.
Tüm uygulamalar için sunucu tarafı bellek talepleri göz önünde Blazor Server bulundurulmalıdır. Ancak çoğu web uygulaması durum bilgisizdir ve yanıt döndürülerek istek işleme sırasında kullanılan bellek serbest bıraktır. Genel bir öneri olarak, istemcilerin istemci bağlantılarını kalıcı olarak bulunduran diğer sunucu tarafı uygulamalarda olduğu gibi sınırsız miktarda bellek ayırmalarına izin verme. Bir uygulama tarafından tüketilen Blazor Server bellek, tek bir istekten daha uzun süre kalıcı olur.
Not
Geliştirme sırasında, istemcilerin bellek taleplerini değerlendirmek için bir profil oluşturma veya yakalanan bir izleme kullanılabilir. Profil oluşturma veya izleme, belirli bir istemciye ayrılan belleği yakalamaz. Geliştirme sırasında belirli bir istemcinin bellek kullanımını yakalamak için dökümünü alın ve bir kullanıcının bağlantı hattında kök erişime sahip tüm nesnelerin bellek talebini inceler.
İstemci bağlantıları
Bağlantı tükenmesi, bir veya daha fazla istemci sunucuya çok fazla eşzamanlı bağlantı açıp diğer istemcilerin yeni bağlantı kurmasını önleyene kadar ortaya çıkabilir.
Blazor istemcileri oturum başına tek bir bağlantı kurulur ve tarayıcı penceresi açık olduğu sürece bağlantıyı açık olarak tutabilirsiniz. Tüm bağlantıların bakımının sunucuya yönelik talepleri uygulamalara özgü Blazor değil. Bağlantıların kalıcı yapısı ve uygulamaların durum bilgili yapısı göz göre, bağlantı tükenmesi Blazor Server uygulamanın kullanılabilirliği için daha büyük bir risktir.
Varsayılan olarak, bir uygulama için kullanıcı başına bağlantı sayısı sınırı Blazor Server yoktur. Uygulama bir bağlantı sınırı gerektiriyorsa, aşağıdaki yaklaşımlardan birini veya daha fazlasını yapın:
- Yetkisiz kullanıcıların uygulamaya bağlanma becerisini doğal olarak sınırlayan kimlik doğrulaması gerektir. Bu senaryonun etkili olması için, kullanıcıların yeni kullanıcılara iten sonra sağlamaları engellenebilir.
- Kullanıcı başına bağlantı sayısını sınırla. Bağlantıları sınırlamak için aşağıdaki yaklaşımlar kullanabilirsiniz. Meşru kullanıcıların uygulamaya erişmesine izin vermek için alıştırma yapın (örneğin, istemcinin IP adresine göre bir bağlantı sınırı kurulu olduğunda).
Uygulama düzeyinde:
- Uç nokta yönlendirme genişletilebilirliği.
- Uygulamaya bağlanmak ve kullanıcı başına etkin oturumları izlemek için kimlik doğrulaması gerektir.
- Sınıra ulaşarak yeni oturumları reddedin.
- İstemcilerden bir uygulamaya bağlantıları birden çok kez kullanan Azure SignalR Hizmeti gibi bir ara sunucu kullanarak bir uygulamaya proxy WebSocket bağlantıları. Bu, tek bir istemcinin kuralarından daha fazla bağlantı kapasitesine sahip bir uygulama sağlar ve bir istemcinin sunucuya yönelik bağlantıları tüketerek engellemesini sağlar.
Sunucu düzeyinde: Uygulamanın önünde bir ara sunucu/ağ geçidi kullanın. Örneğin, Azure Front Door web trafiğinin genel yönlendirmesini tanımlama, yönetme ve izlemenizi sağlar ve uygulamalar Uzun Yoklama kullanmak üzere yapılandırıldığında Blazor Server çalışır.
Not
Uygulamalar için Uzun Yoklama desteklese de, önerilen aktarım protokolü Blazor Server WebSockets'tir. Azure Front Door websockets'i şu anda desteklemez, ancak hizmetin gelecekteki bir sürümü için WebSockets desteği göz önünde bulundurulmaktadır.
Hizmet reddi (DoS) saldırıları
Hizmet reddi (DoS) saldırıları, sunucunun uygulamayı kullanılamaz hale getirirken bir veya daha fazla kaynağı tükettiklerine neden olan bir istemciyi içerir. Blazor Serveruygulamalar varsayılan sınırları içerir ve üzerinde ASP.NET Core DoS saldırılarına karşı korunmak için diğer güvenlik SignalR özelliklerine ve sınırlara CircuitOptions güvenebilir:
- CircuitOptions.DisconnectedCircuitMaxRetained
- CircuitOptions.DisconnectedCircuitRetentionPeriod
- CircuitOptions.JSInteropDefaultCallTimeout
- CircuitOptions.MaxBufferedUnacknowledgedRenderBatches
- HubConnectionContextOptions.MaximumReceiveMessageSize
Daha fazla bilgi ve yapılandırma kodlama örnekleri için aşağıdaki makalelere bakın:
Tarayıcıyla etkileşimler (istemci)
İstemci, JS birlikte çalışma olayı göndererek ve tamamlandıktan sonra sunucuyla etkileşime geçiyor. JS birlikte çalışma iletişimi, JavaScript ile .NET arasında her iki yolu da sağlar:
- Tarayıcı olayları istemciden sunucuya zaman uyumsuz bir şekilde sevk edilir.
- Sunucu, gerektiğinde kullanıcı arabirimini zaman uyumsuz olarak yeniden inceler.
.NET'den çağrılan JavaScript işlevleri
.NET yöntemlerinden JavaScript'e yapılan çağrılar için:
- Tüm çağrılar başarısız olduktan sonra çağırana döndüren yapılandırılabilir bir OperationCanceledException zaman aşımına sahip olur.
- Bir dakikalık çağrılar ( ) için varsayılan CircuitOptions.JSInteropDefaultCallTimeout bir zaman aşımı olur. Bu sınırı yapılandırmak için .NET yöntemlerinden JavaScript işlevlerini ASP.NET Core Blazor bkz. .
- İptali her çağrı temelinde kontrol etmek için bir iptal belirteci sağlanmalıdır. Bir iptal belirteci sağlanırsa, mümkün olduğunca varsayılan çağrı zaman aşımına ve istemciye yapılan herhangi bir çağrıya zaman bağlı olarak güvenin.
- JavaScript çağrısının sonucuna güvenilemez. Tarayıcıda Blazor çalışan uygulama istemcisi, çağırmak için JavaScript işlevini arar. İşlev çağrılır ve sonuç veya hata üretir. Kötü amaçlı bir istemci şunları yapmaya girişimde olabilir:
- JavaScript işlevinden hata döndürerek uygulamada bir soruna neden olur.
- JavaScript işlevinden beklenmeyen bir sonuç döndürerek sunucuda beklenmeyen bir davranış tetikler.
Önceki senaryolara karşı koruma için aşağıdaki önlemleri alın:
- Çağrılar sırasında ortaya çıkabilir hataları hesaba etmek için deyimleri içinde JS
try-catchbirlikte çalışma çağrılarını sarmala. Daha fazla bilgi için bkz. ASP.NET Core uygulamalardaki hataları işleme Blazor. - Herhangi bir işlemden önce hata iletileri de dahil olmak üzere JS birlikte çalışma çağrılarından döndürülen verileri doğrulama.
Tarayıcıdan çağrılan .NET yöntemleri
JavaScript'den .NET yöntemlerine yapılan çağrılara güvenme. Bir .NET yöntemi JavaScript'e açık olduğunda.NET yönteminin nasıl çağrıl olduğunu göz önünde bulundurarak:
- JavaScript'e açık olan tüm .NET yöntemlerine, uygulamanın genel uç noktası gibi davranabilirsiniz.
- Girişi doğrulama.
- Değerlerin beklenen aralıklar içinde olduğundan emin olmak.
- Kullanıcının istenen eylemi gerçekleştirme iznine sahip olduğundan emin olmak.
- .NET yöntem çağrılarının bir parçası olarak aşırı miktarda kaynak ayırmayın. Örneğin, denetimler gerçekleştirin ve CPU ve bellek kullanımına sınırlar bindirin.
- Statik ve örnek yöntemlerinin JavaScript istemcilerine açık olduğunu dikkate alın. Tasarım uygun kısıtlamalarla durumu paylaşmaya çağrılmadıkça oturumlar arasında durum paylaşımından kaçının.
- Başlangıçta bağımlılık ekleme (DI) ile oluşturulan nesneler aracılığıyla açığa çıkarılan örnek yöntemler
DotNetReferenceiçin, nesnelerin kapsamlı nesneler olarak kayıtlı olması gerekir. Bu, uygulamanın kullandığı tüm DI hizmetleri Blazor Server için geçerlidir. - Statik yöntemler için, uygulamanın bir sunucu örneğinde tüm kullanıcılarda durum tasarıma göre açıkça paylaşılması dışında istemcinin kapsamı belirlenen bir durum kurmaktan kaçının.
- Başlangıçta bağımlılık ekleme (DI) ile oluşturulan nesneler aracılığıyla açığa çıkarılan örnek yöntemler
- Parametrelerde kullanıcı tarafından sağlanan verileri JavaScript çağrılara geçirmeyi önle. Parametrelerin içinde veri geçirme kesinlikle gerekli ise JavaScript kodunun, siteler arası betik oluşturma (XSS) güvenlik açıklarına neden olmadan verileri geçirmeyi işlemesi gerekir. Örneğin, kullanıcı tarafından sağlanan verileri bir öğenin Belge Nesne Modeli (DOM)
innerHTMLolarak yazmayın. Ve diğer güvenli olmayan JavaScript temellerini devre dışı bırakmak için İçerik Güvenlik İlkesi (CSP)evalkullanmayı göz önünde bulundurabilirsiniz.
- Girişi doğrulama.
- Çerçevenin gönderme uygulamasının üzerine .NET çağrılarının özel göndermesini uygulamaktan kaçının. .NET yöntemlerini tarayıcıya ifşa etmek, genel geliştirme için önerilmez, gelişmiş bir Blazor senaryodur.
Ekinlikler
Olaylar uygulamaya giriş noktası Blazor Server sağlar. Web uygulamaları içinde uç noktaları korumaya yönelik aynı kurallar, uygulamalarda olay işleme için Blazor Server de geçerlidir. Kötü amaçlı bir istemci, bir olay için yük olarak göndermek istediği tüm verileri gönderebilir.
Örneğin:
- için bir değişiklik olayı, uygulamanın istemciye sunduğu seçenekler
<select>içinde olmayan bir değer gönderebilir. <input>, istemci tarafı doğrulamayı atlayarak sunucuya herhangi bir metin verisi gönderebilir.
Uygulamanın, uygulamanın işlemesi gereken herhangi bir olay için verileri doğrulaması gerekir. Çerçeve Blazor formları bileşenleri temel doğrulamalar gerçekleştirmektedir. Uygulama özel form bileşenleri kullanıyorsa, olay verilerini doğrulayan özel kodun uygun şekilde yazlanması gerekir.
Blazor Server olaylar zaman uyumsuzdur, bu nedenle uygulamanın yeni bir işleme üreterek tepki verme süresi olmadan önce sunucuya birden çok olay gönderebilirsiniz. Bunun göz önünde bulundurarak bazı güvenlik etkileri vardır. Uygulama içindeki istemci eylemlerini sınırlamak, geçerli işlenmiş görünüm durumuna bağlı değil, olay işleyicileri içinde gerçekleştir yapılmalıdır.
Bir kullanıcının sayacı en fazla üç kez artırmasına izin verecek bir sayaç bileşeni düşünün. Sayacı artırma düğmesi koşullu olarak değerine count göredir:
<p>Count: @count<p>
@if (count < 3)
{
<button @onclick="IncrementCount" value="Increment count" />
}
@code
{
private int count = 0;
private void IncrementCount()
{
count++;
}
}
Bir istemci, çerçeve bu bileşenin yeni bir işlemesini oluşturmadan önce bir veya daha fazla artış olayını gönderebilirsiniz. Sonuç olarak, düğme kullanıcı arabirimi tarafından yeterince hızlı bir şekilde kaldırılamayarak kullanıcı tarafından count üç kat artırılabilir. Üç artış sınırına ulaşmanın doğru count yolu aşağıdaki örnekte gösterilmiştir:
<p>Count: @count<p>
@if (count < 3)
{
<button @onclick="IncrementCount" value="Increment count" />
}
@code
{
private int count = 0;
private void IncrementCount()
{
if (count < 3)
{
count++;
}
}
}
if (count < 3) { ... }İşleyicinin içine denetimi ekleyerek artırma kararı geçerli uygulama count durumuna göre olur. Karar, önceki örnekte olduğu gibi kullanıcı arabiriminin durumuna bağlı değil ve geçici olarak eski olabilir.
Birden çok göndermeye karşı koruma
Bir olay geri çağırma, dış hizmetten veya veritabanından veri getirme gibi uzun süre çalışan bir işlemi zaman uyumsuz olarak çağırırsa, koruma kullanmayı göz önünde bulundurabilirsiniz. Koruyucu, işlem devam ederken kullanıcının görsel geri bildirim ile birden çok işlemi kuyruğa alamasını önlenebilir. Aşağıdaki bileşen kodu, isLoading true sunucudan veri GetForecastAsync alırken olarak ayarlar. ise, isLoading true düğme kullanıcı arabiriminde devre dışı bırakılır:
@page "/fetchdata"
@using BlazorServerSample.Data
@inject WeatherForecastService ForecastService
<button disabled="@isLoading" @onclick="UpdateForecasts">Update</button>
@code {
private bool isLoading;
private WeatherForecast[] forecasts;
private async Task UpdateForecasts()
{
if (!isLoading)
{
isLoading = true;
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
isLoading = false;
}
}
}
Önceki örnekte yer alan koruma deseni, arka plan işlemi desenle zaman uyumsuz olarak yürütülürse async - await çalışır.
Erken iptal etme ve dispose sonrasında kullanımdan kaçınma
Birden çok göndermeye karşı koruma bölümünde açıklandığı gibi bir koruma kullanmanın yanı sıra, bileşen atılmasında uzun süre çalışan işlemleri iptal etmek için CancellationToken kullanmayı göz önünde bulundurabilirsiniz. Bu yaklaşım, bileşenlerde kullanımdan sonra atma kullanımını önlemenin ek avantajına sahiptir:
@implements IDisposable
...
@code {
private readonly CancellationTokenSource TokenSource =
new CancellationTokenSource();
private async Task UpdateForecasts()
{
...
forecasts = await ForecastService.GetForecastAsync(DateTime.Now,
TokenSource.Token);
if (TokenSource.Token.IsCancellationRequested)
{
return;
}
...
}
public void Dispose()
{
TokenSource.Cancel();
}
}
Büyük miktarlarda veri üreten olaylardan kaçının
veya gibi bazı DOM oninput olayları büyük miktarda veri onscroll üretebilir. Bu olayları sunucu uygulamalarına Blazor kullanmaktan kaçının.
Ek güvenlik kılavuzu
Uygulamaları güvenli hale ASP.NET Core kılavuzu uygulamalar için Blazor Server geçerlidir ve aşağıdaki bölümlerde ele lanmıştır:
- Günlüğe kaydetme ve hassas veriler
- HTTPS ile aktarımdaki bilgileri koruma
- Siteler arası betik (XSS)
- Çıkış noktası arası koruma
- Tıklamalı giriş
- Yeniden yönlendirmeleri açma
Günlüğe kaydetme ve hassas veriler
İstemci ve sunucu arasındaki JS birlikte çalışma etkileşimleri, örnekleri olan sunucunun ILogger günlüklerine kaydedilir. Blazor gerçek olaylar veya JS birlikte çalışma girişleri ve çıkışları gibi hassas bilgilerin günlüğe kaydını önler.
Sunucuda bir hata oluştuğunda, çerçeve istemciye bilgi verir ve oturumu alt alta alır. Varsayılan olarak, istemci tarayıcının geliştirici araçlarında görüle bir genel hata iletisi alır.
İstemci tarafı hatası çağrı yığınını içermez ve hatanın nedeni hakkında ayrıntılı bilgi sağlamaz, ancak sunucu günlükleri bu tür bilgileri içerir. Geliştirme amacıyla, ayrıntılı hatalar etkinleştirerek hassas hata bilgileri istemci tarafından kullanılabilir.
Uyarı
Hata bilgilerini internetteki istemcilere ifşa etmek her zaman kaçınılması gereken bir güvenlik riskidir.
AKTARıMdaki bilgileri HTTPS ile koruma
Blazor Server , SignalR istemci ile sunucu arasındaki iletişim için kullanır. Blazor Server normalde, genellikle SignalR WebSockets olan anlaşması yapılan taşımayı kullanır.
Blazor Server , sunucu ile istemci arasında gönderilen verilerin bütünlüğünü ve gizliliğini garanti etmez. Her zaman HTTPS kullanın.
Siteler arası betik (XSS)
Siteler arası betik (XSS), yetkisiz bir taraf tarafından tarayıcı bağlamında rastgele mantık yürütmeye olanak sağlar. Güvenliği tehlikeye atılmış bir uygulama, istemcide rastgele kod çalıştırabilir. Bu güvenlik açığı, sunucuya karşı bir dizi kötü amaçlı eylem gerçekleştirmek için kullanılabilir:
- Sunucuya sahte/geçersiz olaylar gönderme.
- Gönderme başarısız/geçersiz işleme tamamlamaları.
- İşleme tamamlamaları göndermeden kaçının.
- JavaScript'den .NET'e birlikte çalışma çağrıları gönderme.
- .NET'den JavaScript'e birlikte çalışma çağrılarının yanıtını değiştirme.
- .NET'i JS birlikte çalışma sonuçlarına göndermeden kaçının.
Çerçeve, Blazor Server önceki tehditlerden bazılarına karşı koruma adımlarını benimser:
- İstemci işleme toplu işlerini onaylıyorsa yeni kullanıcı arabirimi güncelleştirmeleri üretmeyi durdurur. ile CircuitOptions.MaxBufferedUnacknowledgedRenderBatches yapılandırıldı.
- İstemciden yanıt almadan bir dakika sonra herhangi bir .NET to JavaScript çağrısını zaman dışı bıraktı. ile CircuitOptions.JSInteropDefaultCallTimeout yapılandırıldı.
- JS birlikte çalışma sırasında tarayıcıdan gelen tüm girişlerde temel doğrulama gerçekleştirir:
- .NET başvuruları geçerlidir ve .NET yöntemi tarafından beklenen türdedir.
- Veriler yanlış biçimlendirilmiş değil.
- yöntemi için doğru bağımsız değişken sayısı yükte mevcuttur.
- Bağımsız değişkenler veya sonuç, yöntemin iptal ed önce doğru bir şekilde deserialized olabilir.
- Tarayıcıdan gelen tüm girişlerde, sevk edilen olaylardan gelen temel doğrulamayı gerçekleştirir:
- Olayın geçerli bir türü var.
- Olay verileri,rialized olabilir.
- Olayla ilişkilendirilmiş bir olay işleyicisi vardır.
Çerçevenin uygulayan korumalara ek olarak, tehditlere karşı koruma sağlamak ve uygun eylemleri yapmak için uygulamanın geliştirici tarafından koda alınması gerekir:
- Olayları işlerken her zaman verileri doğrula.
- Geçersiz veriler aldıktan sonra uygun eylemi yerine kullanın:
- Verileri yoksayın ve geri gelin. Bu, uygulamanın istekleri işlemeye devam ettiğine olanak sağlar.
- Uygulama girişin geçici olduğunu ve meşru istemci tarafından üretile olmadığını belirlerse bir özel durum oluşturur. Özel durum atarak devreyi alt alta sildi ve oturumu sonlandı.
- Günlüklere dahil edilen işleme toplu iş tamamlamaları tarafından sağlanan hata iletisine güvenme. Hata istemci tarafından sağlanır ve istemcinin güvenliği tehlikeye girebilir ve genel olarak güvenilemez.
- JavaScript ve .NET yöntemleri arasında JS birlikte çalışma çağrılarında girişe güvenme.
- Uygulama, bağımsız değişkenlerin veya sonuçların doğru şekilde deserialized olsa bile bağımsız değişkenlerin ve sonuçların içeriğinin geçerli olduğunu doğrulamadan sorumludur.
XSS güvenlik açığının mevcut olması için uygulamanın işlenmiş sayfaya kullanıcı girişi eklemesi gerekir. Blazor Server bileşenleri, bir dosyada işaretlemenin yordamsal C# mantığına .razor dönüştürülmesiyle bir derleme zamanı adımı yürütür. Çalışma zamanında, C# mantığı öğeleri, metinleri ve alt bileşenleri açıklayan bir işleme ağacı derleme. Bu, tarayıcının DOM'sı için bir Dizi JavaScript yönergeleri aracılığıyla uygulanır (veya önceden işleyici durumunda HTML'ye seri hale getirili):
- Normal söz dizimi (örneğin, ) aracılığıyla işlenen kullanıcı girişi, söz dizimi yalnızca metin yazabilir komutlar aracılığıyla DOM'a eklendiklerine göre Razor bir XSS güvenlik açığını ortaya
@someStringValueRazor çıkarmaz. Değer HTML işaretlemesi de dahil olsa, değer statik metin olarak görüntülenir. Önceden incelerken çıkış, içeriği statik metin olarak da görüntüleyen HTML kodlamalıdır. - Betik etiketlerine izin verilmez ve uygulamanın bileşen işleme ağacına dahil olmaması gerekir. Bir bileşenin işaretlemesine bir betik etiketi dahil edilirse, derleme zamanı hatası oluşturulur.
- Bileşen yazarları, C# ile kullanarak bileşen Razor yazar. Bileşen yazarı, çıkış yayımlarken doğru API'leri kullanmakla sorumludur. Örneğin, bir
builder.AddContent(0, someUserSuppliedString)builder.AddMarkupContent(0, someUserSuppliedString)XSS güvenlik açığı oluşturabilmesi için kullanın ve kullanın.
XSS saldırılarına karşı korumanın bir parçası olarak, İçerik Güvenlik İlkesi (CSP) gibi XSS risk azaltmaları uygulamayı göz önünde bulundurabilirsiniz.
Daha fazla bilgi için bkz. ASP.NET Core siteler arası komut dosyası (XSS) engelle.
Çıkış noktası arası koruma
Çıkış noktası arası saldırılar, farklı bir çıkış noktası olan bir istemcinin sunucuya karşı bir eylem gerçekleştirmesini içerir. Kötü amaçlı eylem genellikle bir GET isteği veya post (Siteler Arası İstek Sahteciliği, CSRF) şeklindedir, ancak kötü amaçlı bir WebSocket açmak da mümkündür. Blazor Serveruygulamaları, hub protokolünü kullanan diğer tüm SignalR uygulamaların teklifiyle aynı garantileri sağlar:
- Blazor Server uygulamaları önlemek için ek önlemler alınmadıkça çıkış noktası üzerinden erişilebilir. Çıkış noktaları arası erişimi devre dışı bırakmak için, işlem hattına CORS ara yazılımı ekleyerek ve uç nokta meta verilerine ekleyerek uç noktada CORS'yi devre dışı bırakarak veya çıkış noktaları arası kaynak paylaşımı için yapılandırarak izin verilen kaynak kümelerini DisableCorsAttribute Blazor SignalR sınırlandırın.
- CORS etkinse, CORS yapılandırmasına bağlı olarak uygulamayı korumak için ek adımlar gerekebilir. CORS genel olarak etkinleştirildiyse, uç nokta rota oluşturucusu üzerinde çağrıldikten sonra uç nokta meta verilerine meta veriler ek tarafından hub için CORS Blazor Server DisableCorsAttribute devre dışı MapBlazorHub bırakılabilir.
Daha fazla bilgi için bkz. ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle.
Tıklamalı giriş
Tıklama girişi, kullanıcının saldırı altındaki sitede eylemler gerçekleştirmesi için bir siteyi farklı bir çıkış noktası olan bir sitenin içinde <iframe> işlemeyi içerir.
Bir uygulamayı bir içinde işlemeye karşı korumak <iframe> için İçerik Güvenlik İlkesi (CSP) ve üst bilgi X-Frame-Options kullanın. Daha fazla bilgi için bkz. MDN web belgeleri: X-Frame-Options.
Yeniden yönlendirmeleri açma
Bir Blazor Server uygulama oturumu başlatıldığında sunucu, oturumu başlatmanın bir parçası olarak gönderilen URL'ler için temel doğrulama gerçekleştirir. Çerçeve, bağlantı hattı kurulmadan önce temel URL'nin geçerli URL'nin üst öğesi olduğunu denetler. Çerçeve tarafından ek denetim gerçekleştiriliyor.
Kullanıcı istemcide bir bağlantı seçerken, bağlantının URL'si sunucuya gönderilir ve bu da hangi eylemin geçerli olduğunu belirler. Örneğin, uygulama bir istemci tarafı gezintisi gerçekleştirin veya yeni konuma gitmek için tarayıcıya işaret edin.
Bileşenler ayrıca kullanımı aracılığıyla program aracılığıyla gezinti isteklerini NavigationManager tetikler. Bu tür senaryolarda, uygulama istemci tarafı gezintisi gerçekleştirecek veya tarayıcıya yeni konuma gitmek için işaret ediyor olabilir.
Bileşenler şunların olması gerekir:
- Gezinti çağrısı bağımsız değişkenlerinin bir parçası olarak kullanıcı girişini kullanmaktan kaçının.
- Uygulamanın hedefine izin verilemesi için bağımsız değişkenleri doğrulama.
Aksi takdirde, kötü niyetli bir kullanıcı tarayıcıyı saldırgan denetimli bir siteye gitmeye zorlayabilirsiniz. Bu senaryoda saldırgan, yöntemini çağırmanın bir parçası olarak bazı kullanıcı girişlerini kullanarak uygulamayı ele NavigationManager.NavigateTo almaktadır.
Bu öneri, bağlantıları uygulamanın bir parçası olarak işleme sırasında da geçerlidir:
- Mümkünse göreli bağlantılar kullanın.
- Mutlak bağlantı hedeflerini bir sayfaya eklemeden önce geçerli olduğunu onaylar.
Daha fazla bilgi için bkz. ASP.NET Core'da açık yeniden yönlendirme saldırılarını ASP.NET Core.
Güvenlik denetim listesi
Aşağıdaki güvenlik konuları listesi kapsamlı değildir:
- Olaylardan bağımsız değişkenleri doğrulama.
- JS birlikte çalışma çağrılarından gelen girişleri ve sonuçları doğrulama.
- .NET'den JS'ye birlikte çalışma çağrıları için kullanıcı girişini kullanmaktan (veya önceden doğrulamaktan) kaçının.
- İstemcinin sınırsız miktarda bellek bulundurmasını engelin.
- Bileşen içindeki veriler.
DotNetObjectistemciye döndürülen başvurular.
- Birden çok göndermeye karşı koruma.
- Bileşen atılmasıyla uzun süre çalışan işlemleri iptal edin.
- Büyük miktarlarda veri üreten olaylardan kaçının.
- Çağrıların bir parçası olarak kullanıcı girişini kullanmaktan kaçının ve url'ler için kullanıcı girişini izin verilen bir kaynak kümesine karşı (kaçınılmazsa) NavigationManager.NavigateTo doğrular.
- Kullanıcı arabiriminin durumuna göre değil, yalnızca bileşen durumuna göre yetkilendirme kararları alma.
- XSS saldırılarına karşı koruma için İçerik Güvenlik İlkesi (CSP) kullanmayı göz önünde bulundurabilirsiniz.
- Tıklamaya karşı koruma için CSP ve X Çerçeve Seçenekleri kullanmayı göz önünde bulundurabilirsiniz.
- CORS'yi etkinleştirerek veya uygulamalar için CORS'yi açıkça devre dışı bırakarak CORS ayarlarının uygun olduğundan emin Blazor olun.
- Uygulama için sunucu tarafı sınırlarının kabul edilemez risk düzeyleri olmadan kabul edilebilir bir Blazor kullanıcı deneyimi sağlamayı test edin.
Blazor Server uygulamaları, sunucu ve istemcinin uzun süreli bir ilişki sürdüren durum bilgi işlem modelini benimser. Kalıcı durum, potansiyel olarak uzun süreli bağlantılarıyayabilecek bir bağlantı hattı tarafından korunur.
Kullanıcı bir siteyi Blazor Server ziyaret edinca sunucu, sunucunun belleğinde bir bağlantı hattı oluşturur. Bağlantı hattı tarayıcıya, kullanıcı kullanıcı arabiriminde bir düğmeyi seçerken olduğu gibi hangi içeriğin işlen ve olaylara yanıt ver istediğini gösterir. Bu eylemleri gerçekleştirmek için, bağlantı hattı kullanıcının tarayıcısında JavaScript işlevlerini ve sunucusundaki .NET yöntemlerini çağırır. Bu iki yol tabanlı JavaScript tabanlı etkileşim JavaScript birlikte çalışma (JS birlikteçalışma) olarak adlandırılır.
JS birlikte çalışabilirliği İnternet üzerinden oluştuğu için ve istemci uzak bir tarayıcı kullandığı için, Blazor Server uygulamalar çoğu web uygulaması güvenlik endişesini paylaşır. Bu konu, uygulamalara yönelik yaygın Blazor Server tehditleri açıklar ve İnternet'e yönelik uygulamalara odaklanan tehdit azaltma kılavuzu sağlar.
Kurumsal ağların veya intranetlerin içinde olduğu gibi kısıtlanmış ortamlarda, risk azaltma kılavuzlarının bazıları:
- Kısıtlanmış ortamda geçerli değildir.
- Kısıtlı bir ortamda güvenlik riski düşük olduğundan, uygulanması gereken maliyete değer bir şey değil.
Blazor ve paylaşılan durum
Blazor sunucu uygulamaları sunucu belleğinde canlıdır. Bu, aynı işlem içinde barındırılan birden çok uygulama olduğu anlamına gelir. Her uygulama oturumu için kendi Blazor DI kapsayıcı kapsamına sahip bir bağlantı hattı başlatır. Bu, kapsamlı hizmetlerin oturum başına benzersiz olduğu anlamına Blazor gelir.
Uyarı
Çok dikkatli olunmadıkça tekli hizmetleri kullanarak aynı sunucu paylaşım durumuna sahip uygulamalar önerilmez çünkü bu durum bağlantı hatlarında kullanıcı durumunun sızması gibi güvenlik açıklarına neden olabilir.
Durum bilgisi olan tekli hizmetleri uygulamalar Blazor için özel olarak tasarlanmışsa kullanabilirsiniz. Örneğin, kullanıcıların hangi önbellek anahtarlarının hangi önbellek anahtarlarının üzerinde denetime sahip olmadığını varsayarak, belirli bir girişe erişmek için bir anahtar gerektirdiği için bir bellek önbelleğini tekli olarak kullanmak sorun değildir.
Ayrıca güvenlik nedenleriyle uygulamaları IHttpContextAccessor kullanmamanız Blazor gerekir. Blazoruygulamaları, uygulama işlem hattının bağlamının ASP.NET Core çalıştırabilirsiniz. içinde kullanılabilir olması veya uygulamayı başlatan bağlamı tutması HttpContext IHttpContextAccessor garanti Blazor edilemez.
İstek durumunu uygulamaya iletirken önerilen yol, uygulamanın ilk işlemesinde kök Blazor bileşene parametrelerden geçer:
- Uygulamaya geçmek istediğiniz tüm verilerle bir sınıf Blazor tanımlayın.
- Sayfasındaki verileri o Razor anda kullanılabilir olan ile HttpContext doldurmak.
- Verileri uygulamaya parametre Blazor olarak kök bileşene (Uygulama) iletir.
- Uygulamaya geçirilen verileri tutmak için kök bileşende bir parametre tanımlayın.
- Uygulama içinde kullanıcıya özgü verileri kullanma; alternatif olarak, uygulama genelinde kullanılas için bu verileri içindeki OnInitializedAsync kapsamlı bir hizmete kopyalayın.
Daha fazla bilgi ve örnek kod için bkz. ASP.NET Core Blazor Server ek güvenlik senaryoları .
Kaynak tükenmesi
Bir istemci sunucuyla etkileşim kurduğunda ve sunucunun aşırı kaynak tükettiğinde kaynak tükenmesi oluşabilir. Aşırı kaynak tüketimi öncelikli olarak şunları etkiler:
Hizmet reddi (DoS) saldırıları genellikle bir uygulamanın veya sunucunun kaynaklarını tüketme konusunda arama yapılır. Ancak, kaynak tükenmesi sistem üzerinde bir saldırının sonucu değildir. Örneğin, yüksek Kullanıcı talebi nedeniyle sınırlı kaynaklar tükenebilir. DoS, hizmet reddi (DOS) saldırıları bölümünde daha fazla ele alınmıştır.
BlazorVeritabanları ve dosya tutamaçları (dosyaları okumak ve yazmak için kullanılır) gibi, çerçeveye ait dış kaynaklar da kaynak tükenmesi ile karşılaşabilir. Daha fazla bilgi için bkz. ASP.NET Core Performansa Yönelik En İyi Yöntemler.
CPU
Bir veya daha fazla istemci, yoğun CPU işi gerçekleştirmeye çalışan bir veya daha fazla istemci tarafından meydana gelebilir.
Örneğin, Blazor Server bir Fibonnacci numarasını hesaplayan uygulamayı düşünün. Bir Fibonnacci numarası, dizideki her bir sayının önceki iki sayının toplamı olduğu bir Fibonnacci sırasından oluşturulur. Yanıta ulaşmak için gereken iş miktarı, sıranın uzunluğuna ve ilk değerin boyutuna bağlıdır. Uygulama bir istemcinin isteğine sınır yerleştirmezse, CPU yoğunluklu hesaplamalar CPU 'nun süresini ayırt edebilir ve diğer görevlerin performansını azalrlar. Aşırı kaynak tüketimi, kullanılabilirliği etkileyen bir güvenlik konusudur.
CPU tükenmesi, herkese açık olan tüm uygulamalar için bir sorun teşkil etmez. Normal Web uygulamalarında, istekler ve bağlantılar bir güvenlik önlemi olarak zaman aşımına uğrar, ancak Blazor Server uygulamalar aynı korumaları sağlamaz. Blazor Server uygulamalar, büyük olasılıkla CPU yoğunluklu iş yapmadan önce uygun denetimleri ve limitleri içermelidir.
Bellek
Bir veya daha fazla istemci, sunucuyu büyük miktarda bellek kullanmaya zorlmaya zorlarsanız bellek tükenmesi meydana gelebilir.
Örneğin, bir Blazor öğe listesini kabul eden ve görüntüleyen bir bileşen ile sunucu tarafı uygulamasını düşünün. Uygulama, Blazor izin verilen öğe sayısı veya istemciye geri işlenen öğe sayısı için sınır yerleştirmezse, bellek yoğun işleme ve işleme sunucunun performansını sunucunun performansının bulunduğu noktaya ayırt edebilir. Sunucu kilitlenmişse veya çöktüğünde göründüğü noktadan yavaş olabilir.
Sunucuda olası bir bellek tükenmesi senaryosuna ait öğelerin listesini sürdürmek ve görüntülemek için aşağıdaki senaryoyu göz önünde bulundurun:
- Bir
List<MyItem>özellik veya alandaki öğeler sunucunun belleğini kullanır. Uygulama, öğelerin listesinin sınırsız olarak büyümesine izin veriyorsa, sunucunun belleği tükenmeye karşı bir risk vardır. Belleğin tükenmesinin geçerli oturum sonlandırmasına (kilitlenme) ve bu sunucu örneğindeki tüm eşzamanlı oturumlara bir bellek dışı özel durum almasına neden olur. Bu senaryonun oluşmasını önlemek için, uygulamanın eşzamanlı kullanıcılara bir öğe sınırı uygulayan bir veri yapısı kullanması gerekir. - Bir sayfalama şeması işleme için kullanılmazsa, sunucu Kullanıcı arabiriminde görünmeyen nesneler için ek bellek kullanır. Öğe sayısı sınırı olmadan, bellek talepleri kullanılabilir sunucu belleğini tüketebilir. Bu senaryoyu engellemek için aşağıdaki yaklaşımlardan birini kullanın:
- İşleme sırasında sayfalandırılmış listeler kullanın.
- Yalnızca ilk 100 ' i 1.000 öğeyi görüntüleyin ve kullanıcının görüntülenen öğelerin ötesinde öğeleri bulmak için arama ölçütü girmesini gerektirir.
- Daha gelişmiş bir işleme senaryosu için sanallaştırmayı destekleyen listeler veya kılavuzlar uygulayın. Sanallaştırma kullanarak, listeler yalnızca kullanıcıya şu anda görünür olan öğelerin bir alt kümesini işler. Kullanıcı ARABIRIMDEKI ScrollBar ile etkileşime geçtiğinde, bileşen yalnızca görüntüleme için gereken öğeleri işler. Şu anda görüntülenmek üzere gerekli olmayan öğeler, en ideal yaklaşım olan ikincil depolamada tutulabilir. Görüntülenmezler olmayan öğeler bellekte tutulabilir ve bu da daha az idealdir.
Blazor Serveruygulamalar, WPF, Windows Forms veya gibi durum bilgisi olan uygulamalar için diğer kullanıcı arabirimi çerçevelerine benzer bir programlama modeli sunar Blazor WebAssembly . Ana fark, uygulama tarafından tüketilen belleğin, istemciye ait olduğu ve yalnızca o tek istemciyi etkilediği bazı Kullanıcı arabirimi çerçevelerinden biridir. Örneğin, bir Blazor WebAssembly uygulama tamamen istemcide çalışır ve yalnızca istemci bellek kaynaklarını kullanır. Blazor ServerSenaryoda, uygulama tarafından tüketilen bellek sunucuya aittir ve sunucu örneğindeki istemciler arasında paylaşılır.
Sunucu tarafı bellek taleplerine tüm uygulamalar göz önünde bulundurulmalıdır Blazor Server . Ancak, çoğu Web uygulaması durum bilgisiz olur ve bir isteği işlerken kullanılan bellek, yanıt döndürüldüğünde serbest bırakılır. Genel bir öneri olarak, istemcilerin, istemci bağlantılarını devam eden diğer tüm sunucu tarafı uygulamalarda olduğu gibi ilişkisiz miktarda bellek ayırmasına izin vermez. Bir uygulama tarafından tüketilen bellek, Blazor Server tek bir istekten daha uzun bir süre devam ettirir.
Not
Geliştirme sırasında, bir profil oluşturucu kullanılabilir veya istemci bellek taleplerini değerlendirmek için yakalanan bir izleme olabilir. Profil Oluşturucu veya izleme, belirli bir istemciye ayrılan belleği yakalamaz. Geliştirme sırasında belirli bir istemcinin bellek kullanımını yakalamak için, bir döküm yakalayın ve Kullanıcı devresi içinde kök olan tüm nesnelerin bellek talebini inceleyin.
İstemci bağlantıları
Bir veya daha fazla istemci sunucuya çok fazla eş zamanlı bağlantı açtıklarında, diğer istemcilerin yeni bağlantı kurmasını engellediğinden bağlantı tükenmesi meydana gelebilir.
Blazor istemciler, oturum başına tek bir bağlantı kurar ve tarayıcı penceresi açık olduğu sürece bağlantıyı açık halde tutar. Tüm bağlantıları koruma sunucusundaki talepler uygulamalara özgü değildir Blazor . Bağlantıların kalıcı doğası ve uygulamaların durum bilgisi olan doğası göz önüne alındığında Blazor Server , bağlantı tükenmesi uygulamanın kullanılabilirliğine daha fazla risk taşır.
Varsayılan olarak, bir uygulama için Kullanıcı başına bağlantı sayısı sınırı yoktur Blazor Server . Uygulama bir bağlantı sınırı gerektiriyorsa aşağıdaki yaklaşımlardan birini veya daha fazlasını yapın:
- Yetkisiz kullanıcıların uygulamaya bağlanma yeteneğini doğal olarak sınırlayan kimlik doğrulaması gerektir. Bu senaryonun etkili olabilmesi için kullanıcıların, ' de Yeni Kullanıcı sağlaması engellenmelidir.
- Kullanıcı başına bağlantı sayısını sınırlayın. Bağlantıları sınırlandırma, aşağıdaki yaklaşımlar aracılığıyla gerçekleştirilebilir. Meşru kullanıcıların uygulamaya erişmesine izin vermeye özen gösterin (örneğin, istemcinin IP adresine göre bir bağlantı sınırı oluşturulduğunda).
Uygulama düzeyinde:
- Uç nokta yönlendirme genişletilebilirliği.
- Uygulamaya bağlanmak ve Kullanıcı başına etkin oturumları izlemek için kimlik doğrulaması gerektir.
- Sınıra ulaştıktan sonra yeni oturumları reddedin.
- İstemcilerden bir uygulamaya bağlantı oluşturan Azure SignalR hizmeti gibi bir ara sunucu aracılığıyla uygulamaya yönelik proxy WebSocket bağlantıları. Bu, tek bir istemcinin yapabileceğinden daha fazla bağlantı kapasitesine sahip bir uygulama sağlar ve istemcinin sunucu bağlantılarını tüketmesini önler.
Sunucu düzeyinde: uygulamanın önünde bir proxy/ağ geçidi kullanın.
Not
Uygulamalar için uzun yoklama desteklense de Blazor Server , WebSockets önerilen aktarım protokolüdür.
Hizmet reddi (DoS) saldırıları
Hizmet reddi (DoS) saldırıları, istemcinin bir veya daha fazla kaynağın bir veya daha fazla uygulamayı tüketmesine neden olan bir istemciyi içerir. Blazor Serveruygulamalar varsayılan limitleri içerir ve SignalR üzerinde ayarlanan DoS saldırılarına karşı koruma sağlayan diğer ASP.NET Core ve limitlere güvenir CircuitOptions :
- CircuitOptions.DisconnectedCircuitMaxRetained
- CircuitOptions.DisconnectedCircuitRetentionPeriod
- CircuitOptions.JSInteropDefaultCallTimeout
- CircuitOptions.MaxBufferedUnacknowledgedRenderBatches
- HubConnectionContextOptions.MaximumReceiveMessageSize
Daha fazla bilgi ve yapılandırma kodlaması örnekleri için aşağıdaki makalelere bakın:
Tarayıcıyla etkileşimler (istemci)
İstemci, JS birlikte çalışma olayı gönderme ve işleme tamamlama aracılığıyla sunucuyla etkileşime girer. JS birlikte çalışma iletişimi, JavaScript ve .NET arasında her iki yolla da geçer:
- Tarayıcı olayları istemciden sunucuya zaman uyumsuz biçimde gönderilir.
- Sunucu, gerektiği şekilde kullanıcı arabiriminden zaman uyumsuz olarak rerendering.
.NET 'ten çağrılan JavaScript işlevleri
.NET yöntemlerinden JavaScript 'e yapılan çağrılar için:
- Tüm etkinleştirmeleri, başarısız olduktan sonra, arayana döndüren yapılandırılabilir bir zaman aşımı süresine sahiptir OperationCanceledException .
- Bir dakikalık çağrılar () için varsayılan bir zaman aşımı süresi vardır CircuitOptions.JSInteropDefaultCallTimeout . Bu sınırı yapılandırmak için bkz .NET yöntemlerinden JavaScript işlevlerini ASP.NET Core Blazor ..
- İptal belirtecini çağrı başına temelinde denetlemek için bir iptal belirteci sağlayabilirsiniz. Bir iptal belirteci sağlandıysa, mümkün olan ve istemciye yapılan tüm çağrıların zaman içinde sağlandığı varsayılan çağrı zaman aşımını kullanır.
- JavaScript çağrısının sonucu güvenilir olamaz. BlazorTarayıcıda çalışan uygulama istemcisi çağırmak Için JavaScript işlevini arar. İşlev çağrılır ve sonuç ya da bir hata oluşturulur. Kötü amaçlı bir istemci şunları gerçekleştirmeye çalışabilir:
- JavaScript işlevinden bir hata döndürerek uygulamada sorun oluşmasına neden olur.
- JavaScript işlevinden beklenmeyen bir sonuç döndürerek sunucuda istemeden bir davranış alır.
Yukarıdaki senaryolara karşı koruma için aşağıdaki önlemleri alın:
try-catchÇağırma sırasında oluşabilecek hataları hesaba eklemek için DEYIMLERDEKI js birlikte çalışma çağrılarını sarın. Daha fazla bilgi için bkz. ASP.NET Core uygulamalardaki hataları işleme Blazor.- Herhangi bir işlem yapmadan önce, hata iletileri de dahil olmak üzere JS birlikte çalışma çağırmaları tarafından döndürülen verileri doğrulayın.
Tarayıcıdan çağrılan .NET yöntemleri
JavaScript 'e yönelik çağrılara .NET yöntemlerine güvenmeyin. JavaScript 'e bir .NET yöntemi sunulduğunda, .NET yönteminin nasıl çağrılacağını göz önünde bulundurun:
- Uygulamaya genel bir uç nokta gibi, JavaScript 'e sunulan tüm .NET metodunu değerlendirin.
- Girişi doğrula.
- Değerlerin beklenen aralıklar içinde olduğundan emin olun.
- Kullanıcının istenen eylemi gerçekleştirme izni olduğundan emin olun.
- .NET Yöntem çağırma kapsamında aşırı miktarda kaynak ayırmayın. Örneğin, denetim gerçekleştirin ve CPU ve bellek kullanımı için sınır koyun.
- Statik ve örnek yöntemlerinin JavaScript istemcilerine sunutabileceğiniz hesaba sahip olun. Tasarım, uygun kısıtlamalarla durum paylaşma için çağrı yaptığı müddetçe, oturumlar arasında durum paylaşmaktan kaçının.
DotNetReferenceİlk olarak bağımlılık ekleme (dı) aracılığıyla oluşturulan nesneler aracılığıyla kullanıma sunulan örnek yöntemleri için nesnelerin kapsamlı nesneler olarak kaydedilmesi gerekir. Bu, uygulamanın kullandığı tüm DI Hizmetleri için geçerlidir Blazor Server .- Statik yöntemler için, uygulama bir sunucu örneğindeki tüm kullanıcılar genelinde durum tasarımını özel olarak paylaşmadığı müddetçe, istemciye kapsamdaki durumu oluşturmaktan kaçının.
- Parametrelerde Kullanıcı tarafından sağlanan verileri JavaScript çağrılarına geçirmekten kaçının. Parametrelerde veri geçirilmesi kesinlikle gerekliyse, JavaScript kodunun, siteler arası betik oluşturma (XSS) güvenlik açıklarına gerek kalmadan verileri geçirmeyi işlediğinden emin olun. Örneğin, bir öğenin özelliğini ayarlayarak Belge Nesne Modeli (DOM) Kullanıcı tarafından sağlanan verileri yazma
innerHTML. Devre dışı bırakmak için Içerik güvenlik ilkesi 'ni (CSP)evalve diğer güvenli olmayan JavaScript temel öğelerini kullanmayı düşünün.
- Girişi doğrula.
- Framework 'ün gönderme uygulamasının en üstünde .NET etkinleştirmeleri için özel bir dağıtma uygulamaktan kaçının. .NET yöntemlerini tarayıcıya sunma, genel geliştirme için önerilmeyen gelişmiş bir senaryodur Blazor .
Ekinlikler
Olaylar bir uygulamaya giriş noktası sağlar Blazor Server . Web Apps 'teki uç noktaları koruma için aynı kurallar, uygulamalardaki olay işleme için geçerlidir Blazor Server . Kötü amaçlı bir istemci, istediği verileri bir olay için yük olarak gönderebilirler.
Örneğin:
- Bir için değişiklik olayı
<select>, uygulamanın istemciye sunulan seçenekler içinde olmayan bir değer gönderebilir. <input>Sunucu, istemci tarafı doğrulamayı atlayarak herhangi bir metin verisi gönderebilir.
Uygulamanın, uygulamanın işlediği herhangi bir olay için verileri doğrulaması gerekir. BlazorFramework Forms bileşenleri temel doğrulamaları gerçekleştirir. Uygulama özel form bileşenleri kullanıyorsa, olay verilerinin uygun şekilde doğrulanması için özel kodun yazılması gerekir.
Blazor Server olaylar zaman uyumsuzdur, bu nedenle uygulamanın yeni bir işleme oluşturarak tepki verme süresi geçmeden önce sunucuya birden çok olay gönderilebilir. Göz önünde bulundurulması gereken bazı güvenlik etkileri vardır. Uygulamadaki istemci eylemlerinin sınırlandırmasının, olay işleyicileri içinde gerçekleştirilmesi ve geçerli işlenen görünüm durumuna bağlı olmaması gerekir.
Bir kullanıcının bir sayacı en fazla üç kez artmasını sağlayan bir sayaç bileşeni düşünün. Sayacı artırma düğmesi şu değere göre koşullu olarak belirlenir count :
<p>Count: @count<p>
@if (count < 3)
{
<button @onclick="IncrementCount" value="Increment count" />
}
@code
{
private int count = 0;
private void IncrementCount()
{
count++;
}
}
Bir istemci, çerçeve bu bileşenin yeni bir işlemesini oluşturmadan önce bir veya daha fazla artış olayı gönderebilir. Bunun sonucunda, count düğme UI tarafından yeterince hızlı bir şekilde kaldırılmadığı için Kullanıcı tarafından üç kez arttırılabilirler. Üç artımdan oluşan sınırı elde etmenin doğru yolu count Aşağıdaki örnekte gösterilmiştir:
<p>Count: @count<p>
@if (count < 3)
{
<button @onclick="IncrementCount" value="Increment count" />
}
@code
{
private int count = 0;
private void IncrementCount()
{
if (count < 3)
{
count++;
}
}
}
if (count < 3) { ... }Denetimi işleyicinin içine ekleyerek, artırma kararı count geçerli uygulama durumuna göre belirlenir. Bu karar, önceki örnekte olduğu gibi Kullanıcı arabiriminin durumunu temel değildir ve bu da geçici olarak eski olabilir.
Birden çok gönderine karşı koruma
Bir olay geri çağırması, bir dış hizmetten veya veritabanından veri getirme gibi uzun süre çalışan bir işlemi zaman uyumsuz olarak çağıralıyorsa, bir koruyucu kullanmayı düşünün. Koruyucu, bir işlem görsel geri bildirimde çalışırken, kullanıcının birden çok işlemi sıraya almasını önleyebilir. Aşağıdaki bileşen kodu, isLoading true sunucudan verileri alırken olarak ayarlanır GetForecastAsync . isLoadingOlduğunda true , düğme Kullanıcı arabiriminde devre dışı bırakılır:
@page "/fetchdata"
@using BlazorServerSample.Data
@inject WeatherForecastService ForecastService
<button disabled="@isLoading" @onclick="UpdateForecasts">Update</button>
@code {
private bool isLoading;
private WeatherForecast[] forecasts;
private async Task UpdateForecasts()
{
if (!isLoading)
{
isLoading = true;
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
isLoading = false;
}
}
}
Önceki örnekte gösterilen koruma deseninin arka plan işlemi, düzeniyle zaman uyumsuz olarak yürütülürse, bu işlem geçerlidir async - await .
Erken iptali yapın ve bir-After-Dispose kullanmaktan kaçının
Birden çok gönderilerde koruma bölümünde açıklandığı gibi bir koruyucu kullanmanın yanı sıra, CancellationToken bileşen bırakıldığında uzun süre çalışan işlemleri iptal etmek için bir kullanın. Bu yaklaşımda, bileşenlerden sonra kullanım-sonrasında Dispose özelliğinden kaçınmanın sağladığı avantaj vardır:
@implements IDisposable
...
@code {
private readonly CancellationTokenSource TokenSource =
new CancellationTokenSource();
private async Task UpdateForecasts()
{
...
forecasts = await ForecastService.GetForecastAsync(DateTime.Now,
TokenSource.Token);
if (TokenSource.Token.IsCancellationRequested)
{
return;
}
...
}
public void Dispose()
{
TokenSource.Cancel();
}
}
Büyük miktarlarda veri üreten olaylardan kaçının
Veya gibi bazı DOM olayları oninput onscroll büyük miktarda veri üretebilir. Bu olayları Blazor sunucu uygulamalarında kullanmaktan kaçının.
Ek güvenlik kılavuzu
ASP.NET Core uygulamalarının güvenliğini sağlamaya yönelik rehberlik, uygulamalar için geçerlidir Blazor Server ve aşağıdaki bölümlerde ele alınmıştır:
- Günlüğe kaydetme ve hassas veriler
- HTTPS ile yoldaki bilgileri koruma
- Siteler arası betik oluşturma (XSS)
- Çapraz kaynak koruması
- Tıklama-Jacking
- Yeniden yönlendirmeleri aç
Günlüğe kaydetme ve hassas veriler
İstemci ve sunucu arasındaki JS birlikte çalışma etkileşimleri, sunucu günlüklerine ILogger örneklerle kaydedilir. Blazor gerçek olaylar veya JS birlikte çalışma girişleri ve çıkışları gibi hassas bilgileri günlüğe kaydetmeyi önler.
Sunucuda bir hata oluştuğunda, çerçeve istemciye bildirir ve oturumu kapatır. Varsayılan olarak, istemci tarayıcının geliştirici araçlarında görünebileceğini belirten genel bir hata iletisi alır.
İstemci tarafı hatası çağrı yığınını içermez ve hatanın nedeni hakkında ayrıntı sağlamaz, ancak sunucu günlükleri bu gibi bilgileri içerir. Geliştirme amacıyla, önemli hata bilgileri, ayrıntılı hataları etkinleştirerekistemciye kullanılabilir hale getirilebilir.
Uyarı
Internet 'teki istemcilere hata bilgilerini ortaya çıkarmak her zaman kaçınılması gereken bir güvenlik riskidir.
HTTPS ile yoldaki bilgileri koruma
Blazor ServerSignalRistemci ve sunucu arasındaki iletişimi kullanır. Blazor Server Normalde, genellikle WebSockets olan bir aktarımı kullanır SignalR .
Blazor Server sunucu ile istemci arasında gönderilen verilerin bütünlüğünü ve gizliliğini garanti etmez. Her zaman HTTPS kullanın.
Siteler arası betik oluşturma (XSS)
Siteler arası betik oluşturma (XSS), yetkisiz bir tarafın tarayıcı bağlamında rastgele mantık yürütmesine olanak sağlar. Güvenliği aşılmış bir uygulama, istemcide rastgele kod çalıştırabilir. Güvenlik açığı, sunucuda büyük olasılıkla çok sayıda kötü amaçlı eylem gerçekleştirmek için kullanılabilir:
- Sahte/geçersiz olayları sunucuya gönderme.
- Dağıtım başarısız/geçersiz işleme tamamlama.
- İşleme tamamlamamasını gönderdikten kaçının.
- JavaScript 'ten .NET 'e birlikte çalışma çağrıları gönderme.
- .NET 'ten JavaScript 'e birlikte çalışma çağrılarının yanıtını değiştirme.
- .NET ile JS birlikte çalışma sonuçlarına dağıtma kullanmaktan kaçının.
Blazor ServerFramework, önceki tehditlere karşı korumak için gereken adımları gerçekleştirir:
- İstemci, işleme toplu işlerini bildirmeden, yeni UI güncellemeleri oluşturmayı durduruyor. İle yapılandırılır CircuitOptions.MaxBufferedUnacknowledgedRenderBatches .
- İstemciden bir yanıt almadan bir dakikadan sonra herhangi bir .NET için JavaScript çağrısı süresi. İle yapılandırılır CircuitOptions.JSInteropDefaultCallTimeout .
- JS birlikte çalışması sırasında tarayıcıdan gelen tüm girişte temel doğrulama gerçekleştirir:
- .NET başvuruları geçerli ve .NET yöntemi tarafından beklenen türde.
- Veriler hatalı biçimlendirilmemiş.
- Yöntem için doğru sayıda bağımsız değişken, yükte bulunur.
- Yöntemi çağırmadan önce bağımsız değişkenler veya sonuç doğru şekilde seri durumdan çıkarılmış olabilir.
- Tarayıcıdan gönderilen olaylardan gelen tüm girişte temel doğrulama gerçekleştirir:
- Olayın geçerli bir türü vardır.
- Olay verilerinin serisi kaldırılamaz.
- Olayla ilişkili bir olay işleyicisi var.
Framework 'ün uyguladığı korumalarına ek olarak, tehditlere karşı korumak ve uygun işlemleri gerçekleştirmek için uygulamanın geliştirici tarafından kodlanmış olması gerekir:
- Olayları işlerken her zaman verileri doğrulayın.
- Geçersiz veri aldıktan sonra uygun eylemi gerçekleştirin:
- Verileri yoksayın ve döndürün. Bu, uygulamanın istekleri işlemeye devam etmesine izin verir.
- Uygulama girişin meşru olduğunu belirlerse ve meşru istemci tarafından üretilemeyecek bir özel durum oluşturun. Bir özel durum oluşturmak devre dışı olarak oturum kapatır ve oturumu sonlandırır.
- Günlüklere dahil edilen işleme toplu iş tamamlamaları tarafından sağlanan hata iletisine güvenme. Hata istemci tarafından sağlanır ve istemcinin güvenliği tehlikeye girebilir ve genel olarak güvenilemez.
- JavaScript ve .NET yöntemleri arasında JS birlikte çalışma çağrılarında girişe güvenme.
- Uygulama, bağımsız değişkenlerin veya sonuçların doğru şekilderialized olsa bile bağımsız değişkenlerin ve sonuçların içeriğinin geçerli olduğunu doğrulamadan sorumludur.
XSS güvenlik açığının mevcut olması için uygulamanın işlenmiş sayfaya kullanıcı girişi eklemesi gerekir. Blazor Server bileşenleri, bir dosyada işaretlemenin yordamsal C# mantığına .razor dönüştürülmesiyle bir derleme zamanı adımı yürütür. Çalışma zamanında, C# mantığı öğeleri, metinleri ve alt bileşenleri açıklayan bir işleme ağacı derleme. Bu, tarayıcının DOM'sı için bir Dizi JavaScript yönergeleri aracılığıyla uygulanır (veya önceden işleyici durumunda HTML'ye seri hale getirili):
- Normal söz dizimi (örneğin, ) aracılığıyla işlenen kullanıcı girişi, söz dizimi yalnızca metin yazabilir komutlar aracılığıyla DOM'a eklendiklerine göre Razor bir XSS güvenlik açığını ortaya
@someStringValueRazor çıkarmaz. Değer HTML işaretlemesi de dahil olsa, değer statik metin olarak görüntülenir. Önceden yönlendirmesi yapılan çıkış, içeriği statik metin olarak da görüntüleyen HTML kodlamalı bir çıkıştır. - Betik etiketlerine izin verilmez ve uygulamanın bileşen işleme ağacına dahil olmaması gerekir. Bir bileşenin işaretlemesine bir betik etiketi dahil edilirse, derleme zamanı hatası oluşturulur.
- Bileşen yazarları, C# ile kullanarak bileşen Razor yazar. Bileşen yazarı, çıkış yayımlarken doğru API'leri kullanmakla sorumludur. Örneğin, bir
builder.AddContent(0, someUserSuppliedString)builder.AddMarkupContent(0, someUserSuppliedString)XSS güvenlik açığı oluşturabilmesi için kullanın ve kullanın.
XSS saldırılarına karşı korumanın bir parçası olarak, İçerik Güvenlik İlkesi (CSP) gibi XSS risk azaltmaları uygulamayı göz önünde bulundurabilirsiniz.
Daha fazla bilgi için bkz. ASP.NET Core siteler arası komut dosyası (XSS) engelle.
Çıkış noktası arası koruma
Çıkış noktası arası saldırılar, farklı bir çıkış noktası olan bir istemcinin sunucuya karşı bir eylem gerçekleştirmesini içerir. Kötü amaçlı eylem genellikle bir GET isteği veya post (Siteler Arası İstek Sahteciliği, CSRF) şeklindedir, ancak kötü amaçlı bir WebSocket açmak da mümkündür. Blazor Serveruygulamaları, hub protokolünü kullanan diğer tüm SignalR uygulamaların teklifiyle aynı garantileri sağlar:
- Blazor Server uygulamaları önlemek için ek önlemler alınmadıkça çıkış noktası üzerinden erişilebilir. Çıkış noktaları arası erişimi devre dışı bırakmak için, işlem hattına CORS ara yazılımı ekleyerek ve uç nokta meta verilerine ekleyerek uç noktada CORS'yi devre dışı bırakarak veya çıkış noktaları arası kaynak paylaşımı için yapılandırarak izin verilen kaynak kümelerini DisableCorsAttribute Blazor SignalR sınırlandırın.
- CORS etkinse, CORS yapılandırmasına bağlı olarak uygulamayı korumak için ek adımlar gerekebilir. CORS genel olarak etkinleştirildiyse, uç nokta rota oluşturucusu üzerinde çağrıldikten sonra uç nokta meta verilerine meta veriler ek tarafından hub için CORS Blazor Server DisableCorsAttribute devre dışı MapBlazorHub bırakılabilir.
Daha fazla bilgi için bkz. ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle.
Tıklamalı giriş
Tıklama girişi, kullanıcının saldırı altındaki sitede eylemler gerçekleştirmesi için bir siteyi farklı bir çıkış noktası olan bir sitenin içinde <iframe> işlemeyi içerir.
Bir uygulamayı bir içinde işlemeye karşı korumak <iframe> için İçerik Güvenlik İlkesi (CSP) ve üst bilgi X-Frame-Options kullanın. Daha fazla bilgi için bkz. MDN web belgeleri: X-Frame-Options.
Yeniden yönlendirmeleri açma
Bir Blazor Server uygulama oturumu başlatıldığında sunucu, oturumu başlatma işleminin bir parçası olarak gönderilen URL'ler için temel doğrulama gerçekleştirir. Çerçeve, bağlantı hattı kurulmadan önce temel URL'nin geçerli URL'nin üst öğesi olduğunu denetler. Çerçeve tarafından ek denetim gerçekleştiriliyor.
Kullanıcı istemcide bir bağlantı seçerken, bağlantının URL'si sunucuya gönderilir ve bu da hangi eylemin geçerli olduğunu belirler. Örneğin, uygulama bir istemci tarafı gezintisi gerçekleştirin veya yeni konuma gitmek için tarayıcıya işaret edin.
Bileşenler ayrıca kullanımı aracılığıyla program aracılığıyla gezinti isteklerini NavigationManager tetikler. Bu tür senaryolarda, uygulama istemci tarafı gezintisi gerçekleştirecek veya tarayıcıya yeni konuma gitmek için işaret ediyor olabilir.
Bileşenler şunların olması gerekir:
- Gezinti çağrısı bağımsız değişkenlerinin bir parçası olarak kullanıcı girişini kullanmaktan kaçının.
- Uygulamanın hedeflere izin verilemesi için bağımsız değişkenleri doğrulama.
Aksi takdirde, kötü niyetli bir kullanıcı tarayıcıyı saldırgan denetimli bir siteye gitmeye zorlayabilirsiniz. Bu senaryoda saldırgan, yöntemini çağırmanın bir parçası olarak bazı kullanıcı girişlerini kullanarak uygulamayı ele NavigationManager.NavigateTo almaktadır.
Bu öneri, bağlantıları uygulamanın bir parçası olarak işleme sırasında da geçerlidir:
- Mümkünse göreli bağlantılar kullanın.
- Mutlak bağlantı hedeflerini bir sayfaya eklemeden önce geçerli olduğunu onaylar.
Daha fazla bilgi için bkz. ASP.NET Core'da açık yeniden yönlendirme saldırılarını ASP.NET Core.
Güvenlik denetim listesi
Aşağıdaki güvenlik konuları listesi kapsamlı değildir:
- Olaylardan bağımsız değişkenleri doğrulama.
- JS birlikte çalışma çağrılarından gelen girişleri ve sonuçları doğrulama.
- .NET'den JS'ye birlikte çalışma çağrıları için kullanıcı girişini kullanmaktan (veya önceden doğrulamaktan) kaçının.
- İstemcinin sınırsız miktarda bellek bulundurmasını engelin.
- Bileşen içindeki veriler.
DotNetObjectistemciye döndürülen başvurular.
- Birden çok göndermeye karşı koruma.
- Bileşen atılmasıyla uzun süre çalışan işlemleri iptal edin.
- Büyük miktarlarda veri üreten olaylardan kaçının.
- Kullanıcı girişini çağrıların bir parçası olarak kullanmaktan kaçının ve url'ler için kullanıcı girişini izin verilen bir kaynak kümesine göre NavigationManager.NavigateTo doğrularsanız(kaçınılmazsa).
- Kullanıcı arabiriminin durumuna göre değil, yalnızca bileşen durumuna göre yetkilendirme kararları alma.
- XSS saldırılarına karşı koruma için İçerik Güvenlik İlkesi (CSP) kullanmayı göz önünde bulundurabilirsiniz.
- Tıklamaya karşı koruma için CSP ve X Çerçeve Seçenekleri kullanmayı göz önünde bulundurabilirsiniz.
- CORS'yi etkinleştirerek veya uygulamalar için CORS'yi açıkça devre dışı bırakarak CORS ayarlarının uygun olduğundan emin Blazor olun.
- Uygulamanın sunucu tarafı sınırlarının kabul edilemez risk düzeyleri olmadan kabul edilebilir bir kullanıcı deneyimi Blazor sağlamadığını test edin.
Blazor Server uygulamaları, sunucu ve istemcinin uzun süreli bir ilişki sürdüren durum bilgi işlem modelini benimser. Kalıcı durum, potansiyel olarak uzun süreli bağlantılarıyayabilecek bir bağlantı hattı tarafından korunur.
Kullanıcı bir siteyi Blazor Server ziyaret edinca sunucu, sunucunun belleğinde bir bağlantı hattı oluşturur. Bağlantı hattı tarayıcıya, kullanıcı kullanıcı arabiriminde bir düğmeyi seçerken olduğu gibi hangi içeriğin işlen ve olaylara yanıt ver istediğini gösterir. Bu eylemleri gerçekleştirmek için, bağlantı hattı kullanıcının tarayıcısında JavaScript işlevlerini ve sunucusundaki .NET yöntemlerini çağırır. Bu iki yol tabanlı JavaScript tabanlı etkileşim JavaScript birlikte çalışma (JS birlikte çalışma) olarak adlandırılır.
JS birlikte çalışma İnternet üzerinden oluştuğu için ve istemci uzak bir tarayıcı kullandığı için, Blazor Server uygulamalar çoğu web uygulaması güvenlik kaygısını paylaşır. Bu konu, uygulamalara yönelik yaygın Blazor Server tehditleri açıklar ve İnternet'e yönelik uygulamalara odaklanan tehdit azaltma kılavuzu sağlar.
Kurumsal ağların veya intranetlerin içinde olduğu gibi kısıtlanmış ortamlarda, risk azaltma kılavuzlarının bazıları:
- Kısıtlanmış ortamda geçerli değildir.
- Kısıtlı bir ortamda güvenlik riski düşük olduğundan, uygulanması gereken maliyete değer bir şey değil.
Blazor ve paylaşılan durum
Blazor sunucu uygulamaları sunucu belleğinde canlıdır. Bu, aynı işlem içinde barındırılan birden çok uygulama olduğu anlamına gelir. Her uygulama oturumu için kendi Blazor DI kapsayıcı kapsamına sahip bir bağlantı hattı başlatır. Bu, kapsamlı hizmetlerin oturum başına benzersiz olduğu anlamına Blazor gelir.
Uyarı
Çok dikkatli olunmadıkça tekli hizmetleri kullanarak aynı sunucu paylaşım durumuna sahip uygulamalar önerilmez çünkü bu durum bağlantı hatlarında kullanıcı durumunun sızması gibi güvenlik açıklarına neden olabilir.
Durum bilgisi olan tekli hizmetleri uygulamalar Blazor için özel olarak tasarlanmışsa kullanabilirsiniz. Örneğin, kullanıcıların hangi önbellek anahtarlarının hangi önbellek anahtarlarının üzerinde denetime sahip olmadığını varsayarak, belirli bir girişe erişmek için bir anahtar gerektirdiği için bir bellek önbelleğini tekli olarak kullanmak sorun değildir.
Ayrıca güvenlik nedenleriyle uygulamaları IHttpContextAccessor kullanmamanız Blazor gerekir. Blazoruygulamaları, uygulama işlem hattının bağlamının ASP.NET Core çalıştırabilirsiniz. içinde kullanılabilir olması veya uygulamayı başlatan bağlamı tutması HttpContext IHttpContextAccessor garanti Blazor edilemez.
İstek durumunu uygulamaya iletirken önerilen yol, uygulamanın ilk işlemesinde kök Blazor bileşene parametrelerden geçer:
- Uygulamaya geçmek istediğiniz tüm verilerle bir sınıf Blazor tanımlayın.
- Sayfasındaki verileri o Razor anda kullanılabilir olan ile HttpContext doldurmak.
- Verileri uygulamaya parametre Blazor olarak kök bileşene (Uygulama) iletir.
- Uygulamaya geçirilen verileri tutmak için kök bileşende bir parametre tanımlayın.
- Uygulama içinde kullanıcıya özgü verileri kullanma; alternatif olarak, uygulama genelinde kullanılas için bu verileri içindeki OnInitializedAsync kapsamlı bir hizmete kopyalayın.
Daha fazla bilgi ve örnek kod için bkz. ASP.NET Core Blazor Server ek güvenlik senaryoları .
Kaynak tükenmesi
Bir istemci sunucuyla etkileşim kurduğunda ve sunucunun aşırı kaynak tükettiğinde kaynak tükenmesi oluşabilir. Aşırı kaynak tüketimi öncelikli olarak şunları etkiler:
Hizmet reddi (DoS) saldırıları genellikle bir uygulamanın veya sunucunun kaynaklarını tüketen bir saldırıdır. Ancak kaynak tükenmesi mutlaka sisteme yapılan bir saldırının sonucu değildir. Örneğin, sonlu kaynaklar yüksek kullanıcı talebi nedeniyle tükenmiş olabilir. DoS, Hizmet reddi (DoS) saldırıları bölümünde daha ayrıntılı olarak ele almaktadır.
Çerçevenin dışında veritabanları ve dosya tanıtıcıları (dosyaları okumak ve yazmak için kullanılır) gibi kaynaklar Blazor da kaynak tükenmesi ile sonuçlanabilir. Daha fazla bilgi için bkz. ASP.NET Core Performansa Yönelik En İyi Yöntemler.
CPU
Cpu tükenmesi, bir veya daha fazla istemci sunucuyu yoğun CPU çalışması gerçekleştirmeye zorlarsa oluşabilir.
Örneğin, Blazor Server Fibonnacci sayısını hesapan bir uygulamayı düşünün. Bir Fibonnacci sayısı, dizide yer alan her sayı, yukarıdaki iki sayanın toplamı olan bir Fibonnacci dizisinde oluşturulur. Yanıta ulaşmak için gereken iş miktarı, sıranın uzunluğuna ve başlangıç değerinin boyutuna bağlıdır. Uygulama bir istemcinin isteğine sınırlar uygulamazsa YOĞUN CPU kullanımına sahip hesaplamalar CPU'nun süresinde baskın olabilir ve diğer görevlerin performansını azaltabilirsiniz. Aşırı kaynak tüketimi, kullanılabilirliği etkileyen bir güvenlik sorunudur.
CPU tükenmesi, genele yönelik tüm uygulamalar için bir sorundur. Normal web uygulamaları, istekler ve bağlantılar bir koruma olarak zaman alır, ancak Blazor Server uygulamalar aynı korumaları sağlamaz. Blazor Server uygulamaların CPU kullanımı yoğun olabilecek işler gerçekleştirmeden önce uygun denetimler ve sınırlar içermesi gerekir.
Bellek
Bir veya daha fazla istemci sunucuyu büyük miktarda bellek tüketmeye zorlarsa bellek tükenmesi oluşabilir.
Örneğin, öğe listesini Blazor kabul eden ve görüntüleyen bir bileşene sahip bir -server tarafı uygulaması düşünün. Uygulama izin verilen öğe sayısına veya istemciye geri işlenen öğe sayısına sınırlar getiremese, yoğun bellek kullanımına sahip işleme ve işleme, sunucunun performansının düşük olduğu noktaya kadar sunucunun belleğinde baskın Blazor olabilir. Sunucu kilitlenmesi veya kilitlenmesi gibi görünen noktaya kadar yavaş olabilir.
Sunucudaki olası bir bellek tükenmesi senaryosuyla ilgili öğelerin listesini korumak ve görüntülemek için aşağıdaki senaryoyu düşünün:
- Bir özellik veya
List<MyItem>alanda yer alan öğeler sunucunun belleğini kullanır. Uygulama öğe listesinin sınırsız olarak büyümesine izin verirse, sunucunun belleğinin tükenmiş olduğu riski vardır. Yetersiz bellek, geçerli oturumun bitim (kilitlenme) durumuna neden olur ve bu sunucu örneğinde tüm eşzamanlı oturumlar yetersiz bellek özel durumu alır. Bu senaryonun gerçekleşmesini önlemek için uygulamanın eş zamanlı kullanıcılara öğe sınırı ekleyen bir veri yapısı kullanması gerekir. - İşleme için bir disk belleği düzeni kullanılmazsa, sunucu kullanıcı arabiriminde görünür olmayan nesneler için ek bellek kullanır. Öğe sayısı sınırı olmadan, bellek talepleri kullanılabilir sunucu belleğini tüketmiş olabilir. Bu senaryoyu önlemek için aşağıdaki yaklaşımlardan birini kullanın:
- İşleme sırasında sayfa sayfalı listeleri kullanın.
- Yalnızca ilk 100-1.000 öğe görüntülenir ve kullanıcının görüntülenen öğelerin ötesinde öğeleri bulmak için arama ölçütü girmelerini gerektirir.
- Daha gelişmiş bir işleme senaryosu için sanallaştırmayı destekleyen listeler veya kılavuzlar kullanın. Sanallaştırmayı kullanarak listeler yalnızca o anda kullanıcıya görünür olan öğelerin bir alt kümesini işler. Kullanıcı kullanıcı arabiriminde kaydırma çubuğuyla etkileşim kurduğunda, bileşen yalnızca görüntülemek için gereken öğeleri işler. Şu anda görüntüleme için gerekli olmayan öğeler ikincil depolamada tutularak ideal yaklaşımdır. Daha az ideal olan, oynatılmaz öğeler de bellekte tutulabilirsiniz.
Blazor Serveruygulamaları WPF, Windows Forms veya gibi durum bilgisi olan uygulamalar için diğer kullanıcı arabirimi çerçeveleri için benzer bir programlama modeli Blazor WebAssembly sağlar. Temel fark, birkaç kullanıcı arabirimi çerçevesinde uygulama tarafından tüketilen belleğin istemciye ait olduğu ve yalnızca bu istemciyi etkilediğidir. Örneğin, bir Blazor WebAssembly uygulama tamamen istemci üzerinde çalışır ve yalnızca istemci bellek kaynaklarını kullanır. Senaryoda, Blazor Server uygulama tarafından tüketilen bellek sunucuya aittir ve sunucu örneğinde istemciler arasında paylaşılır.
Tüm uygulamalar için sunucu tarafı bellek talepleri göz önünde Blazor Server bulundurulmalıdır. Ancak çoğu web uygulaması durum bilgisizdir ve yanıt döndürülerek istek işleme sırasında kullanılan bellek serbest bıraktır. Genel bir öneri olarak, istemcilerin istemci bağlantılarını kalıcı olarak bulunduran diğer sunucu tarafı uygulamalarda olduğu gibi sınırsız miktarda bellek ayırmalarına izin verme. Bir uygulama tarafından tüketilen Blazor Server bellek, tek bir istekten daha uzun süre kalıcı olur.
Not
Geliştirme sırasında, istemcilerin bellek taleplerini değerlendirmek için bir profil oluşturma veya yakalanan bir izleme kullanılabilir. Profil oluşturma veya izleme, belirli bir istemciye ayrılan belleği yakalamaz. Geliştirme sırasında belirli bir istemcinin bellek kullanımını yakalamak için dökümünü alın ve bir kullanıcının bağlantı hattında kök erişime sahip tüm nesnelerin bellek talebini inceler.
İstemci bağlantıları
Bağlantı tükenmesi, bir veya daha fazla istemci sunucuya çok fazla eşzamanlı bağlantı açıp diğer istemcilerin yeni bağlantı kurmasını önleyene kadar ortaya çıkabilir.
Blazor istemcileri oturum başına tek bir bağlantı kurulur ve tarayıcı penceresi açık olduğu sürece bağlantıyı açık olarak tutabilirsiniz. Tüm bağlantıların bakımının sunucuya yönelik talepleri uygulamalara özgü Blazor değil. Bağlantıların kalıcı yapısı ve uygulamaların durum bilgili yapısı göz göre, bağlantı tükenmesi Blazor Server uygulamanın kullanılabilirliği için daha büyük bir risktir.
Varsayılan olarak, bir uygulama için kullanıcı başına bağlantı sayısı sınırı Blazor Server yoktur. Uygulama bir bağlantı sınırı gerektiriyorsa, aşağıdaki yaklaşımlardan birini veya daha fazlasını yapın:
- Yetkisiz kullanıcıların uygulamaya bağlanma becerisini doğal olarak sınırlayan kimlik doğrulaması gerektir. Bu senaryonun etkili olması için, kullanıcıların yeni kullanıcılara iten sonra sağlamaları engellenebilir.
- Kullanıcı başına bağlantı sayısını sınırla. Bağlantıları sınırlamak için aşağıdaki yaklaşımlar kullanabilirsiniz. Meşru kullanıcıların uygulamaya erişmesine izin vermek için alıştırma yapın (örneğin, istemcinin IP adresine göre bir bağlantı sınırı kurulu olduğunda).
Uygulama düzeyinde:
- Uç nokta yönlendirme genişletilebilirliği.
- Uygulamaya bağlanmak ve kullanıcı başına etkin oturumları izlemek için kimlik doğrulaması gerektir.
- Sınıra ulaşarak yeni oturumları reddedin.
- İstemcilerden bir uygulamaya bağlantıları birden çok kez kullanan Azure SignalR Hizmeti gibi bir ara sunucu kullanarak bir uygulamaya proxy WebSocket bağlantıları. Bu, tek bir istemcinin kuralarından daha fazla bağlantı kapasitesine sahip bir uygulama sağlar ve bir istemcinin sunucuya yönelik bağlantıları tüketerek engellemesini sağlar.
Sunucu düzeyinde: Uygulamanın önünde ara sunucu/ağ geçidi kullanın.
Not
Uygulamalar için Uzun Yoklama desteklese de, önerilen aktarım protokolü Blazor Server WebSockets'tir.
Hizmet reddi (DoS) saldırıları
Hizmet reddi (DoS) saldırıları, sunucunun uygulamayı kullanılamaz hale getirirken bir veya daha fazla kaynağı tükettiklerine neden olan bir istemci içerir. Blazor Serveruygulamalar varsayılan sınırları içerir ve üzerinde ASP.NET Core DoS saldırılarına karşı korunmak için diğer güvenlik SignalR özelliklerine ve sınırlara CircuitOptions güvenebilir:
- CircuitOptions.DisconnectedCircuitMaxRetained
- CircuitOptions.DisconnectedCircuitRetentionPeriod
- CircuitOptions.JSInteropDefaultCallTimeout
- CircuitOptions.MaxBufferedUnacknowledgedRenderBatches
- HubConnectionContextOptions.MaximumReceiveMessageSize
Daha fazla bilgi ve yapılandırma kodlama örnekleri için aşağıdaki makalelere bakın:
Tarayıcıyla etkileşimler (istemci)
İstemci, JS birlikte çalışma olayı göndererek ve tamamlandıktan sonra sunucuyla etkileşime geçiyor. JS birlikte çalışma iletişimi, JavaScript ile .NET arasında her iki yolu da sağlar:
- Tarayıcı olayları istemciden sunucuya zaman uyumsuz bir şekilde sevk edilir.
- Sunucu, gerektiğinde kullanıcı arabirimini zaman uyumsuz olarak yeniden inceler.
.NET'den çağrılan JavaScript işlevleri
.NET yöntemlerinden JavaScript'e yapılan çağrılar için:
- Tüm çağrılar başarısız olduktan sonra çağırana döndüren yapılandırılabilir bir OperationCanceledException zaman aşımına sahip olur.
- Bir dakikalık çağrılar ( ) için varsayılan CircuitOptions.JSInteropDefaultCallTimeout bir zaman aşımı olur. Bu sınırı yapılandırmak için .NET yöntemlerinden JavaScript işlevlerini ASP.NET Core Blazor bkz. .
- İptali her çağrı temelinde kontrol etmek için bir iptal belirteci sağlanmalıdır. Bir iptal belirteci sağlanırsa, mümkün olduğunca varsayılan çağrı zaman aşımına ve istemciye yapılan herhangi bir çağrıya zaman bağlı olarak güvenin.
- JavaScript çağrısının sonucuna güvenilemez. Tarayıcıda Blazor çalışan uygulama istemcisi, çağırmak için JavaScript işlevini arar. İşlev çağrılır ve sonuç veya hata üretir. Kötü amaçlı bir istemci şunları yapmaya girişimde olabilir:
- JavaScript işlevinden hata döndürerek uygulamada bir soruna neden olur.
- JavaScript işlevinden beklenmeyen bir sonuç döndürerek sunucuda beklenmeyen bir davranış tetikler.
Önceki senaryolara karşı koruma için aşağıdaki önlemleri alın:
- Çağrılar sırasında ortaya çıkabilir hataları hesaba etmek için deyimleri içinde JS
try-catchbirlikte çalışma çağrılarını sarmala. Daha fazla bilgi için bkz. ASP.NET Core uygulamalardaki hataları işleme Blazor. - Herhangi bir işlemden önce hata iletileri de dahil olmak üzere JS birlikte çalışma çağrılarından döndürülen verileri doğrulama.
Tarayıcıdan çağrılan .NET yöntemleri
JavaScript'den .NET yöntemlerine yapılan çağrılara güvenme. Bir .NET yöntemi JavaScript'e açık olduğunda.NET yönteminin nasıl çağrıl olduğunu göz önünde bulundurarak:
- JavaScript'e açık olan tüm .NET yöntemlerine, uygulamanın genel uç noktası gibi davranabilirsiniz.
- Girişi doğrulama.
- Değerlerin beklenen aralıklar içinde olduğundan emin olmak.
- Kullanıcının istenen eylemi gerçekleştirme iznine sahip olduğundan emin olmak.
- .NET yöntem çağrılarının bir parçası olarak aşırı miktarda kaynak ayırmayın. Örneğin, denetimler gerçekleştirin ve CPU ve bellek kullanımına sınırlar bindirin.
- Statik ve örnek yöntemlerinin JavaScript istemcilerine açık olduğunu dikkate alın. Tasarım uygun kısıtlamalarla durumu paylaşmaya çağrılmadıkça oturumlar arasında durum paylaşımından kaçının.
- Başlangıçta bağımlılık ekleme (DI) ile oluşturulan nesneler aracılığıyla açığa çıkarılan örnek yöntemler
DotNetReferenceiçin, nesnelerin kapsamlı nesneler olarak kayıtlı olması gerekir. Bu, uygulamanın kullandığı tüm DI hizmetleri Blazor Server için geçerlidir. - Statik yöntemler için, uygulamanın bir sunucu örneğinde tüm kullanıcılarda durum tasarıma göre açıkça paylaşılması dışında istemcinin kapsamı belirlene olmayan bir durum kurmaktan kaçının.
- Başlangıçta bağımlılık ekleme (DI) ile oluşturulan nesneler aracılığıyla açığa çıkarılan örnek yöntemler
- Parametrelerde kullanıcı tarafından sağlanan verileri JavaScript çağrılara geçirmeyi önle. Parametrelerin içinde veri geçirme kesinlikle gerekli ise JavaScript kodunun, siteler arası betik oluşturma (XSS) güvenlik açıklarına neden olmadan verileri geçirmeyi işlemesi gerekir. Örneğin, kullanıcı tarafından sağlanan verileri bir öğenin Belge Nesne Modeli (DOM)
innerHTMLdeğerine yazmayın. Ve diğer güvenli olmayan JavaScript temellerini devre dışı bırakmak için İçerik Güvenlik İlkesi (CSP)evalkullanmayı göz önünde bulundurabilirsiniz.
- Girişi doğrulama.
- Çerçevenin gönderme uygulamasının üzerine .NET çağrılarının özel göndermesini uygulamaktan kaçının. .NET yöntemlerini tarayıcıya ifşa etmek, genel geliştirme için önerilmez, gelişmiş bir Blazor senaryodur.
Ekinlikler
Olaylar uygulamaya giriş noktası Blazor Server sağlar. Web uygulamaları içinde uç noktaları korumaya yönelik aynı kurallar, uygulamalarda olay işleme için Blazor Server de geçerlidir. Kötü amaçlı bir istemci, bir olay için yük olarak göndermek istediği tüm verileri gönderebilir.
Örneğin:
- için bir değişiklik olayı, uygulamanın istemciye sunduğu seçenekler
<select>içinde olmayan bir değer gönderebilir. <input>, istemci tarafı doğrulamayı atlayarak sunucuya herhangi bir metin verisi gönderebilir.
Uygulamanın, uygulamanın işlemesi gereken herhangi bir olay için verileri doğrulaması gerekir. Çerçeve Blazor formları bileşenleri temel doğrulamalar gerçekleştirmektedir. Uygulama özel form bileşenleri kullanıyorsa, olay verilerini uygun şekilde doğrulamak için özel kodun yazlanması gerekir.
Blazor Server olaylar zaman uyumsuzdur, bu nedenle uygulamanın yeni bir işleme üreterek tepki verme süresi olmadan önce sunucuya birden çok olay gönderebilirsiniz. Bunun göz önünde bulundurarak bazı güvenlik etkileri vardır. Uygulama içindeki istemci eylemlerini sınırlamak, geçerli işlenmiş görünüm durumuna bağlı değil, olay işleyicileri içinde gerçekleştir yapılmalıdır.
Bir kullanıcının sayacı en fazla üç kez artırmasına izin verecek bir sayaç bileşeni düşünün. Sayacı artırma düğmesi koşullu olarak değerine count göredir:
<p>Count: @count<p>
@if (count < 3)
{
<button @onclick="IncrementCount" value="Increment count" />
}
@code
{
private int count = 0;
private void IncrementCount()
{
count++;
}
}
Bir istemci, çerçeve bu bileşenin yeni bir işlemesini oluşturmadan önce bir veya daha fazla artış olayını gönderebilirsiniz. Sonuç olarak, düğme kullanıcı arabirimi tarafından yeterince hızlı bir şekilde kaldırılamayarak kullanıcı tarafından count üç kat artırılabilir. Üç artış sınırına ulaşmanın doğru count yolu aşağıdaki örnekte gösterilmiştir:
<p>Count: @count<p>
@if (count < 3)
{
<button @onclick="IncrementCount" value="Increment count" />
}
@code
{
private int count = 0;
private void IncrementCount()
{
if (count < 3)
{
count++;
}
}
}
if (count < 3) { ... }İşleyicinin içine denetimi ekleyerek artırma kararı geçerli uygulama count durumuna göre olur. Karar, önceki örnekte olduğu gibi kullanıcı arabiriminin durumuna bağlı değil ve geçici olarak eski olabilir.
Birden çok göndermeye karşı koruma
Bir olay geri çağırma, dış hizmetten veya veritabanından veri getirme gibi uzun süre çalışan bir işlemi zaman uyumsuz olarak çağırırsa, koruma kullanmayı göz önünde bulundurabilirsiniz. Koruyucu, işlem devam ederken kullanıcının görsel geri bildirim ile birden çok işlemi kuyruğa alamasını önlenebilir. Aşağıdaki bileşen kodu, isLoading true sunucudan veri GetForecastAsync alırken olarak ayarlar. ise, isLoading true düğme kullanıcı arabiriminde devre dışı bırakılır:
@page "/fetchdata"
@using BlazorServerSample.Data
@inject WeatherForecastService ForecastService
<button disabled="@isLoading" @onclick="UpdateForecasts">Update</button>
@code {
private bool isLoading;
private WeatherForecast[] forecasts;
private async Task UpdateForecasts()
{
if (!isLoading)
{
isLoading = true;
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
isLoading = false;
}
}
}
Önceki örnekte yer alan koruma deseni, arka plan işlemi desenle zaman uyumsuz olarak yürütülürse async - await çalışır.
Erken iptal etme ve kullanımdan sonra atma işlemini önleme
Birden çok göndermeye karşı koruma bölümünde açıklandığı gibi bir koruma kullanmanın yanı sıra, bileşen atılmasında uzun süre çalışan işlemleri iptal etmek için CancellationToken kullanmayı göz önünde bulundurabilirsiniz. Bu yaklaşım, bileşenlerde kullanımdan sonra atma kullanımını önlemenin ek avantajına sahiptir:
@implements IDisposable
...
@code {
private readonly CancellationTokenSource TokenSource =
new CancellationTokenSource();
private async Task UpdateForecasts()
{
...
forecasts = await ForecastService.GetForecastAsync(DateTime.Now,
TokenSource.Token);
if (TokenSource.Token.IsCancellationRequested)
{
return;
}
...
}
public void Dispose()
{
TokenSource.Cancel();
}
}
Büyük miktarlarda veri üreten olaylardan kaçının
veya gibi bazı DOM oninput olayları büyük miktarda veri onscroll üretebilir. Bu olayları sunucu uygulamalarına Blazor kullanmaktan kaçının.
Ek güvenlik kılavuzu
Uygulamaları güvenli hale ASP.NET Core kılavuzu uygulamalar için Blazor Server geçerlidir ve aşağıdaki bölümlerde ele lanmıştır:
- Günlüğe kaydetme ve hassas veriler
- HTTPS ile aktarımdaki bilgileri koruma
- Siteler arası betik (XSS)
- Çıkış noktası arası koruma
- Tıklamalı giriş
- Yeniden yönlendirmeleri açma
Günlüğe kaydetme ve hassas veriler
İstemci ve sunucu arasındaki JS birlikte çalışma etkileşimleri, örnekleri olan sunucunun ILogger günlüklerine kaydedilir. Blazor gerçek olaylar veya JS birlikte çalışma girişleri ve çıkışları gibi hassas bilgilerin günlüğe kaydını önler.
Sunucuda bir hata oluştuğunda, çerçeve istemciye bilgi verir ve oturumu alt alta alır. Varsayılan olarak, istemci tarayıcının geliştirici araçlarında görüle bir genel hata iletisi alır.
İstemci tarafı hatası çağrı yığınını içermez ve hatanın nedeni hakkında ayrıntılı bilgi sağlamaz, ancak sunucu günlükleri bu tür bilgileri içerir. Geliştirme amacıyla, ayrıntılı hatalar etkinleştirerek hassas hata bilgileri istemci tarafından kullanılabilir.
Uyarı
Hata bilgilerini internetteki istemcilere ifşa etmek her zaman kaçınılması gereken bir güvenlik riskidir.
AKTARıMdaki bilgileri HTTPS ile koruma
Blazor Server , SignalR istemci ile sunucu arasındaki iletişim için kullanır. Blazor Server normalde, genellikle SignalR WebSockets olan anlaşması yapılan taşımayı kullanır.
Blazor Server , sunucu ile istemci arasında gönderilen verilerin bütünlüğünü ve gizliliğini garanti etmez. Her zaman HTTPS kullanın.
Siteler arası betik (XSS)
Siteler arası betik (XSS), yetkisiz bir taraf tarafından tarayıcı bağlamında rastgele mantık yürütmeye olanak sağlar. Güvenliği tehlikeye atılmış bir uygulama, istemcide rastgele kod çalıştırabilir. Bu güvenlik açığı, sunucuya karşı bir dizi kötü amaçlı eylem gerçekleştirmek için kullanılabilir:
- Sunucuya sahte/geçersiz olaylar gönderme.
- Gönderme başarısız/geçersiz işleme tamamlamaları.
- İşleme tamamlamaları göndermeden kaçının.
- JavaScript'den .NET'e birlikte çalışma çağrıları gönderme.
- .NET'den JavaScript'e birlikte çalışma çağrılarının yanıtını değiştirme.
- .NET'i JS birlikte çalışma sonuçlarına göndermeden kaçının.
Çerçeve, Blazor Server önceki tehditlerden bazılarına karşı koruma adımlarını benimser:
- İstemci işleme toplu işlerini onaylıyorsa yeni kullanıcı arabirimi güncelleştirmeleri üretmeyi durdurur. ile CircuitOptions.MaxBufferedUnacknowledgedRenderBatches yapılandırıldı.
- İstemciden yanıt almadan bir dakika sonra herhangi bir .NET to JavaScript çağrısını zaman dışı bıraktı. ile CircuitOptions.JSInteropDefaultCallTimeout yapılandırıldı.
- JS birlikte çalışma sırasında tarayıcıdan gelen tüm girişlerde temel doğrulama gerçekleştirir:
- .NET başvuruları geçerlidir ve .NET yöntemi tarafından beklenen türdedir.
- Veriler yanlış biçimlendirilmiş değil.
- yöntemi için doğru bağımsız değişken sayısı yükte mevcuttur.
- Bağımsız değişkenler veya sonuç, yöntemin iptal ed önce doğru bir şekilde deserialized olabilir.
- Tarayıcıdan gelen tüm girişlerde, sevk edilen olaylardan gelen temel doğrulamayı gerçekleştirir:
- Olayın geçerli bir türü var.
- Olay verileri,rialized olabilir.
- Olayla ilişkilendirilmiş bir olay işleyicisi vardır.
Çerçevenin uygulayan güvenlik önlemlerine ek olarak, uygulamanın tehditlere karşı korunması ve uygun eylemlerin uygulanması için geliştirici tarafından kodlantırıldı:
- Olayları işlerken her zaman verileri doğrula.
- Geçersiz veriler aldıktan sonra uygun eylemi yerine kullanın:
- Verileri yoksayın ve geri gelin. Bu, uygulamanın istekleri işlemeye devam ettiğine olanak sağlar.
- Uygulama girişin geçici olduğunu ve meşru istemci tarafından üretile olmadığını belirlerse bir özel durum oluşturur. Özel durum atarak devreyi alt alta aldı ve oturumu sonlandı.
- Günlüklere dahil edilen işleme toplu iş tamamlamaları tarafından sağlanan hata iletisine güvenme. Hata istemci tarafından sağlanır ve istemcinin güvenliği tehlikeye girebilir ve genel olarak güvenilemez.
- JavaScript ve .NET yöntemleri arasında JS birlikte çalışma çağrılarında girişe güvenme.
- Uygulama, bağımsız değişkenlerin veya sonuçların doğru şekilde deserialized olsa bile bağımsız değişkenlerin ve sonuçların içeriğinin geçerli olduğunu doğrulamadan sorumludur.
XSS güvenlik açığının mevcut olması için uygulamanın işlenmiş sayfaya kullanıcı girişi eklemesi gerekir. Blazor Server bileşenleri, bir dosyada işaretlemenin yordamsal C# mantığına .razor dönüştürülmesiyle bir derleme zamanı adımı yürütür. Çalışma zamanında, C# mantığı öğeleri, metinleri ve alt bileşenleri açıklayan bir işleme ağacı derleme. Bu, tarayıcının DOM'sı için bir Dizi JavaScript yönergeleri aracılığıyla uygulanır (veya önceden işleyici durumunda HTML'ye seri hale getirili):
- Normal söz dizimi (örneğin, ) aracılığıyla işlenen kullanıcı girişi, söz dizimi yalnızca metin yazabilir komutlar aracılığıyla DOM'a eklendiklerine göre Razor bir XSS güvenlik açığını ortaya
@someStringValueRazor çıkarmaz. Değer HTML işaretlemesi de dahil olsa, değer statik metin olarak görüntülenir. Önceden incelerken çıkış, içeriği statik metin olarak da görüntüleyen HTML kodlamalıdır. - Betik etiketlerine izin verilmez ve uygulamanın bileşen işleme ağacına dahil olmaması gerekir. Bir bileşenin işaretlemesine bir betik etiketi dahil edilirse, derleme zamanı hatası oluşturulur.
- Bileşen yazarları, C# ile kullanarak bileşen Razor yazar. Bileşen yazarı, çıkış yayımlarken doğru API'leri kullanmakla sorumludur. Örneğin, bir
builder.AddContent(0, someUserSuppliedString)builder.AddMarkupContent(0, someUserSuppliedString)XSS güvenlik açığı oluşturabilmesi için kullanın ve kullanın.
XSS saldırılarına karşı korumanın bir parçası olarak, İçerik Güvenlik İlkesi (CSP) gibi XSS risk azaltmaları uygulamayı göz önünde bulundurabilirsiniz.
Daha fazla bilgi için bkz. ASP.NET Core siteler arası komut dosyası (XSS) engelle.
Çıkış noktası arası koruma
Çıkış noktası arası saldırılar, farklı bir çıkış noktası olan bir istemcinin sunucuya karşı bir eylem gerçekleştirmesini içerir. Kötü amaçlı eylem, genellikle bir GET isteği veya bir form GÖNDERISINI (siteler arası Istek sahteciliği, CSRF), ancak kötü amaçlı bir WebSocket açmak da mümkündür. Blazor Server uygulamalar, SignalR hub protokolünü kullanan diğer tüm uygulamaların aynısınısunar:
- Blazor Server uygulamalara ek ölçüler alınana kadar, uygulamalara çapraz kaynak erişilebilir. Çapraz kaynak erişimini devre dışı bırakmak için, işlem hattındaki CORS 'yi işlem hattına ekleyerek ve DisableCorsAttribute Blazor uç nokta meta verilerine ekleyerek veya SignalR arası kaynak paylaşımı için yapılandırarakizin verilen çıkış noktaları kümesini sınırlandırarak devre dışı bırakın.
- CORS etkinse, CORS yapılandırmasına bağlı olarak uygulamayı korumak için ek adımlar gerekebilir. CORS genel olarak etkinleştirilmişse, Blazor Server DisableCorsAttribute MapBlazorHub uç nokta yol Oluşturucu ' da çağrıldıktan sonra meta veri noktası meta verilerine eklenen CORS, Hub için devre dışı bırakılabilir.
Daha fazla bilgi için bkz. ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle.
Tıklama-Jacking
Tıklama-Jacking <iframe> , kullanıcıyı saldırı kapsamındaki sitede eylemler gerçekleştirmeye ikna etmek için bir sitenin farklı bir kaynaktan bir site içinde işlenmesini içerir.
Bir uygulamanın içinde işlemesini korumak için <iframe> Içerik güvenlik IlkesI (CSP) ve X-Frame-Options üst bilgi kullanın. Daha fazla bilgi için bkz. MDN Web belgeleri: X-Frame-Options.
Yeniden yönlendirmeleri aç
Bir Blazor Server uygulama oturumu başladığında, sunucu, oturum başlatma işleminin bir parçası olarak gönderilen URL 'lerin temel doğrulamasını gerçekleştirir. Framework, devre oluşturmadan önce temel URL 'nin geçerli URL 'nin bir üst olduğunu denetler. Framework tarafından başka denetim yapılmaz.
Kullanıcı istemcide bir bağlantı seçtiğinde, bağlantının URL 'SI sunucuya gönderilir ve bu işlem gerçekleştirilecek eylemi belirler. Örneğin, uygulama bir istemci tarafı gezintisi gerçekleştirebilir veya tarayıcıya yeni konuma gidemeyeceğini belirtebilir.
Bileşenler, program aracılığıyla aracılığıyla gezinme isteklerini de tetikleyebilirler NavigationManager . Bu tür senaryolarda, uygulama bir istemci tarafı gezintisi gerçekleştirebilir veya tarayıcıya yeni konuma gidebileceğini gösterebilir.
Bileşenler:
- Gezinti çağrısı bağımsız değişkenlerinin bir parçası olarak Kullanıcı girişini kullanmaktan kaçının.
- Hedefin uygulama tarafından izin verildiğinden emin olmak için bağımsız değişkenleri doğrulayın.
Aksi takdirde, kötü niyetli bir kullanıcı tarayıcıyı saldırgan tarafından denetlenen bir siteye gitmesini zorlayabilir. Bu senaryoda, saldırgan, yöntemi çağırmanın bir parçası olarak uygulamayı bazı kullanıcı girişlerini kullanarak ' ye püf ediyor NavigationManager.NavigateTo .
Bu öneri, uygulamanın bir parçası olarak bağlantılar işlenirken de geçerlidir:
- Mümkünse, göreli bağlantıları kullanın.
- Mutlak bağlantı hedeflerinin bir sayfaya dahil etmeden önce geçerli olduğunu doğrulayın.
Daha fazla bilgi için bkz. ASP.NET Core'da açık yeniden yönlendirme saldırılarını ASP.NET Core.
Güvenlik denetim listesi
Aşağıdaki güvenlik konuları listesi ayrıntılı değildir:
- Etkinliklerden bağımsız değişkenleri doğrulayın.
- Giriş ve, JS birlikte çalışma çağrılarındaki sonuçları doğrulayın.
- .NET için JS birlikte çalışabilirlik çağrılarına yönelik kullanıcı girişini kullanmaktan (veya önceden doğrulama) kaçının.
- İstemcinin ilişkisiz miktarda bellek ayırmasını engelleyin.
- Bileşen içindeki veriler.
DotNetObjectistemciye döndürülen başvurular.
- Birden çok gönderine karşı koruma.
- Bileşen atıldığı zaman uzun süre çalışan işlemleri iptal edin.
- Büyük miktarlarda veri üreten olaylardan kaçının.
- Kullanıcı girişini, çağrıların bir parçası olarak kullanmaktan kaçının NavigationManager.NavigateTo ve daha önce kaçınılmaz bir şekilde, URL 'ler için Kullanıcı girişini, izin verilen kaynaklar kümesine göre doğrulayın.
- Kullanıcı arabiriminin durumuna göre yetkilendirme kararları yapmayın, ancak yalnızca bileşen durumudur.
- XSS saldırılarına karşı korunmak için Içerik güvenlik ilkesi 'ni (CSP) kullanmayı düşünün.
- Tıklama-Jacking 'e karşı korumak için CSP ve X çerçeve seçeneklerini kullanmayı düşünün.
- CORS 'yi etkinleştirirken veya uygulamalar için CORS 'yi açıkça devre dışı bıraktığınızda CORS ayarlarının uygun olduğundan emin olun Blazor .
- Uygulamanın sunucu tarafı sınırlarının kabul Blazor edilemez bir risk düzeyi olmadan kabul edilebilir bir kullanıcı deneyimi sağlamasına emin olmak için test edin.