Sanitization
Quá trình loại bỏ hoặc vô hiệu hóa mã độc hại và ký tự không hợp lệ từ đầu vào người dùng. Biện pháp phòng thủ cơ bản chống XSS và SQL injection.
Sanitization là quá trình loại bỏ hoặc vô hiệu hóa nội dung có khả năng gây hại từ đầu vào người dùng trước khi xử lý hoặc hiển thị. Đây là biện pháp phòng thủ cơ bản chống lại các cuộc tấn công web phổ biến nhất: Cross-Site Scripting (XSS) và SQL injection. Nếu không có sanitization đúng cách, kẻ tấn công có thể chèn mã JavaScript độc hại hoặc lệnh SQL qua trường biểu mẫu, tham số URL hoặc tiêu đề HTTP.
Escape HTML là dạng sanitization phổ biến nhất cho đầu ra web. Nó chuyển đổi các ký tự đặc biệt thành HTML entity: < thành <, > thành >, & thành &, " thành ", ' thành '. Điều này ngăn trình duyệt diễn giải đầu vào người dùng là mã HTML hoặc JavaScript. Bạn có thể tham khảo sách nền tảng bảo mật web về kỹ thuật sanitization.
Đối với phòng chống SQL injection, truy vấn tham số hóa (prepared statements) là phương pháp được khuyến nghị thay vì sanitization chuỗi. Thay vì cố gắng escape ký tự đặc biệt SQL, tham số hóa tách biệt mã SQL khỏi dữ liệu, khiến injection không thể xảy ra. Ví dụ, db.query('SELECT * FROM users WHERE id = ?', [userId]) thay vì nối chuỗi.
Sanitization phải được áp dụng ở đúng thời điểm và đúng ngữ cảnh. Sanitization đầu vào (khi nhận dữ liệu) loại bỏ ký tự không mong muốn. Sanitization đầu ra (khi hiển thị dữ liệu) escape cho ngữ cảnh cụ thể (HTML, JavaScript, CSS, URL). Nguyên tắc quan trọng: không bao giờ tin tưởng đầu vào người dùng, luôn xác thực và sanitize ở phía máy chủ ngay cả khi đã xác thực phía client.
Một quan niệm sai lầm phổ biến là sanitization và xác thực là giống nhau. Xác thực kiểm tra xem đầu vào có đúng định dạng mong đợi hay không (ví dụ: email hợp lệ), trong khi sanitization làm sạch đầu vào để sử dụng an toàn. Cả hai đều cần thiết. Ngoài ra, dựa vào danh sách đen (chặn các mẫu đã biết) kém an toàn hơn danh sách trắng (chỉ cho phép các mẫu đã biết). Bạn có thể tham khảo sách hướng dẫn lập trình an toàn để tìm hiểu thêm.
Từ góc độ đếm ký tự, sanitization có thể thay đổi số ký tự của văn bản. Escape HTML chuyển một ký tự (<) thành nhiều ký tự (<), tăng độ dài chuỗi. Khi đếm ký tự cho giới hạn cơ sở dữ liệu hoặc API, cần xem xét liệu giới hạn áp dụng cho văn bản trước hay sau sanitization.