Thực hành tấn công XSS và cách vá lỗi bằng việc mã hóa dữ liệu đầu vào
Nhiều website lấy dữ liệu người dùng nhập (như bình luận) và in trực tiếp ra màn hình mà không kiểm tra.
// Mã PHP bị lỗi
<?php
if(isset($_POST['noidung'])){
// Lỗi bảo mật ở đây: In trực tiếp
echo $_POST['noidung'];
}
?>
Hậu quả: Nếu người dùng nhập <h1>Hello</h1>, trình duyệt sẽ render thành thẻ tiêu đề. Nếu nhập <script>alert('Hack')</script>, trình duyệt sẽ chạy mã độc (Lỗ hổng XSS).
Phải biến đổi các thẻ HTML thành dạng chuỗi ký tự thông thường trước khi in ra trình duyệt.
// Mã PHP đã được vá
<?php
if(isset($_POST['noidung'])){
// Vá lỗi bằng htmlspecialchars
echo htmlspecialchars($_POST['noidung']);
}
?>
Hàm htmlspecialchars (hoặc tương tự trên các ngôn ngữ khác) sẽ biến đổi < thành < và > thành >. Khi đó trình duyệt chỉ hiển thị text chứ KHÔNG chạy code.
Hãy thử nhập các mã sau để kiểm tra:
<h1 style="color:red">Tiêu đề đỏ</h1><script>alert('Bạn đã bị Hack!');</script><img src="x" onerror="alert('Hack ảnh')">Server đã sử dụng cơ chế xử lý ký tự đặc biệt (tương tự htmlspecialchars).