

Kẻ tấn công có thể đánh cắp dữ liệu, chiếm phiên đăng nhập hoặc thực hiện hành động dưới danh nghĩa nạn nhân với XXS. Vậy XSS là gì, tấn công XSS hoạt động như thế nào và làm sao để phòng chống? Hãy cùng tìm hiểu chi tiết trong bài viết dưới đây.
XSS (Cross-Site Scripting) là một dạng lỗ hổng bảo mật web xảy ra khi ứng dụng đưa dữ liệu không đáng tin cậy vào nội dung trang web mà không xử lý an toàn, từ đó tạo điều kiện cho mã độc được thực thi trên trình duyệt của người dùng.
Mã được chèn thường là JavaScript. Nội dung HTML hoặc những loại dữ liệu khác mà trình duyệt có khả năng xử lý cũng có thể trở thành một phần của cuộc tấn công.
Có thể hình dung đơn giản:
Kẻ tấn công → đưa dữ liệu độc hại vào ứng dụng → website trả dữ liệu về trình duyệt → trình duyệt coi dữ liệu đó là mã hợp lệ → mã được thực thi.
Chính đặc điểm này khiến XSS có thể ảnh hưởng trực tiếp đến người đang sử dụng website dù máy chủ không bị chiếm quyền hoàn toàn.
Trong OWASP Top 10:2025, Cross-Site Scripting được xếp trong nhóm A05:2025 – Injection. Dữ liệu OWASP sử dụng cho nhóm này ghi nhận hơn 30.000 CVE liên quan đến Cross-Site Scripting, cho thấy XSS vẫn là vấn đề bảo mật ứng dụng web đáng chú ý.

XSS (Cross-Site Scripting) hoạt động dựa trên cơ chế: kẻ tấn công chèn mã script độc hại (thường là JavaScript) vào ứng dụng web, và trình duyệt của người dùng lầm tưởng đó là mã hợp pháp của trang nên đã thực thi nó.
Cụ thể, quy trình diễn ra qua 3 bước cốt lõi:
XSS thường được mô tả đơn giản là hậu quả của việc “không lọc dữ liệu đầu vào”. Tuy nhiên, nguyên nhân thực tế phức tạp hơn. Một ứng dụng vẫn có thể tồn tại XSS ngay cả khi đã kiểm tra input nếu dữ liệu sau đó được đưa vào context không an toàn.
Dữ liệu từ người dùng, URL, API hoặc nguồn bên ngoài không nên được mặc định là an toàn.
Nếu dữ liệu này được đưa trực tiếp vào HTML hoặc JavaScript, ứng dụng có thể vô tình biến dữ liệu thành mã thực thi.
Output Encoding giúp đảm bảo ký tự đặc biệt được trình duyệt hiểu là dữ liệu thay vì cú pháp HTML hoặc JavaScript.
Tuy nhiên, cách encode phụ thuộc vào vị trí dữ liệu xuất hiện.
Ví dụ, cách xử lý dữ liệu trong:
không hoàn toàn giống nhau.
Đây là lý do context-aware output encoding đóng vai trò quan trọng trong phòng chống XSS.
Trong ứng dụng web hiện đại, nhiều dữ liệu được xử lý trực tiếp phía client.
Nếu JavaScript nhận dữ liệu có thể bị kiểm soát rồi đưa chúng vào một DOM API không an toàn, XSS có thể xảy ra mà không cần máy chủ trực tiếp tạo đoạn mã độc. Đây là một trong những cơ chế phổ biến của DOM-based XSS.

