Aracılığıyla paylaş


ASP.NET Core için İçerik Güvenlik İlkesi Zorlama Blazor

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Bu makalede, Siteler Arası Betik (XSS) saldırılarına karşı korunmaya yardımcı olmak için ASP.NET Core Blazor uygulamalarıyla İçerik Güvenliği İlkesi'nin (CSP) nasıl kullanılacağı açıklanmaktadır.

Siteler Arası Betik (XSS), bir saldırganın bir veya daha fazla kötü amaçlı istemci tarafı betiğini uygulamanın işlenmiş içeriğine yerleştirdiği bir güvenlik açığıdır. CSP, tarayıcıya geçerli olduğunu bildirerek XSS saldırılarına karşı korumaya yardımcı olur:

  • Betikler, stil sayfaları, resimler ve eklentiler de dahil olmak üzere yüklenen içerik kaynakları.
  • Formların izin verilen URL hedeflerini belirterek bir sayfa tarafından yapılan eylemler.

Bir uygulamaya CSP uygulamak için geliştirici, bir veya daha fazla Content-Security-Policy üst bilgide veya <meta> etikette çeşitli CSP içerik güvenlik yönergeleri belirtir. Başlangıçta C# kodunda bir uygulamaya CSP uygulama hakkında yönergeler için bkz . ASP.NET Core Blazor başlatma.

İlkeler, bir sayfa yüklenirken tarayıcı tarafından değerlendirilir. Tarayıcı, sayfanın kaynaklarını inceler ve içerik güvenlik yönergelerinin gereksinimlerini karşılayıp karşılamadıklarını belirler. Bir kaynak için ilke yönergeleri karşılanmadığında tarayıcı kaynağı yüklemez. Örneğin, üçüncü taraf betiklere izin vermeyen bir ilke düşünün. Bir sayfada özniteliğinde üçüncü taraf kaynağı olan bir <script> etiket bulunduğunda src , tarayıcı betiğin yüklenmesini engeller.

CSP, Chrome, Edge, Firefox, Opera ve Safari gibi çoğu modern masaüstü ve mobil tarayıcıda desteklenir. Uygulamalar için Blazor CSP önerilir.

İlke yönergeleri

