Ngăn chặn tập lệnh chéo trang web (XSS) trong Spring Boot bằng Chính sách bảo mật-nội dung (CSP)

Giới thiệu

Bảo mật của người dùng và dữ liệu cá nhân của họ khi sử dụng ứng dụng web là điều tối quan trọng. Mặc dù nguyên tắc hướng dẫn này đã được thừa nhận ngay từ những giai đoạn đầu của quá trình phát triển web - những kẻ xấu tìm ra sơ hở trong ứng dụng và có thể lợi dụng người dùng của bạn.

Nhiều cuộc tấn công "tiêu chuẩn" nổi tiếng và được ghi lại, và việc bảo vệ khỏi chúng không khó. Để nhà phát triển không phải tự thực hiện các phương pháp bảo mật, các khuôn khổ như Spring Boot đã loại bỏ các biện pháp bảo mật khác nhau và cho phép bạn chỉ cần áp dụng các bộ lọc bảo mật trong ứng dụng của mình để ngăn chặn các cuộc tấn công nổi tiếng.

Trong hướng dẫn ngắn này, chúng ta sẽ xem xét Cross-Site Scripting (XSS) là gì, cách ai đó có thể thực hiện cuộc tấn công này trên ứng dụng của riêng bạn và cách bạn có thể ngăn chặn nó dễ dàng với Spring Boot.

Cross-Site Scripting (XSS) là gì?

Cross-Site Scripting là một hình thức khai thác phổ biến, được lan truyền rộng rãi, trong đó kẻ xấu đưa một tập lệnh vào một ứng dụng web.

Thông thường, chính sách nguồn gốc giống nhau được áp dụng cho các ứng dụng web, chính sách này hạn chế các tập lệnh trong trang web truy cập dữ liệu từ các nguồn nếu nguồn gốc của chúng không khớp. Theo chính sách cùng nguồn gốc - nếu một trang từ trang web đáng tin cậy có thể truy cập dữ liệu giao tiếp với người dùng (chẳng hạn như cookie), các trang khác có cùng nguồn gốc cũng có thể làm như vậy. Hình thức kiểm soát truy cập này dường như đủ để bảo vệ tính toàn vẹn của dữ liệu trên các ứng dụng web vào thời điểm đó.

Cross-Site Scripting phá vỡ chính sách cùng nguồn gốc, bằng cách đưa một tập lệnh độc hại vào trang của một trang web đáng tin cậy. Vì tập lệnh được chạy từ một trang web đáng tin cậy, nên nó được thực thi như một tập lệnh đáng tin cậy. Không có cách nào rõ ràng để phân biệt giữa các tập lệnh độc hại và các tập lệnh không độc hại - vì vậy có thể thực thi mã tùy ý với Cross-Site Scripting. Điều này bao gồm mọi nơi, từ việc chèn các cảnh báo gây phiền nhiễu, đến các cuộc tấn công kỹ thuật xã hội, âm thầm thu thập thông tin người dùng hoặc chuyển hướng người dùng đến các trang lừa đảo có vẻ là một phần của các trang web đáng tin cậy.

nhiều các trang web dễ bị tấn công Cross-Site Scripting và nó vẫn là một kiểu tấn công phổ biến cho đến ngày nay, mặc dù kiểu khai thác này đã được biết đến từ những năm 90.

Ngăn chặn XSS trong ứng dụng khởi động mùa xuân bằng Chính sách bảo mật-nội dung (CSP)

Spring Boot rất coi trọng vấn đề bảo mật và mô-đun Bảo mật của Spring triển khai các phương pháp bảo mật linh hoạt và mạnh mẽ cho phép các nhà phát triển giảm thiểu lo lắng của họ khi nói đến bảo mật, đôi khi yêu cầu hiểu biết ở mức độ thấp về các nguyên tắc của cách các thông điệp được trao đổi trên web đăng kí.