Một số hệ thống cần cho phép người dùng nhập nội dung có định dạng HTML, chẳng hạn:
Trong trường hợp đó, chỉ encode toàn bộ HTML sẽ làm mất chức năng định dạng. Ứng dụng cần sử dụng cơ chế HTML Sanitization để giữ lại nội dung hợp lệ nhưng loại bỏ các thành phần nguy hiểm.
XSS thường được chia thành ba nhóm chính gồm Reflected XSS, Stored XSS và DOM-based XSS.
Reflected XSS xảy ra khi dữ liệu từ một HTTP request được ứng dụng đưa ngay vào HTTP response theo cách không an toàn.
Reflected XSS thường cần nạn nhân thực hiện một hành động như:
Do nội dung độc hại thường không được lưu lâu dài trên máy chủ nên Reflected XSS còn được gọi là non-persistent XSS.
Stored XSS xảy ra khi dữ liệu độc hại được lưu lại trong hệ thống và sau đó được đưa vào trang web mà không được xử lý an toàn.
Dữ liệu có thể được lưu trong:
Khi người dùng truy cập trang chứa dữ liệu đó, mã có thể tự động được gửi về trình duyệt và thực thi.
Stored XSS thường có phạm vi ảnh hưởng lớn hơn Reflected XSS vì payload đã tồn tại trong ứng dụng. Kẻ tấn công không nhất thiết phải gửi riêng một URL độc hại cho từng nạn nhân.
Ví dụ, nếu mã độc được lưu trong một bình luận công khai, bất kỳ người dùng nào xem bình luận đó đều có khả năng bị ảnh hưởng.
DOM-based XSS xảy ra chủ yếu trong mã JavaScript phía client.
Một ứng dụng có thể:
Trong trường hợp này, lỗ hổng có thể tồn tại hoàn toàn ở phía trình duyệt thay vì quá trình render HTML trên server.
DOM-based XSS ngày càng đáng chú ý do các website hiện đại sử dụng JavaScript và kiến trúc client-side ngày càng nhiều.
Tiêu chí | Reflected XSS | Stored XSS | DOM-based XSS |
| Nguồn dữ liệu | HTTP request | Dữ liệu được lưu trong ứng dụng | Dữ liệu được JavaScript phía client xử lý |
| Dữ liệu có được lưu không? | Thường không | Có | Không bắt buộc |
| Vị trí chính gây lỗi | Server response | Nội dung được lưu và trả về sau đó | JavaScript/DOM phía client |
| Cách tiếp cận nạn nhân | Thường cần URL hoặc request được tạo trước | Có thể tự tác động khi người dùng xem nội dung | Phụ thuộc cách dữ liệu đi từ source tới DOM |
| Phạm vi ảnh hưởng | Thường theo từng lượt tương tác | Có thể ảnh hưởng nhiều người dùng | Tùy logic ứng dụng |
| Đặc điểm nổi bật | Phản chiếu dữ liệu ngay trong response | Payload tồn tại trong hệ thống | Xảy ra trong quá trình xử lý DOM |
Dù cơ chế khác nhau, điểm chung của ba loại là dữ liệu không đáng tin cậy cuối cùng được xử lý trong một context cho phép nó trở thành mã thực thi.
Mức độ nguy hiểm của XSS phụ thuộc vào website, loại lỗ hổng, quyền của nạn nhân và các cơ chế bảo mật đang được sử dụng.
Một lỗ hổng trên trang công khai có thể có tác động khác hoàn toàn so với XSS xuất hiện trong hệ thống quản trị mà administrator thường xuyên truy cập.
Mã chạy trên trình duyệt có thể tìm cách truy cập dữ liệu mà JavaScript của trang được phép đọc, sau đó gửi chúng tới hệ thống bên ngoài.
Dữ liệu bị ảnh hưởng có thể gồm thông tin hiển thị trên trang, token hoặc các dữ liệu ứng dụng khác.
Nếu session token được lưu trữ hoặc xử lý theo cách không an toàn, XSS có thể được sử dụng để chiếm phiên người dùng.
Cookie có thuộc tính HttpOnly sẽ hạn chế JavaScript truy cập trực tiếp vào cookie đó, nhưng HttpOnly không loại bỏ bản thân lỗ hổng XSS.
Một đoạn script chạy trong phiên hợp lệ có thể gửi request hoặc tương tác với ứng dụng bằng quyền mà nạn nhân đang có.
Nếu nạn nhân là administrator, tác động có thể nghiêm trọng hơn đáng kể.
XSS có khả năng thay đổi DOM và nội dung người dùng nhìn thấy trên trang.
Kẻ tấn công có thể lợi dụng đặc điểm này để:
XSS vì vậy không chỉ là vấn đề “xuất hiện popup trên trình duyệt”. Trong thực tế, khả năng thực thi mã trong context của website mới là rủi ro cốt lõi.
Phát hiện XSS cần kết hợp kiểm tra mã nguồn, kiểm thử ứng dụng và theo dõi luồng dữ liệu từ nguồn đầu vào đến vị trí dữ liệu được render.
Trước tiên cần xác định những vị trí ứng dụng tiếp nhận dữ liệu bên ngoài như:
Sau đó kiểm tra dữ liệu được đưa tới đâu và có được encode hoặc sanitize phù hợp trước khi hiển thị hay không.
Đối với DOM-based XSS, cần đặc biệt chú ý tới luồng:
Source → xử lý JavaScript → Sink
Source là nơi dữ liệu có khả năng bị kiểm soát đi vào ứng dụng, trong khi sink là nơi dữ liệu được đưa vào DOM hoặc thực thi theo cách có thể trở nên nguy hiểm.
Việc thay thế unsafe sink bằng các API an toàn là một trong những biện pháp quan trọng để hạn chế Client-side XSS.

