Vệ sinh mã JavaScript
nhập * dưới dạng vệ sinh từ 'sanitize-html'; . vệ sinh. IOptions = { allowTags. vệ sinh. mặc định. cho phépTags. concat('h1', 'h2', 'img'), allowAttributes. { 'một'. vệ sinh. mặc định. allowAttributes['a']. concat('rel'), 'img'. ['src', 'height', 'width', 'alt'] }, transformTags. { 'một'. vệ sinh. SimpleTransform('a', { 'rel'. 'nofollow' }), 'img'. (tên thẻ. chuỗi, thuộc tính. vệ sinh. Thuộc tính) => { let img = { tagName, attribs }; . attribs['alt'] = 'đã biến đổi' ; . chức năng (khung. vệ sinh. iFrame) { khung trả lại. thẻ === 'a' &&. khung. chữ. cắt (); Trong vài ngày qua, chúng tôi đã xem xét cách hoạt động của các cuộc tấn công tập lệnh chéo trang và cách đưa văn bản thuần túy hoặc chuỗi HTML được mã hóa vào có thể giúp bạn an toàn hơn. Chúng tôi cũng đã xem xét một số nhược điểm của cả hai kỹ thuật đó Show
Hôm nay, chúng ta sẽ xem xét một cách tiếp cận cuối cùng. vệ sinh. Nào cùng đào vào bên trong Vệ sinh là gì?Sanitizing là quá trình xóa bất kỳ thuộc tính, thuộc tính và giá trị nào không có trong danh sách cho phép hoặc bị cấm rõ ràng trong danh sách không cho phép Ví dụ: nếu HTML được hiển thị từ chuỗi HTML của chúng tôi trông như thế này…
Phiên bản vệ sinh có thể trông như thế này
Khi được thêm vào giao diện người dùng, một số mục có thể bị hỏng nhưng nội dung độc hại sẽ không được hiển thị Cách vệ sinh chuỗi HTML bằng vanilla JSPhương thức 5 chuyển đổi một chuỗi HTML thành HTML thực mà không hiển thị nó trong DOM thực. Kết quả là, mọi mã độc hại sẽ không được thực thi (và sẽ không được thực thi cho đến khi các phần tử HTML đó được đưa vào giao diện người dùng)
Các thư viện Sanitizer sử dụng phương pháp 5 để tạo các phần tử HTML từ chuỗi HTML của bạn, sau đó lặp qua từng phần tử và xóa mọi thuộc tính, thuộc tính và giá trị không có trong danh sách cho phép hoặc bị cấm rõ ràng trong danh sách không cho phépBạn có thể chuyển toàn bộ chuỗi HTML của mình vào một thư viện khử trùng và nó sẽ trả về một chuỗi đã khử trùng mà bạn có thể sử dụng với thuộc tính chuỗi HTML hoặc các phần tử đã khử trùng mà bạn có thể đưa vào DOM bằng một phương thức như 7DOMPurify là một thư viện đầu ngành sử dụng danh sách cho phép và có khả năng cấu hình cao Tôi khuyên bạn nên nó. Nhưng hôm nay, chúng ta cũng sẽ xem xét cách xây dựng phiên bản ít cấu hình hơn của riêng mình Tạo một thư viện vệ sinhTrước tiên, hãy tạo một hàm bao bọc cho thư viện của chúng ta có tên là 8. Chúng tôi sẽ chấp nhận chuỗi để khử trùng làm đối sốChúng tôi có thể trả về một chuỗi đã được khử trùng HOẶC chính các nút đã được khử trùng. Hãy cung cấp cho người dùng khả năng quyết định cái họ muốn bằng đối số thứ hai, 9. Nếu 0, chúng tôi sẽ trả về các nút thay vì một chuỗi
Điều đầu tiên chúng tôi muốn làm là chuyển đổi HTML 1 của chúng tôi thành các nút HTML thực tếHãy tạo một hàm trợ giúp, 2, để làm điều đó cho chúng ta. Trong đó, chúng ta sẽ sử dụng phương thức khởi tạo 3 và phương thức 4, đồng thời trả về 5. Nếu một phần tử không tồn tại vì lý do nào đó, chúng tôi sẽ trả về một phần tử 6 mới để thay thếChúng tôi sẽ chạy nó ngay lập tức và gán giá trị trả về cho biến 7
Bây giờ, chúng tôi đã sẵn sàng để vệ sinh nó Loại bỏ các phần tử let parser = new DOMParser(); let doc = parser.parseFromString(``, 'text/html'); // doc.body is a real HTML element with the malicious image // No alert is thrown, though, because the elements exist outside the DOM console.log(doc.body); 8Đầu tiên, chúng tôi muốn xóa tất cả các phần tử 8 khỏi HTML của chúng tôi. Hãy tạo một hàm 0 chấp nhận nút 7 làm đối sốChúng ta sẽ sử dụng phương pháp 2 để tìm tất cả các phần tử của 8. Sau đó, chúng tôi sẽ sử dụng vòng lặp 4 để lặp qua từng vòng lặp và sử dụng phương thức 5 để xóa vòng lặp đó khỏi DOM
Loại bỏ các thuộc tính độc hạiBây giờ, chúng tôi đã sẵn sàng xóa các thuộc tính độc hại khỏi 7 của mìnhHãy tạo một hàm 8 chấp nhận phần tử 7 làm tham số. Trong đó, chúng ta sẽ sử dụng thuộc tính 0 để lấy tất cả các phần tử con trong một phần tửChúng ta có thể sử dụng vòng lặp 4 để lặp qua từng cái. Chúng tôi sẽ chuyển nó vào hàm 2 để xóa mọi thuộc tính độc hạiNếu bản thân 3 có các phần tử con, chúng tôi cũng muốn khử trùng các phần tử đó. Chúng ta sẽ chuyển đệ quy hàm 3 vào hàm 8
Trong hàm 2, chúng ta sẽ lấy tất cả các thuộc tính của một phần tử với thuộc tính 7Chúng ta sẽ lặp qua từng cái bằng một vòng lặp 4, sử dụng tính năng phá hủy đối tượng để lấy 9 và
|