Cách ngăn chặn việc tạo kịch bản trang chéo trong Node.js

Cross-site scripting (XSS) là một kiểu khai thác bảo mật cho phép những kẻ tấn công đưa các tập lệnh độc hại vào các trang web bằng cách sử dụng mã máy khách. Nó gây ra một mối đe dọa đáng kể vì những kẻ tấn công có thể sử dụng nó để mạo danh người dùng, giành quyền truy cập vào dữ liệu nhạy cảm hoặc thậm chí thay đổi nội dung trang của trang web.
Nguy hiểm đến mức năm 2021, nó đứng thứ hai trong danh sách 25 điểm yếu nguy hiểm nhất. Điều này có nghĩa là nếu bạn đang tạo trang web, bạn phải biết về kịch bản trang web chéo và cách ngăn chặn nó.
Mục Lục
Làm thế nào để Viết kịch bản qua trang web hoạt động?
Trước khi hiểu cách hoạt động của tập lệnh xuyên trang, điều quan trọng là phải biết chính sách nguồn gốc (SOP) có nghĩa là gì. SOP là một chính sách cơ chế bảo mật hạn chế một trang web (một nguồn) đọc hoặc ghi vào một trang web khác (một nguồn khác). Nó ngăn các trang web độc hại gửi mã độc đến các trang web đáng tin cậy.
Các cuộc tấn công tập lệnh trên nhiều trang cố gắng vượt qua chính sách này bằng cách khai thác khả năng không thể phân biệt giữa HTML hợp pháp và mã độc hại của trình duyệt. Ví dụ: kẻ tấn công có thể đưa mã JavaScript vào trang web mục tiêu. Giả sử trình duyệt thực thi mã và kẻ tấn công có quyền truy cập vào mã thông báo phiên, cookie và dữ liệu nhạy cảm khác.
Có ba loại kịch bản xuyên trang mà tin tặc sử dụng để phá các trang web: được phản ánh, được lưu trữ và DOM XSS.
Làm thế nào để ngăn chặn việc tạo kịch bản trang chéo trong nút
Sau đây là một số bước bạn có thể thực hiện để ngăn chặn việc tạo tập lệnh giữa các trang web trong Node.
Vệ sinh đầu vào
Những kẻ tấn công phải có thể gửi dữ liệu đến ứng dụng web của bạn và hiển thị nó cho người dùng để thực hiện một cuộc tấn công XSS. Do đó, biện pháp phòng ngừa đầu tiên bạn phải thực hiện là khử trùng tất cả dữ liệu đầu vào mà ứng dụng của bạn nhận được từ người dùng. Điều này rất quan trọng vì nó phát hiện dữ liệu không có thật trước khi máy chủ thực thi nó. Bạn có thể thực hiện việc này theo cách thủ công hoặc sử dụng một công cụ như trình xác thực để làm cho quá trình nhanh hơn.
Ví dụ, bạn có thể sử dụng người xác nhận để thoát khỏi các thẻ HTML trong đầu vào của người dùng như bên dưới.
import validator from "validator";
let userInput = `Jane <script onload="alert('XSS hack');"></script>`;
let sanitizedInput = validator.escape(userInput);
Nếu bạn chạy đoạn mã trên, đầu ra được làm sạch sẽ là cái này.
Jane <script onload="alert('XSS hack');"></script>
Hạn chế đầu vào của người dùng
Hạn chế loại đầu vào mà người dùng có thể gửi trong biểu mẫu của bạn thông qua xác thực. Ví dụ: nếu bạn có trường nhập cho email, chỉ cho phép nhập với định dạng email. Bằng cách này, bạn giảm thiểu khả năng những kẻ tấn công gửi dữ liệu xấu. Bạn cũng có thể sử dụng gói trình xác thực cho việc này.
Triển khai chính sách cookie chỉ HTTP
Cookie lưu trữ dữ liệu trong bộ nhớ cache cục bộ và gửi dữ liệu đó trở lại máy chủ thông qua HTTP. Nhưng những kẻ tấn công cũng có thể sử dụng JavaScript để truy cập chúng thông qua trình duyệt, vì vậy chúng là mục tiêu dễ dàng.
Cookie chỉ HTTP là một chính sách ngăn các tập lệnh phía máy khách truy cập vào dữ liệu cookie. Điều này có nghĩa là ngay cả khi ứng dụng của bạn chứa lỗ hổng và kẻ tấn công khai thác nó, họ sẽ không thể truy cập vào cookie.
Dưới đây là một ví dụ về cách bạn có thể triển khai chính sách cookie chỉ HTTP trong Node.js bằng Express:
app.use(express.session({
secret: "secret",
cookie: {
httpOnly: true,
secure: true
}
}))
Nếu kẻ tấn công cố gắng truy cập cookie bằng httpOnly được đặt thành true như được hiển thị ở trên, chúng sẽ nhận được một chuỗi trống.
Cross-Site Scripting là một mục tiêu dễ dàng cho tin tặc
Mặc dù đảm bảo tính bảo mật cho ứng dụng của bạn là rất quan trọng, nhưng việc triển khai nó có thể trở nên phức tạp. Trong bài đăng này, bạn đã tìm hiểu về các cuộc tấn công kịch bản trên nhiều trang web và cách bạn có thể ngăn chặn chúng trong Node. Vì những kẻ tấn công lợi dụng các lỗ hổng trong ứng dụng của bạn để đưa mã độc hại vào máy chủ của bạn, hãy luôn đảm bảo bạn làm sạch thông tin nhập của người dùng. Bằng cách này, bạn loại bỏ mã độc hại trước khi ứng dụng của bạn lưu trữ hoặc thực thi nó.