Doanh nghiệp có thể kết hợp:
Công cụ tự động giúp mở rộng phạm vi kiểm tra nhưng không nên được xem là phương pháp duy nhất, đặc biệt với các luồng DOM và business logic phức tạp.
Không có một biện pháp duy nhất có thể ngăn chặn tất cả XSS. Cách tiếp cận phù hợp là xây dựng nhiều lớp bảo vệ từ quá trình phát triển ứng dụng đến lớp bảo mật khi hệ thống hoạt động.
Ứng dụng nên xác định rõ dữ liệu nào được phép nhập.
Ví dụ:
Input validation giúp giảm dữ liệu bất thường đi sâu vào hệ thống.
Tuy nhiên, chỉ lọc input là chưa đủ để chống XSS vì kẻ tấn công có thể tìm nhiều cách biểu diễn dữ liệu khác nhau và dữ liệu vẫn có thể trở nên nguy hiểm tùy context.
Output Encoding giúp biến ký tự đặc biệt thành dạng mà trình duyệt coi là dữ liệu thông thường.
Quan trọng nhất là sử dụng đúng cách encode cho từng context:
Không nên sử dụng một hàm encode chung cho tất cả trường hợp.
Nếu ứng dụng cho phép người dùng nhập rich text hoặc HTML, nên sử dụng thư viện sanitization được duy trì tốt.
Sanitization có nhiệm vụ giữ lại các thành phần HTML hợp lệ đồng thời loại bỏ hoặc vô hiệu hóa nội dung nguy hiểm.
Không nên tự xây dựng bộ lọc HTML đơn giản bằng một vài quy tắc regex vì HTML và cơ chế parsing của trình duyệt rất phức tạp.
Đối với ứng dụng JavaScript phía client, cần hạn chế đưa dữ liệu không đáng tin cậy trực tiếp vào những API có khả năng diễn giải chúng như HTML hoặc code.
Khi có thể, hãy sử dụng các API xử lý dữ liệu dưới dạng text thay vì HTML. Đây là lớp bảo vệ đặc biệt quan trọng đối với DOM-based XSS.
Các framework web hiện đại thường cung cấp cơ chế auto-escaping hoặc encoding mặc định.
Developer nên:
Framework giúp giảm rủi ro nhưng không loại bỏ hoàn toàn lỗi do developer tạo ra.