En az düzeyde, uygulamalar için Blazor aşağıdaki yönergeleri ve kaynakları belirtin. Gerektiğinde ek yönergeler ve kaynaklar ekleyin. Aşağıdaki yönergeler, bu makalenin İlkeyi uygula bölümünde kullanılır ve burada uygulamalar için Blazor güvenlik ilkeleri örneği sağlanır:

  • base-uri: Sayfanın etiketi için URL'leri <base> kısıtlar. Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
  • default-src: İlke tarafından açıkça belirtilmeyen kaynak yönergeleri için bir geri dönüş gösterir. Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
  • img-src: Görüntüler için geçerli kaynakları gösterir.
    • URL'lerden görüntülerin data: yüklenmesine izin vermek için belirtindata:.
    • HTTPS uç noktalarındaki görüntülerin yüklenmesine izin vermek için belirtin https: .
  • object-src: , <embed>ve <applet> etiketleri için <object>geçerli kaynakları gösterir. Tüm URL kaynaklarını önlemek için belirtin none .
  • script-src: Betikler için geçerli kaynakları gösterir.
    • Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
    • İstemci tarafı Blazor uygulamasında:
      • İstemci tarafı Blazor Mono çalışma zamanının çalışmasına izin vermek için belirtinwasm-unsafe-eval.
      • Gerekli çerçeve dışı betiklerinizin yüklenmesine izin vermek için ek karmaları belirtin.
    • Sunucu tarafı Blazor bir uygulamada, gerekli betiklerin yüklenmesine izin vermek için karmalar belirtin.
  • style-src: Stil sayfaları için geçerli kaynakları gösterir.
    • Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
    • Uygulama satır içi stiller kullanıyorsa, satır içi stillerinizin kullanımına izin vermek için belirtin unsafe-inline .
  • upgrade-insecure-requests: Güvenli olmayan (HTTP) kaynaklardan gelen içerik URL'lerinin HTTPS üzerinden güvenli bir şekilde alınması gerektiğini gösterir.
  • base-uri: Sayfanın etiketi için URL'leri <base> kısıtlar. Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
  • default-src: İlke tarafından açıkça belirtilmeyen kaynak yönergeleri için bir geri dönüş gösterir. Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
  • img-src: Görüntüler için geçerli kaynakları gösterir.
    • URL'lerden görüntülerin data: yüklenmesine izin vermek için belirtindata:.
    • HTTPS uç noktalarındaki görüntülerin yüklenmesine izin vermek için belirtin https: .
  • object-src: , <embed>ve <applet> etiketleri için <object>geçerli kaynakları gösterir. Tüm URL kaynaklarını önlemek için belirtin none .
  • script-src: Betikler için geçerli kaynakları gösterir.
    • Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
    • İstemci tarafı Blazor uygulamasında:
      • İstemci tarafı Blazor Mono çalışma zamanının çalışmasına izin vermek için belirtinunsafe-eval.
      • Gerekli çerçeve dışı betiklerinizin yüklenmesine izin vermek için ek karmaları belirtin.
    • Sunucu tarafı Blazor bir uygulamada, gerekli betiklerin yüklenmesine izin vermek için karmalar belirtin.
  • style-src: Stil sayfaları için geçerli kaynakları gösterir.
    • Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
    • Uygulama satır içi stiller kullanıyorsa, satır içi stillerinizin kullanımına izin vermek için belirtin unsafe-inline .
  • upgrade-insecure-requests: Güvenli olmayan (HTTP) kaynaklardan gelen içerik URL'lerinin HTTPS üzerinden güvenli bir şekilde alınması gerektiğini gösterir.
  • base-uri: Sayfanın etiketi için URL'leri <base> kısıtlar. Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
  • default-src: İlke tarafından açıkça belirtilmeyen kaynak yönergeleri için bir geri dönüş gösterir. Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
  • img-src: Görüntüler için geçerli kaynakları gösterir.
    • URL'lerden görüntülerin data: yüklenmesine izin vermek için belirtindata:.
    • HTTPS uç noktalarındaki görüntülerin yüklenmesine izin vermek için belirtin https: .
  • object-src: , <embed>ve <applet> etiketleri için <object>geçerli kaynakları gösterir. Tüm URL kaynaklarını önlemek için belirtin none .
  • script-src: Betikler için geçerli kaynakları gösterir.
    • Bootstrap betikleri https://stackpath.bootstrapcdn.com/ için konak kaynağını belirtin.
    • Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
    • İstemci tarafı Blazor uygulamasında:
      • İstemci tarafı Blazor Mono çalışma zamanının çalışmasına izin vermek için belirtinunsafe-eval.
      • Gerekli çerçeve dışı betiklerinizin yüklenmesine izin vermek için ek karmaları belirtin.
    • Sunucu tarafı Blazor bir uygulamada, gerekli betiklerin yüklenmesine izin vermek için karmalar belirtin.
  • style-src: Stil sayfaları için geçerli kaynakları gösterir.
    • https://stackpath.bootstrapcdn.com/ Bootstrap stil sayfaları için konak kaynağını belirtin.
    • Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
    • Satır içi stillerin kullanılmasına izin vermek için belirtin unsafe-inline .
  • upgrade-insecure-requests: Güvenli olmayan (HTTP) kaynaklardan gelen içerik URL'lerinin HTTPS üzerinden güvenli bir şekilde alınması gerektiğini gösterir.
  • base-uri: Sayfanın etiketi için URL'leri <base> kısıtlar. Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
  • default-src: İlke tarafından açıkça belirtilmeyen kaynak yönergeleri için bir geri dönüş gösterir. Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
  • img-src: Görüntüler için geçerli kaynakları gösterir.
    • URL'lerden görüntülerin data: yüklenmesine izin vermek için belirtindata:.
    • HTTPS uç noktalarındaki görüntülerin yüklenmesine izin vermek için belirtin https: .
  • object-src: , <embed>ve <applet> etiketleri için <object>geçerli kaynakları gösterir. Tüm URL kaynaklarını önlemek için belirtin none .
  • script-src: Betikler için geçerli kaynakları gösterir.
    • Bootstrap betikleri https://stackpath.bootstrapcdn.com/ için konak kaynağını belirtin.
    • Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
    • İstemci tarafı Blazor uygulamasında:
      • Gerekli betiklerin yüklenmesine izin vermek için karmaları belirtin.
      • Dizelerden kod oluşturmak için kullanılacak eval() ve yöntemlerini belirtinunsafe-eval.
    • Sunucu tarafı Blazor bir uygulamada, gerekli betiklerin yüklenmesine izin vermek için karmalar belirtin.
  • style-src: Stil sayfaları için geçerli kaynakları gösterir.
    • https://stackpath.bootstrapcdn.com/ Bootstrap stil sayfaları için konak kaynağını belirtin.
    • Şema ve bağlantı noktası numarası dahil olmak üzere uygulamanın kaynağının geçerli bir kaynak olduğunu belirtmek için belirtin self .
    • Satır içi stillerin kullanılmasına izin vermek için belirtin unsafe-inline . İlk istek sonrasında istemciyi ve sunucuyu yeniden bağlamak için kullanıcı arabirimi için satır içi bildirim gereklidir. Gelecek bir sürümde satır içi stil kaldırılabilir, böylece unsafe-inline artık gerekli değildir.
  • upgrade-insecure-requests: Güvenli olmayan (HTTP) kaynaklardan gelen içerik URL'lerinin HTTPS üzerinden güvenli bir şekilde alınması gerektiğini gösterir.

