Menerapkan Kebijakan Keamanan Konten untuk ASP.NET Core Blazor
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Artikel ini menjelaskan cara menggunakan Kebijakan Keamanan Konten (CSP) dengan aplikasi ASP.NET Core Blazor untuk membantu melindungi dari serangan Scripting Lintas Situs (XSS ).
Cross-Site Scripting (XSS) adalah kerentanan keamanan di mana cyberattacker menempatkan satu atau beberapa skrip sisi klien berbahaya ke dalam konten yang dirender aplikasi. CSP membantu melindungi dari serangan XSS dengan menginformasikan browser yang valid:
- Sumber untuk konten yang dimuat, termasuk skrip, lembar gaya, gambar, dan plugin.
- Tindakan yang diambil oleh halaman, menentukan target URL formulir yang diizinkan.
Untuk menerapkan CSP ke aplikasi, pengembang menentukan beberapa arahan keamanan konten CSP di satu atau beberapa Content-Security-Policy
header atau <meta>
tag. Untuk panduan tentang menerapkan CSP ke aplikasi dalam kode C# saat startup, lihat startup ASP.NET CoreBlazor.
Kebijakan dievaluasi oleh browser saat halaman dimuat. Browser memeriksa sumber halaman dan menentukan apakah mereka memenuhi persyaratan arahan keamanan konten. Saat arahan kebijakan tidak terpenuhi untuk sumber daya, browser tidak memuat sumber daya. Misalnya, pertimbangkan kebijakan yang tidak mengizinkan skrip pihak ketiga. Saat halaman berisi <script>
tag dengan asal pihak ketiga di src
atribut , browser mencegah skrip dimuat.
CSP didukung di sebagian besar browser desktop dan seluler modern, termasuk Chrome, Edge, Firefox, Opera, dan Safari. CSP direkomendasikan untuk Blazor aplikasi.
Arahan kebijakan
Minimal, tentukan arahan dan sumber berikut untuk Blazor aplikasi. Tambahkan direktif dan sumber tambahan sesuai kebutuhan. Arahan berikut digunakan di bagian Terapkan kebijakan di artikel ini, di mana contoh kebijakan keamanan untuk Blazor aplikasi disediakan:
- base-uri: Membatasi URL untuk tag halaman
<base>
. Tentukanself
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - default-src: Menunjukkan fallback untuk arahan sumber yang tidak ditentukan secara eksplisit oleh kebijakan. Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - img-src: Menunjukkan sumber yang valid untuk gambar.
- Tentukan
data:
untuk mengizinkan pemuatan gambar daridata:
URL. - Tentukan
https:
untuk mengizinkan pemuatan gambar dari titik akhir HTTPS.
- Tentukan
- object-src: Menunjukkan sumber yang valid untuk
<object>
tag , ,<embed>
dan<applet>
. Tentukannone
untuk mencegah semua sumber URL. - script-src: Menunjukkan sumber yang valid untuk skrip.
- Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - Di aplikasi sisi Blazor klien:
- Tentukan
wasm-unsafe-eval
untuk mengizinkan runtime Mono sisi Blazor klien berfungsi. - Tentukan hash tambahan untuk mengizinkan skrip non-kerangka kerja yang diperlukan untuk dimuat.
- Tentukan
- Di aplikasi sisi Blazor server, tentukan hash untuk mengizinkan skrip yang diperlukan untuk dimuat.
- Tentukan
- style-src: Menunjukkan sumber yang valid untuk lembar gaya.
- Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - Jika aplikasi menggunakan gaya sebaris, tentukan
unsafe-inline
untuk mengizinkan penggunaan gaya sebaris Anda.
- Tentukan
- upgrade-insecure-requests: Menunjukkan bahwa URL konten dari sumber yang tidak aman (HTTP) harus diperoleh dengan aman melalui HTTPS.
- base-uri: Membatasi URL untuk tag halaman
<base>
. Tentukanself
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - default-src: Menunjukkan fallback untuk arahan sumber yang tidak ditentukan secara eksplisit oleh kebijakan. Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - img-src: Menunjukkan sumber yang valid untuk gambar.
- Tentukan
data:
untuk mengizinkan pemuatan gambar daridata:
URL. - Tentukan
https:
untuk mengizinkan pemuatan gambar dari titik akhir HTTPS.
- Tentukan
- object-src: Menunjukkan sumber yang valid untuk
<object>
tag , ,<embed>
dan<applet>
. Tentukannone
untuk mencegah semua sumber URL. - script-src: Menunjukkan sumber yang valid untuk skrip.
- Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - Di aplikasi sisi Blazor klien:
- Tentukan
unsafe-eval
untuk mengizinkan runtime Mono sisi Blazor klien berfungsi. - Tentukan hash tambahan untuk mengizinkan skrip non-kerangka kerja yang diperlukan untuk dimuat.
- Tentukan
- Di aplikasi sisi Blazor server, tentukan hash untuk mengizinkan skrip yang diperlukan untuk dimuat.
- Tentukan
- style-src: Menunjukkan sumber yang valid untuk lembar gaya.
- Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - Jika aplikasi menggunakan gaya sebaris, tentukan
unsafe-inline
untuk mengizinkan penggunaan gaya sebaris Anda.
- Tentukan
- upgrade-insecure-requests: Menunjukkan bahwa URL konten dari sumber yang tidak aman (HTTP) harus diperoleh dengan aman melalui HTTPS.
- base-uri: Membatasi URL untuk tag halaman
<base>
. Tentukanself
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - default-src: Menunjukkan fallback untuk arahan sumber yang tidak ditentukan secara eksplisit oleh kebijakan. Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - img-src: Menunjukkan sumber yang valid untuk gambar.
- Tentukan
data:
untuk mengizinkan pemuatan gambar daridata:
URL. - Tentukan
https:
untuk mengizinkan pemuatan gambar dari titik akhir HTTPS.
- Tentukan
- object-src: Menunjukkan sumber yang valid untuk
<object>
tag , ,<embed>
dan<applet>
. Tentukannone
untuk mencegah semua sumber URL. - script-src: Menunjukkan sumber yang valid untuk skrip.
- Tentukan
https://stackpath.bootstrapcdn.com/
sumber host untuk skrip Bootstrap. - Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - Di aplikasi sisi Blazor klien:
- Tentukan
unsafe-eval
untuk mengizinkan runtime Mono sisi Blazor klien berfungsi. - Tentukan hash tambahan untuk mengizinkan skrip non-kerangka kerja yang diperlukan untuk dimuat.
- Tentukan
- Di aplikasi sisi Blazor server, tentukan hash untuk mengizinkan skrip yang diperlukan untuk dimuat.
- Tentukan
- style-src: Menunjukkan sumber yang valid untuk lembar gaya.
- Tentukan
https://stackpath.bootstrapcdn.com/
sumber host untuk lembar gaya Bootstrap. - Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - Tentukan
unsafe-inline
untuk memperbolehkan penggunaan gaya sebaris.
- Tentukan
- upgrade-insecure-requests: Menunjukkan bahwa URL konten dari sumber yang tidak aman (HTTP) harus diperoleh dengan aman melalui HTTPS.
- base-uri: Membatasi URL untuk tag halaman
<base>
. Tentukanself
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - default-src: Menunjukkan fallback untuk arahan sumber yang tidak ditentukan secara eksplisit oleh kebijakan. Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - img-src: Menunjukkan sumber yang valid untuk gambar.
- Tentukan
data:
untuk mengizinkan pemuatan gambar daridata:
URL. - Tentukan
https:
untuk mengizinkan pemuatan gambar dari titik akhir HTTPS.
- Tentukan
- object-src: Menunjukkan sumber yang valid untuk
<object>
tag , ,<embed>
dan<applet>
. Tentukannone
untuk mencegah semua sumber URL. - script-src: Menunjukkan sumber yang valid untuk skrip.
- Tentukan
https://stackpath.bootstrapcdn.com/
sumber host untuk skrip Bootstrap. - Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - Di aplikasi sisi Blazor klien:
- Tentukan hash untuk mengizinkan skrip yang diperlukan untuk dimuat.
- Tentukan
unsafe-eval
untuk menggunakaneval()
metode dan untuk membuat kode dari string.
- Di aplikasi sisi Blazor server, tentukan hash untuk mengizinkan skrip yang diperlukan untuk dimuat.
- Tentukan
- style-src: Menunjukkan sumber yang valid untuk lembar gaya.
- Tentukan
https://stackpath.bootstrapcdn.com/
sumber host untuk lembar gaya Bootstrap. - Tentukan
self
untuk menunjukkan bahwa asal aplikasi, termasuk skema dan nomor port, adalah sumber yang valid. - Tentukan
unsafe-inline
untuk memperbolehkan penggunaan gaya sebaris. Deklarasi sebaris diperlukan untuk UI untuk menyambungkan kembali klien dan server setelah permintaan awal. Dalam rilis mendatang, gaya sebaris mungkin dihapus sehinggaunsafe-inline
tidak lagi diperlukan.
- Tentukan
- upgrade-insecure-requests: Menunjukkan bahwa URL konten dari sumber yang tidak aman (HTTP) harus diperoleh dengan aman melalui HTTPS.
Arahan sebelumnya didukung oleh semua browser kecuali Microsoft Internet Explorer.
Untuk mendapatkan hash SHA untuk skrip sebaris tambahan:
- Terapkan CSP yang diperlihatkan di bagian Terapkan kebijakan .
- Akses konsol alat pengembang browser saat menjalankan aplikasi secara lokal. Browser menghitung dan menampilkan hash untuk skrip yang diblokir saat header atau
meta
tag CSP ada. - Salin hash yang disediakan oleh browser ke
script-src
sumber. Gunakan tanda kutip tunggal di sekitar setiap hash.
Untuk matriks dukungan browser Kebijakan Keamanan Konten Tingkat 2, lihat Dapatkah saya menggunakan: Kebijakan Keamanan Konten Tingkat 2.
Menerapkan kebijakan
<meta>
Gunakan tag untuk menerapkan kebijakan:
- Atur nilai atribut ke
http-equiv
Content-Security-Policy
. - Tempatkan arahan dalam
content
nilai atribut. Pisahkan arahan dengan titik koma (;
). - Selalu tempatkan
meta
tag dalam<head>
konten.
Bagian berikut menunjukkan contoh kebijakan. Contoh ini diberi versi dengan artikel ini untuk setiap rilis Blazor. Untuk menggunakan versi yang sesuai untuk rilis Anda, pilih versi dokumen dengan pemilih dropdown Versi di halaman web ini.
Aplikasi sisi Blazor server
<head>
Dalam konten, terapkan arahan yang dijelaskan di bagian Arahan kebijakan:
<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;">
Tambahkan hash tambahan script-src
seperti style-src
yang diperlukan oleh aplikasi. Selama pengembangan, gunakan alat online atau alat pengembang browser untuk menghitung hash untuk Anda. Misalnya, kesalahan konsol alat browser berikut melaporkan hash untuk skrip yang diperlukan yang tidak dicakup oleh kebijakan:
Menolak untuk menjalankan skrip sebaris karena melanggar arahan Kebijakan Keamanan Konten berikut: " ... ". Baik kata kunci 'unsafe-inline', hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA='), atau nonce ('nonce-...') diperlukan untuk mengaktifkan eksekusi sebaris.
Skrip tertentu yang terkait dengan kesalahan ditampilkan di konsol di samping kesalahan.
Aplikasi sisi Blazor klien
<head>
Dalam konten, terapkan arahan yang dijelaskan di bagian Arahan kebijakan:
<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;">
Catatan
Hash sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA=
mewakili skrip sebaris yang digunakan untuk aplikasi sisi Blazor klien. Ini dapat dihapus di masa mendatang.
<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;">
Tambahkan hash tambahan script-src
seperti style-src
yang diperlukan oleh aplikasi. Selama pengembangan, gunakan alat online atau alat pengembang browser untuk menghitung hash untuk Anda. Misalnya, kesalahan konsol alat browser berikut melaporkan hash untuk skrip yang diperlukan yang tidak dicakup oleh kebijakan:
Menolak untuk menjalankan skrip sebaris karena melanggar arahan Kebijakan Keamanan Konten berikut: " ... ". Baik kata kunci 'unsafe-inline', hash ('sha256-v8v3RKRPmN4odZ1CWM5gw80QKPCCWMcpNeOmimNL2AA='), atau nonce ('nonce-...') diperlukan untuk mengaktifkan eksekusi sebaris.
Skrip tertentu yang terkait dengan kesalahan ditampilkan di konsol di samping kesalahan.
Menerapkan CSP di non-lingkunganDevelopment
Saat CSP diterapkan ke Blazor konten aplikasi <head>
, CSP mengganggu pengujian lokal di Development
lingkungan. Misalnya, Tautan Browser dan skrip refresh browser gagal dimuat. Contoh berikut menunjukkan cara menerapkan tag CSP <meta>
di non-lingkunganDevelopment
.
Catatan
Contoh di bagian ini tidak menampilkan tag lengkap <meta>
untuk CSP. Tag lengkap <meta>
ditemukan di subbagian bagian Terapkan kebijakan sebelumnya di artikel ini.
Tiga pendekatan umum tersedia:
- Terapkan CSP melalui
App
komponen, yang menerapkan CSP ke semua tata letak aplikasi. - Jika Anda perlu menerapkan CSP ke area aplikasi yang berbeda, misalnya CSP kustom hanya untuk halaman admin, terapkan CSP berdasarkan per tata letak menggunakan
<HeadContent>
tag. Untuk efektivitas lengkap, setiap file tata letak aplikasi harus mengadopsi pendekatan. - Layanan atau server hosting dapat menyediakan CSP melalui header yang
Content-Security-Policy
menambahkan respons keluar aplikasi. Karena pendekatan ini bervariasi menurut layanan hosting atau server, pendekatan tersebut tidak dibahas dalam contoh berikut. Jika Anda ingin mengadopsi pendekatan ini, lihat dokumentasi untuk penyedia layanan hosting atau server Anda.
Blazor Web App Pendekatan
App
Dalam komponen (Components/App.razor
), injeksi IHostEnvironment:
@inject IHostEnvironment Env
App
Dalam konten komponen<head>
, terapkan CSP saat tidak berada di Development
lingkungan:
@if (!Env.IsDevelopment())
{
<meta ...>
}
Atau, terapkan CSP berdasarkan per tata letak di Components/Layout
folder, seperti yang ditunjukkan contoh berikut. Pastikan bahwa setiap tata letak menentukan CSP.
@inject IHostEnvironment Env
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Blazor WebAssembly pendekatan aplikasi
App
Dalam komponen (App.razor
), injeksi IWebAssemblyHostEnvironment:
@using Microsoft.AspNetCore.Components.WebAssembly.Hosting
@inject IWebAssemblyHostEnvironment Env
App
Dalam konten komponen<head>
, terapkan CSP saat tidak berada di Development
lingkungan:
@if (!Env.IsDevelopment())
{
<HeadContent>
<meta ...>
</HeadContent>
}
Atau, gunakan kode sebelumnya tetapi terapkan CSP berdasarkan per tata letak di Layout
folder. Pastikan bahwa setiap tata letak menentukan CSP.
Batasan tag meta
Kebijakan <meta>
tag tidak mendukung arahan berikut:
Untuk mendukung arahan sebelumnya, gunakan header bernama Content-Security-Policy
. String direktif adalah nilai header.
Menguji kebijakan dan menerima laporan pelanggaran
Pengujian membantu mengonfirmasi bahwa skrip pihak ketiga tidak diblokir secara tidak sengaja saat membangun kebijakan awal.
Untuk menguji kebijakan selama jangka waktu tertentu tanpa memberlakukan arahan kebijakan, atur <meta>
atribut tag http-equiv
atau nama header kebijakan berbasis header ke Content-Security-Policy-Report-Only
. Laporan kegagalan dikirim sebagai dokumen JSON ke URL tertentu. Untuk informasi selengkapnya, lihat dokumen web MDN: Content-Security-Policy-Report-Only.
Untuk pelaporan pelanggaran saat kebijakan aktif, lihat artikel berikut ini:
Meskipun report-uri
tidak lagi direkomendasikan untuk digunakan, kedua arahan harus digunakan sampai report-to
didukung oleh semua browser utama. Jangan gunakan report-uri
secara eksklusif karena dukungan untuk report-uri
dapat dihilangkan kapan saja dari browser. Hapus dukungan untuk report-uri
dalam kebijakan Anda saat report-to
didukung sepenuhnya. Untuk melacak adopsi report-to
, lihat Dapatkah saya menggunakan: report-to.
Uji dan perbarui kebijakan aplikasi setiap rilis.
Pecahkan masalah
- Kesalahan muncul di konsol alat pengembang browser. Browser menyediakan informasi tentang:
- Elemen yang tidak mematuhi kebijakan.
- Cara mengubah kebijakan untuk memungkinkan item yang diblokir.
- Kebijakan hanya sepenuhnya efektif ketika browser klien mendukung semua arahan yang disertakan. Untuk matriks dukungan browser saat ini, lihat Dapatkah saya menggunakan: Content-Security-Policy.
Sumber Daya Tambahan:
ASP.NET Core