Content Security Policy (CSP) là cơ chế cho phép website quy định những loại tài nguyên hoặc script nào trình duyệt được phép tải và thực thi.
Một CSP nghiêm ngặt có thể giới hạn:
CSP sử dụng nonce hoặc hash có thể giúp kiểm soát script nào được phép thực thi. Tuy nhiên, CSP nên được xem là một lớp defense-in-depth, không phải phương pháp thay thế output encoding và sanitization.
Các cookie quan trọng nên áp dụng những thuộc tính phù hợp như:
Trong đó, HttpOnly giúp hạn chế JavaScript truy cập trực tiếp vào cookie và có thể giảm một số hậu quả khi XSS xảy ra.
Ứng dụng liên tục thay đổi theo các bản release, dependency, API và tính năng mới. Do đó, kiểm thử XSS không nên chỉ thực hiện một lần trước khi hệ thống đi vào hoạt động.
Doanh nghiệp nên kết hợp secure coding, code review, vulnerability scanning và penetration testing vào vòng đời phát triển phần mềm.
Web Application Firewall có thể giúp phát hiện và ngăn chặn một số request chứa mẫu tấn công đã biết trước khi chúng tới ứng dụng.
Tuy nhiên, WAF không thể thay thế việc sửa lỗ hổng trong source code. Đặc biệt, những XSS xảy ra hoàn toàn phía client như một số trường hợp DOM-based XSS có thể không đi qua lớp kiểm tra request theo cách WAF có thể phát hiện.
XSS là viết tắt của Cross-Site Scripting. Ký hiệu XSS được sử dụng thay vì CSS để tránh nhầm lẫn với Cascading Style Sheets.
Không. XSS là một dạng lỗ hổng và kỹ thuật tấn công trên ứng dụng web, không phải một loại virus máy tính.
Kẻ tấn công lợi dụng cách website xử lý dữ liệu để khiến nội dung ngoài ý muốn được trình duyệt của nạn nhân thực thi.
Không.
JavaScript thường được sử dụng trong các cuộc tấn công XSS vì trình duyệt có khả năng thực thi JavaScript, nhưng bản thân JavaScript không phải lỗ hổng.
Nguyên nhân nằm ở cách ứng dụng xử lý dữ liệu không đáng tin cậy và đưa chúng vào những context có thể thực thi.
XSS có thể được sử dụng để thu thập dữ liệu người dùng nhìn thấy hoặc nhập vào trang nếu điều kiện khai thác cho phép. Nó cũng có thể hỗ trợ giả mạo giao diện, đánh cắp token hoặc thực hiện hành động trong phiên người dùng.
Mức độ ảnh hưởng thực tế phụ thuộc vào vị trí lỗ hổng và các biện pháp bảo mật của ứng dụng.
WAF có thể chặn một số request mang đặc điểm tấn công XSS nhưng không thể đảm bảo loại bỏ toàn bộ XSS.
Đặc biệt, WAF không xử lý được nguyên nhân gốc nằm trong source code và có thể không phát hiện những trường hợp DOM-based XSS diễn ra hoàn toàn ở phía client.
XSS tìm cách đưa và thực thi nội dung độc hại trong context của website, trong khi CSRF lợi dụng phiên đăng nhập sẵn có để khiến người dùng gửi một request mà họ không chủ động thực hiện.
Hai lỗ hổng có thể liên quan nhưng cần các biện pháp phòng chống khác nhau.
Hiểu XSS là gì giúp doanh nghiệp nhận diện một trong những rủi ro phổ biến đối với ứng dụng web. Reflected XSS, Stored XSS và DOM-based XSS có cơ chế khác nhau nhưng đều xuất phát từ việc dữ liệu không đáng tin cậy được xử lý trong context không an toàn.
VNPT Cloud cung cấp hệ sinh thái hạ tầng và giải pháp bảo mật giúp doanh nghiệp xây dựng, vận hành và bảo vệ ứng dụng trên môi trường Cloud. Doanh nghiệp có thể lựa chọn giải pháp phù hợp với quy mô hệ thống và yêu cầu bảo mật để nâng cao khả năng phòng vệ trước các mối đe dọa trên Internet.