Yukarıdaki yönergeler Microsoft Internet Explorer dışındaki tüm tarayıcılar tarafından desteklenir.

Ek satır içi betikler için SHA karmalarını almak için:

  • İlkeyi uygula bölümünde gösterilen CSP'yi uygulayın.
  • Uygulamayı yerel olarak çalıştırırken tarayıcının geliştirici araçları konsoluna erişin. Bir CSP üst bilgisi veya meta etiketi mevcut olduğunda tarayıcı engellenen betikler için karmaları hesaplar ve görüntüler.
  • Tarayıcı tarafından sağlanan karmaları kaynaklara script-src kopyalayın. Her karmanın çevresinde tek tırnak işareti kullanın.

İçerik Güvenliği İlkesi Düzey 2 tarayıcı destek matrisi için bkz . Kullanabilir miyim: İçerik Güvenliği İlkesi Düzey 2.

İlkeyi uygulama

İlkeyi uygulamak için bir <meta> etiket kullanın:

  • özniteliğinin http-equiv değerini olarak Content-Security-Policyayarlayın.
  • yönergelerini content öznitelik değerine yerleştirin. Yönergeleri noktalı virgülle (; ) ayırın.
  • Etiketi her zaman içeriğe <head>yerleştirin.meta

Aşağıdaki bölümlerde örnek ilkeler gösterilmektedir. Bu örnekler, her sürümü için bu makaleyle birlikte verilmiştir Blazor. Sürümünüz için uygun bir sürüm kullanmak için, bu web sayfasında Sürüm açılan seçicisi olan belge sürümünü seçin.

Sunucu tarafı Blazor uygulamaları

İçerikte<head>, İlke yönergeleri bölümünde açıklanan yönergeleri uygulayın:

<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src 'self';
               style-src 'self';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src https://stackpath.bootstrapcdn.com/ 
                          'self';
               style-src https://stackpath.bootstrapcdn.com/
                         'self' 
                         'unsafe-inline';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src https://stackpath.bootstrapcdn.com/ 
                          'self' 
                          'sha256-34WLX60Tw3aG6hylk0plKbZZFXCuepeQ6Hu7OqRf8PI=';
               style-src https://stackpath.bootstrapcdn.com/
                         'self' 
                         'unsafe-inline';
               upgrade-insecure-requests;">

Uygulamanın gerektirdiği şekilde ek script-src ve style-src karmalar ekleyin. Geliştirme sırasında, karmaların sizin için hesaplanmış olması için çevrimiçi bir araç veya tarayıcı geliştirici araçları kullanın. Örneğin, aşağıdaki tarayıcı araçları konsol hatası, ilke kapsamında olmayan gerekli bir betiğin karması bildirir:

Şu İçerik Güvenliği İlkesi yönergesini ihlal ettiği için satır içi betik yürütülemedi: " ... ". Satır içi yürütmeyi etkinleştirmek için 'güvenli olmayan satır içi' anahtar sözcüğü, karma ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') veya bir nonce ('nonce-...') gereklidir.

Hatayla ilişkili belirli betik, konsolunda hatanın yanında görüntülenir.

İstemci tarafı Blazor uygulamaları

İçerikte<head>, İlke yönergeleri bölümünde açıklanan yönergeleri uygulayın:

<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src 'self'
                          'wasm-unsafe-eval';
               style-src 'self';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src 'self' 
                          'unsafe-eval';
               style-src 'self';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src 'self' 
                          'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=' 
                          'unsafe-eval';
               style-src 'self';
               upgrade-insecure-requests;">

Not

Karma, sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA= istemci tarafı Blazor uygulamalar için kullanılan satır içi betiği temsil eder. Bu, gelecekte kaldırılabilir.

<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src https://stackpath.bootstrapcdn.com/ 
                          'self' 
                          'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=' 
                          'unsafe-eval';
               style-src https://stackpath.bootstrapcdn.com/
                         'self'
                         'unsafe-inline';
               upgrade-insecure-requests;">
<meta http-equiv="Content-Security-Policy" 
      content="base-uri 'self';
               default-src 'self';
               img-src data: https:;
               object-src 'none';
               script-src https://stackpath.bootstrapcdn.com/ 
                          'self' 
                          'sha256-v8ZC9OgMhcnEQ/Me77/R9TlJfzOBqrMTW8e1KuqLaqc=' 
                          'sha256-If//FtbPc03afjLezvWHnC3Nbu4fDM04IIzkPaf3pH0=' 
                          'sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=' 
                          'unsafe-eval';
               style-src https://stackpath.bootstrapcdn.com/
                         'self'
                         'unsafe-inline';
               upgrade-insecure-requests;">

Uygulamanın gerektirdiği şekilde ek script-src ve style-src karmalar ekleyin. Geliştirme sırasında, karmaların sizin için hesaplanmış olması için çevrimiçi bir araç veya tarayıcı geliştirici araçları kullanın. Örneğin, aşağıdaki tarayıcı araçları konsol hatası, ilke kapsamında olmayan gerekli bir betiğin karması bildirir:

Şu İçerik Güvenliği İlkesi yönergesini ihlal ettiği için satır içi betik yürütülemedi: " ... ". Satır içi yürütmeyi etkinleştirmek için 'güvenli olmayan satır içi' anahtar sözcüğü, karma ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=') veya bir nonce ('nonce-...') gereklidir.

Hatayla ilişkili belirli betik, konsolunda hatanın yanında görüntülenir.

Ortam dışıDevelopment ortamlarda CSP uygulama

CsP bir Blazor uygulamanın <head> içeriğine uygulandığında Development ortamdaki yerel testlere müdahale eder. Örneğin, Tarayıcı Bağlantısı ve tarayıcı yenileme betiği yüklenemiyor. Aşağıdaki örneklerde CSP'nin <meta> etiketinin ortam dışıDevelopment ortamlarda nasıl uygulanacağı gösterilmektedir.

Not

Bu bölümdeki örneklerde CSP'lerin tam <meta> etiketi gösterilmez. Etiketlerin tamamı<meta>, bu makalenin önceki bölümlerindeki İlkeyi uygula bölümünün alt bölümlerinde bulunur.