Nói cách khác, Spring Boot triển khai một số tiêu đề bảo mật:

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 được bao gồm theo mặc định! Tiêu đề bảo mật này cố gắng phát hiện XSS cố gắng và chặn chúng. Tuy nhiên, đây không phải là một quy trình chống lỗi và các trình duyệt có các cách triển khai khác nhau của trình phát hiện. Một số trình duyệt, như Chrome, thậm chí có đã xóa Trình kiểm tra XSS của họ. Ngoài ra, tính năng phát hiện tự động hoạt động cho Các cuộc tấn công XSS được phản ánh, trong khi các kiểu tấn công khác cũng tồn tại.

Một giải pháp thay thế hiện đại hơn cho X-XSS-Protection là Chính sách Bảo mật-Nội dung (CSP), chủ yếu giải quyết các chính sách mà tài nguyên có thể được tải, từ nguồn gốc và tại điểm cuối nào. Kể từ năm 2022, CSP là biện pháp ngăn chặn tốt nhất chống lại XSS, Clickjacking và các loại tấn công khác. Không phải tất cả các trình duyệt đều triển khai CSP, đó là lý do tại sao nó không được bao gồm trong các tiêu đề bảo mật theo mặc định.

Lưu ý: Ngay cả khi có CSP, đó luôn là cách hành động tốt nhất để xác thực bất kì đầu vào của người dùng và đảm bảo rằng quá trình xử lý bằng hệ thống của bạn an toàn, để ngăn chặn việc nhập mã.

Trong Spring Boot - để định cấu hình các biện pháp bảo mật web tùy chỉnh, bạn thường sẽ mở rộng WebSecurityConfigurerAdapter lớp và ghi đè lên configure() phương pháp:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

Nơi chỉ thị chính sách bảo mật nội dung (được cung cấp dưới dạng ;-separated string) tùy thuộc vào trường hợp sử dụng của bạn và nguồn nào bạn muốn tin cậy:

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

Ví dụ: một ứng dụng web có thể liệt kê các trang web đáng tin cậy mà từ đó các tập lệnh có thể được tải bằng:

script-src https://trusted.com;

Hoặc bạn có thể bỏ qua việc tin tưởng bất kỳ trang web của bên thứ ba nào:

script-src self;

Tương tự, một ứng dụng có thể tin cậy các plugin:

object-src https://trusted.com

Có rất nhiều chỉ thị mà bạn có thể cung cấp, bao gồm:

  • default-src - Dự phòng mặc định
  • child-src - Nguồn nhân viên web hợp lệ
  • frame-src - Nguồn hợp lệ cho s và s
  • img-src - Nguồn hợp lệ cho hình ảnh
  • media-src - Nguồn hợp lệ cho , thẻ
  • script-src - Nguồn tập lệnh hợp lệ (giúp ngăn chặn XSS)
  • style-src - Nguồn hợp lệ cho các yếu tố
  • base-uri - Hạn chế các tài nguyên có thể truy cập từ thành phần
  • frame-ancestors - Cha mẹ hợp lệ của , , , v.v. các yếu tố
  • và vv

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Ví dụ: đây là một tập hợp các chỉ thị chính sách an toàn:

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;

Hãy thêm chúng vào ứng dụng Spring Boot của chúng tôi:

@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;");
    }
}

Bạn có thể sử dụng CSP-Người đánh giá để đánh giá xem các chỉ thị CSP của bạn có hợp lệ hay không an toàn và nó sẽ chỉ ra những chỉ thị nào có thể dễ dàng khai thác. Đây là chỉ thị CSP cho phép các API của Google:

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'

Kết luận

Trong hướng dẫn ngắn này, chúng tôi đã xem xét Cross-Site Scripting (XSS) là gì và cách nó hoạt động ở cấp độ toàn diện. Sau đó, chúng tôi đã khám phá một số biện pháp ngăn chặn XSS có thể dễ dàng thực hiện với Spring Boot để làm cho các ứng dụng của bạn an toàn và thiết lập Chính sách Bảo mật-Nội dung (CSP).

Cuối cùng, chúng tôi đã khám phá các chỉ thị CSP và xem xét một số chính sách an toàn khác nhau.

Dấu thời gian:

Thêm từ xếp chồng lên nhau