1. XSS là gì?

XSS (Cross-Site Scripting) là một lỗ hổng bảo mật phổ biến trong các ứng dụng web, cho phép kẻ tấn công chèn mã JavaScript độc hại vào trang web. Khi người dùng truy cập trang web bị nhiễm, mã độc sẽ chạy trên trình duyệt của họ, có thể đánh cắp thông tin, chiếm quyền điều khiển tài khoản hoặc thực hiện các hành vi nguy hiểm khác.

2. Các loại tấn công XSS

Có ba loại tấn công XSS chính:

a) Stored XSS (XSS lưu trữ)

Trong Stored XSS, mã độc được lưu trữ trên máy chủ và được tải về khi người dùng truy cập trang web. Ví dụ:

html
<form action="/submit-comment" method="POST">
    <input type="text" name="comment" placeholder="Nhập bình luận">
    <button type="submit">Gửi</button>
</form>

Nếu không có cơ chế lọc đầu vào, kẻ tấn công có thể nhập:

plain
<script>alert('Bạn đã bị hack!');</script>

Khi dữ liệu này được lưu và hiển thị cho người dùng khác, trình duyệt sẽ thực thi đoạn script độc hại.

b) Reflected XSS (XSS phản hồi)

Trong Reflected XSS, mã độc không được lưu trữ mà được phản hồi lại ngay lập tức từ server. Ví dụ, nếu ứng dụng web hiển thị tham số từ URL:

php
<?php
    echo "<p>Chào mừng " . $_GET['name'] . "!</p>";
?>

Kẻ tấn công có thể tạo URL độc hại:

html
http://example.com/?name=<script>alert('Bạn đã bị hack!');</script>

Khi người dùng truy cập, đoạn script sẽ được thực thi ngay trên trình duyệt của họ.

c) DOM-Based XSS

Đây là loại XSS xảy ra khi JavaScript trên trình duyệt xử lý dữ liệu đầu vào một cách không an toàn. Ví dụ:

js
var userInput = window.location.hash.substr(1);
document.write("<p>" + userInput + "</p>");

Kẻ tấn công có thể gửi URL:

html
http://example.com/#<script>alert('Hacked!')</script>

Và khi người dùng mở liên kết này, trình duyệt sẽ thực thi mã độc.

3. Tác hại của XSS

XSS có thể gây ra nhiều hậu quả nghiêm trọng, bao gồm:

  • Đánh cắp thông tin đăng nhập thông qua cookie hoặc form đăng nhập giả.
  • Chiếm quyền điều khiển tài khoản bằng cách gửi yêu cầu giả mạo từ người dùng.
  • Chèn nội dung giả mạo để lừa đảo hoặc phát tán mã độc.
  • Phá vỡ giao diện website bằng cách thay đổi nội dung HTML, CSS.

4. Cách phòng chống XSS

a) Lọc và mã hóa dữ liệu đầu vào

  • Escape dữ liệu trước khi hiển thị lên trang:
php
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
  • Loại bỏ các ký tự nguy hiểm trong JavaScript:
js
function sanitizeInput(str) {
    return str.replace(/</g, "<").replace(/>/g, ">");
}

b) Sử dụng Content Security Policy (CSP)

CSP giúp hạn chế việc thực thi mã JavaScript không mong muốn:

plain
Content-Security-Policy: default-src 'self'; script-src 'self';

c) Kiểm tra đầu vào trên server

Không chỉ kiểm tra trên client-side, mà còn phải kiểm tra trên server:

php
if (preg_match('/<script>/i', $input)) {
    die("Dữ liệu không hợp lệ!");
}

d) Sử dụng thư viện bảo mật

Các framework như React, Angular có cơ chế tự động escape dữ liệu, giúp giảm nguy cơ XSS.

5. Kết luận

XSS là một trong những lỗ hổng bảo mật phổ biến nhưng có thể phòng chống hiệu quả bằng cách lọc đầu vào, escape dữ liệu, áp dụng CSP và kiểm tra đầu vào trên server. Các lập trình viên cần nắm rõ nguyên tắc bảo mật này để bảo vệ ứng dụng web khỏi các cuộc tấn công.

Bài viết này được đăng trên codetuthub.com để giúp bạn hiểu rõ về XSS và cách phòng chống hiệu quả.