Üç genel yaklaşım mevcuttur:

  • CSP'yi, csp'yi App uygulamanın tüm düzenlerine uygulayan bileşen aracılığıyla uygulayın.
  • CSP'leri uygulamanın farklı alanlarına( örneğin, yalnızca yönetici sayfaları için özel bir CSP) uygulamanız gerekiyorsa, etiketi kullanarak <HeadContent> CSP'leri düzen temelinde uygulayın. Tam etkililik için, her uygulama düzeni dosyası yaklaşımı benimsemelidir.
  • Barındırma hizmeti veya sunucusu, bir uygulamanın giden yanıtlarını ekleyen bir Content-Security-Policy üst bilgi aracılığıyla CSP sağlayabilir. Bu yaklaşım barındırma hizmetine veya sunucusuna göre farklılık gösterdiğinden, aşağıdaki örneklerde ele alınmıyor. Bu yaklaşımı benimsemek istiyorsanız barındırma hizmeti sağlayıcınızın veya sunucunuzun belgelerine bakın.

Blazor Web Uygulaması yaklaşımları

bileşenine App ()Components/App.razor öğesini ekleyin IHostEnvironment:

@inject IHostEnvironment Env

Bileşenin <head> içeriğindeApp, ortamda değilken CSP'yi Development uygulayın:

@if (!Env.IsDevelopment())
{
    <meta ...>
}

Alternatif olarak, aşağıdaki örnekte gösterildiği gibi CSP'leri klasördeki Components/Layout düzen temelinde uygulayın. Her düzenin bir CSP belirttiğine emin olun.

@inject IHostEnvironment Env

@if (!Env.IsDevelopment())
{
    <HeadContent>
        <meta ...>
    </HeadContent>
}

Blazor WebAssembly uygulama yaklaşımları

bileşenine App ()App.razor öğesini ekleyin IWebAssemblyHostEnvironment:

@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env

Bileşenin <head> içeriğindeApp, ortamda değilken CSP'yi Development uygulayın:

@if (!Env.IsDevelopment())
{
    <HeadContent>
        <meta ...>
    </HeadContent>
}

Alternatif olarak, önceki kodu kullanın ancak klasöre düzen temelinde CSP'ler Layout uygulayın. Her düzenin bir CSP belirttiğine emin olun.

Meta etiket sınırlamaları

Etiket <meta> ilkesi aşağıdaki yönergeleri desteklemez:

Önceki yönergeleri desteklemek için adlı Content-Security-Policybir üst bilgi kullanın. Yönerge dizesi üst bilginin değeridir.

İlkeyi test edin ve ihlal raporlarını alın

Test, ilk ilke oluşturulurken üçüncü taraf betiklerin yanlışlıkla engellenmediğini doğrulamaya yardımcı olur.

İlke yönergelerini zorlamadan bir ilkeyi belirli bir süre boyunca test etmek için, üst bilgi tabanlı bir ilkenin <meta> etiketinin http-equiv özniteliğini veya üst bilgi adını olarak Content-Security-Policy-Report-Onlyayarlayın. Hata raporları belirtilen URL'ye ON belgeleri olarak JSgönderilir. Daha fazla bilgi için bkz . MDN web belgeleri: Content-Security-Policy-Report-Only.

İlke etkinken ihlalleri raporlamak için aşağıdaki makalelere bakın:

Artık kullanılması önerilmese report-uri de, tüm ana tarayıcılar tarafından desteklenene kadar report-to her iki yönerge de kullanılmalıdır. desteği tarayıcılardan herhangi bir zamanda bırakıldığı için report-uri yalnızca kullanmayınreport-uri. Tam olarak desteklendiğinde report-to ilkelerinizde için report-uri desteği kaldırın. uygulamasının report-tobenimsenmesini izlemek için bkz . Şunu kullanabilir miyim: rapora.

Her sürümde bir uygulamanın ilkesini test edin ve güncelleştirin.

Sorun giderme

  • Hatalar tarayıcının geliştirici araçları konsolunda görünür. Tarayıcılar aşağıdakiler hakkında bilgi sağlar:
    • İlkeyle uyumlu olmayan öğeler.
    • İlkeyi engellenen bir öğeye izin verecek şekilde değiştirme.
  • İlke yalnızca istemcinin tarayıcısı tüm dahil edilen yönergeleri desteklediğinde tamamen etkilidir. Geçerli bir tarayıcı destek matrisi için bkz . Kullanabilir miyim: content-Security-Policy.

Ek kaynaklar