Cegah Cross-Site Scripting (XSS) di Spring Boot dengan Kebijakan Keamanan Konten (CSP)

Pengantar

Keamanan pengguna dan data pribadi mereka saat menggunakan aplikasi web adalah yang terpenting. Meskipun prinsip panduan ini telah diakui bahkan dari tahap awal pengembangan web – aktor jahat menemukan celah dalam aplikasi, dan dapat mengeksploitasi pengguna Anda.

Banyak serangan "standar" yang terkenal dan didokumentasikan, dan perlindungan dari mereka tidak sulit. Untuk membebaskan pengembang dari penerapan praktik keamanan itu sendiri, kerangka kerja seperti Spring Boot telah mengabstraksikan berbagai langkah keamanan dan memungkinkan Anda untuk menerapkan filter keamanan dalam aplikasi Anda untuk mencegah serangan terkenal.

Dalam panduan singkat ini, kita akan melihat apa itu Cross-Site Scripting (XSS), bagaimana seseorang dapat melakukan serangan ini pada aplikasi Anda sendiri, dan bagaimana Anda dapat mencegahnya dengan mudah dengan Spring Boot.

Apa itu Cross-Site Scripting (XSS)?

Cross-Site Scripting adalah eksploitasi yang terkenal dan tersebar luas, di mana aktor jahat menyuntikkan skrip ke dalam aplikasi web.

Biasanya, kebijakan asal yang sama diterapkan ke aplikasi web, yang membatasi skrip di halaman web untuk mengakses data dari sumber jika asalnya tidak cocok. Di bawah kebijakan asal yang sama – jika halaman dari a situs web tepercaya dapat mengakses data yang berinteraksi dengan pengguna (seperti cookie, misalnya), halaman lain dari asal yang sama juga dapat melakukannya. Bentuk kontrol akses ini tampaknya cukup untuk melindungi integritas data pada aplikasi web pada saat itu.

Skrip Lintas Situs menghindari kebijakan asal yang sama, dengan menyuntikkan skrip berbahaya ke halaman situs web tepercaya. Karena skrip dijalankan dari situs web tepercaya, skrip dijalankan sebagai skrip tepercaya. Tidak ada cara yang jelas untuk membedakan antara skrip berbahaya dan skrip tidak berbahaya – jadi eksekusi kode arbitrer dapat dilakukan dengan Cross-Site Scripting. Mulai dari menyisipkan peringatan yang mengganggu, hingga serangan rekayasa sosial, mengumpulkan informasi pengguna secara diam-diam, atau mengarahkan pengguna ke halaman phishing yang tampaknya merupakan bagian dari situs web tepercaya.

Banyak situs web rentan terhadap serangan Cross-Site Scripting, dan tetap menjadi serangan umum hingga saat ini, meskipun jenis eksploitasi ini telah dikenal sejak tahun 90-an.

Mencegah XSS dalam Aplikasi Boot Musim Semi dengan Kebijakan Keamanan Konten (CSP)

Spring Boot memperhatikan keamanan dengan serius, dan modul Spring's Security menerapkan praktik keamanan yang fleksibel dan kuat yang memungkinkan pengembang meminimalkan kekhawatiran mereka dalam hal keamanan, yang seringkali membutuhkan pemahaman tingkat rendah tentang prinsip-prinsip cara pesan dipertukarkan di web aplikasi.

Secara defauly, Spring Boot mengimplementasikan beberapa header keamanan:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

X-XSS-Protection disertakan secara default! Header keamanan ini mencoba untuk menemukan XSS mencoba, dan memblokirnya. Ini bukan proses anti gagal, dan browser memiliki implementasi detektor yang berbeda. Beberapa browser, seperti Chrome, bahkan menghapus Auditor XSS mereka. Selain itu, deteksi otomatis berfungsi untuk Serangan XSS Tercermin, sementara jenis serangan lainnya juga ada.

Alternatif yang lebih modern untuk X-XSS-Protection adalah Kebijakan Keamanan Konten (CSP), yang terutama berhubungan dengan kebijakan di mana sumber daya dapat dimuat, dari mana asalnya, dan di titik akhir mana. Pada 2022, CSP adalah tindakan pencegahan terbaik terhadap XSS, Clickjacking, dan jenis serangan lainnya. Tidak semua browser mengimplementasikan CSP, itulah sebabnya CSP tidak disertakan dalam header keamanan secara default.

Catatan: Bahkan dengan CSP di tempat, itu selalu merupakan tindakan terbaik untuk memvalidasi Apa pun masukan pengguna dan pastikan aman untuk diproses menggunakan sistem Anda, untuk mencegah injeksi kode.

Di Spring Boot – untuk mengonfigurasi tindakan keamanan web khusus, Anda biasanya akan memperpanjang WebSecurityConfigurerAdapter kelas, dan menimpa configure() Metode:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
	.headers()
		.contentSecurityPolicy("csp-directives");
    }
}

Di mana arahan kebijakan keamanan konten (disediakan sebagai ;-separated string) bergantung pada kasus penggunaan Anda dan sumber mana yang ingin Anda percayai:

Content-Security Policy: directive1; directive2; directive3; ... directiveN;

Misalnya, aplikasi web dapat mencantumkan situs web tepercaya tempat skrip dapat dimuat:

script-src https://trusted.com;

Atau Anda dapat melewatkan mempercayai situs web pihak ketiga mana pun:

script-src self;

Demikian pula, aplikasi dapat mempercayai plugin:

object-src https://trusted.com

Ada berbagai macam arahan yang dapat Anda berikan, termasuk:

  • default-src – Pengunduran default
  • child-src – Sumber pekerja web yang valid
  • frame-src – Sumber yang valid untuk s dan s
  • img-src – Sumber yang valid untuk gambar
  • media-src – Sumber yang valid untuk , dan tag
  • script-src – Sumber skrip yang valid (membantu mencegah XSS)
  • style-src – Sumber yang valid untuk elemen
  • base-uri – Membatasi sumber daya yang dapat diakses dari elemen
  • frame-ancestors – Orang tua yang sah dari , , , dll. elemen
  • dan sebagainya

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

Misalnya, berikut adalah kumpulan arahan kebijakan yang aman:

script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:;
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
report-uri https://csp.example.com;

Mari tambahkan ini ke aplikasi Spring Boot kami:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
	.headers()
		.contentSecurityPolicy("script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:; object-src 'none'; base-uri 'none'; require-trusted-types-for 'script'; report-uri https://csp.example.com;");
    }
}

Anda dapat menggunakan CSP-Evaluator untuk mengevaluasi apakah arahan CSP Anda valid dan aman, dan itu akan menunjukkan arahan mana yang mudah dieksploitasi. Berikut adalah arahan CSP yang memungkinkan Google API:

default-src 'self';
object-src 'none';
frame-src 'self' data:; 
script-src 'self' 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' https://storage.googleapis.com; 
style-src 'self' 'unsafe-inline'; 
img-src 'self' data:; 
font-src 'self' data:;
base-uri 'self'

Kesimpulan

Dalam panduan singkat ini, kita telah melihat apa itu Cross-Site Scripting (XSS), dan cara kerjanya pada tingkat holistik. Kemudian, kami telah menjelajahi beberapa tindakan pencegahan XSS yang dapat dengan mudah diterapkan dengan Spring Boot untuk membuat aplikasi Anda aman, dan menetapkan Kebijakan Keamanan Konten (CSP).

Terakhir, kami telah menjelajahi arahan CSP dan melihat beberapa kebijakan aman yang berbeda.

Stempel Waktu:

Lebih dari penyalahgunaan