Cách ngăn chặn Cross-Site Scripting sử dụng HTML, JavaScript và DOM
Cross-Site Scripting, thường được gọi là XSS, là một trong những phương thức tấn công nguy hiểm nhất được tội phạm mạng sử dụng, vì vậy, điều quan trọng là mọi nhà phát triển và nhà nghiên cứu bảo mật đều biết nó là gì và cách ngăn chặn các cuộc tấn công. Vì vậy, làm thế nào bạn có thể thực hiện hành động chống lại lỗ hổng XSS? Bạn sử dụng HTML, JavaScript hoặc DOM để hiển thị dữ liệu mà trang web nhận được từ người dùng. Một hoặc nhiều trong ba lĩnh vực khác nhau này có thể hoạt động cùng nhau.
Mục Lục
Cách ngăn chặn XSS bằng HTML
XSS cho phép kẻ tấn công đưa mã hoặc tập lệnh độc hại vào trang web, nhắm mục tiêu đến những người dùng cả tin đang truy cập trang web. Điều này có thể đánh cắp dữ liệu cá nhân, chuyển hướng khách truy cập đến một trang web khác do tội phạm mạng thiết lập hoặc giả mạo giao diện của trang web. Nhưng bạn có thể ngăn điều này xảy ra; chẳng hạn, bằng cách ngăn họ chèn HTML.
Hãy tưởng tượng bạn có một trang web với một cuốn lưu bút. Giả sử rằng khách truy cập của bạn sử dụng sổ lưu bút này có thể viết tên và tin nhắn của họ ở đây và tin nhắn của họ có thể được xem công khai. Kẻ tấn công muốn thực hiện kiểm tra XSS trong sổ lưu bút của bạn sẽ sử dụng khu vực bạn đã phân bổ để viết thư. Tội phạm mạng đó sẽ chạy mã JavaScript tại đây. Ví dụ: kẻ tấn công có thể sử dụng mã JavaScript như:
<script>alert("The XSS!")</script>
Kẻ tấn công phải sử dụng thẻ script để thành công. Nếu không, mã JavaScript sẽ không hoạt động. Bạn phải mã hóa câu lệnh < để người dùng không bao giờ có thể sử dụng các thẻ HTML. Điều này sẽ gây khó khăn cho kẻ tấn công khi làm việc với các thẻ HTML.
Cách ngăn chặn XSS bằng JavaScript
Logic trong HTML cũng hợp lệ trong JavaScript. Trong một số ứng dụng, có thể in dữ liệu mà trang web nhận được từ người dùng bằng mã JavaScript.
Hãy xem xét mã hóa này:
<p id="print"></p>
<script>
document.getElementById("test").innerHTML = "";
</script>
Hãy tưởng tượng một trang web sử dụng một khối mã như ở trên. Nhà phát triển đã sử dụng thẻ “p” có tên là “in” ở đây. Như bạn có thể thấy từ mã, một giá trị sẽ đến từ tham số “tìm kiếm” và nhà phát triển muốn hiển thị giá trị đến này trong thẻ “p”. Nhà phát triển đã thực hiện thao tác này muốn sử dụng tính năng InternalHTML của JavaScript.
Bây giờ hãy xem xét tình huống từ quan điểm của kẻ tấn công mạng. Trong trường hợp như vậy, kẻ tấn công sẽ thực hiện kiểm tra XSS trong thẻ “script”. Đối với điều này, kẻ tấn công không cần khởi động lại thẻ vì thẻ “script” đã được sử dụng. Kẻ tấn công sau đó có thể viết một bài kiểm tra như thế này:
filename.php?search=a" alert("The XSS!"); f= "
Mã này sẽ xuất hiện trên trang web dưới dạng:
document.getElementById("test").innerHTML = " a" alert("The XSS!"); f=" ";
Cuộc tấn công đó sẽ thành công. Để hiểu rõ hơn về vấn đề này, hãy xem xét thêm một kỹ thuật ví dụ mà kẻ tấn công có thể sử dụng. Tin tặc có thể đã áp dụng kiểm tra XSS như:
filename.php?search=";</script><em>Fatih</em>
Đây là những gì nó sẽ trông giống như khi xem từ trang web:
document.getElementById("test").innerHTML = " ";</script><em>Fatih</em> ";
Điều này có vẻ hơi lạ vì kẻ tấn công đã đóng thẻ “script” đầu tiên bằng cách sử dụng cấu trúc như “/script” ở đây. Và như vậy, kẻ tấn công có thể khởi động lại bất kỳ mã JavaScript và HTML nào mà chúng muốn.
Nếu bạn nghĩ về hai ví dụ khác nhau này, việc bảo vệ khỏi XSS có vẻ khá đơn giản. Biện pháp phòng ngừa cần thiết là mã hóa “ và ‘ các ký tự bạn nhìn thấy trong ví dụ đầu tiên. Trong ví dụ thứ hai, mã hóa các ký tự < và >.
Cách ngăn chặn XSS bằng DOM
Trong biến thể XSS này, dữ liệu mà trang web nhận được từ người dùng có thể can thiệp vào thuộc tính của phần tử DOM. Ví dụ: thông tin màu mà trang web nhận được từ người dùng có thể ảnh hưởng đến màu nền của bảng hoặc toàn bộ nền của trang. Vì vậy, người dùng vô tình can thiệp vào bố cục kiểu dáng của phần thân và bảng. Đoạn mã sau là một ví dụ tốt cho việc này:
<body bgcolor="<?php echo $_GET['color']; ?>"/>
Với điều này, trang web sử dụng tham số “màu” nhận được trực tiếp từ người dùng trong thuộc tính “bgcolor” của phần tử “body”. Vậy kẻ tấn công có thể làm gì vào thời điểm này? Họ có thể thực thi mã độc hại này:
filename.php?color=red" onload="alert('The XSS!')
Điều này trông như thế này khi xem từ trang web:
<body bgcolor=" red" onload="alert('The XSS!') "/>
Để ngăn chặn điều này xảy ra, nhà phát triển sẽ phải mã hóa “ tính cách.
Tuy nhiên, có một yếu tố quan trọng hơn trong JavaScript cần lưu ý. Đoạn mã sau đây là một ví dụ cho điều này:
<a href="javascript:alert('The XSS!')">
Điều này có nghĩa là có thể chạy trực tiếp một số mã JavaScript. Một trong những biện pháp phòng ngừa tốt nhất là đảm bảo trang web kiểm tra xem dữ liệu mà nó nhận được từ người dùng có phải là URL thực hay không. Phương pháp đơn giản nhất là đảm bảo có các biểu thức như “HTTP” và “HTTPS” (phiên bản bảo mật của HTTP) trong kết nối.
Một chức năng ví dụ để ngăn chặn XSS với PHP
Bạn đã xem một số ví dụ về cách bảo vệ ứng dụng hoặc trang web khỏi các cuộc tấn công XSS. Bạn có thể sử dụng các đoạn mã trong bảng này với PHP:
|
Mã hóa trong HTML |
htmlký tự đặc biệt($str, ENT_COMPAT) |
|
Mã hóa trong thuộc tính JavaScript và DOM |
htmlký tự đặc biệt($str, ENT_NOQUOTES) |
|
Kiểm tra URL |
‘/^(((https?)|(//))).*/’; |
Lưu ý rằng đây chỉ là những ví dụ và sẽ khác nhau tùy thuộc vào ngôn ngữ phần mềm bạn đang sử dụng.
Bạn có thể tạo một ứng dụng web bằng PHP và thử các mã bạn thấy ở trên để viết chúng ra. Nếu bạn đang tự hỏi làm thế nào để sử dụng tất cả các phương pháp này, bạn có thể lấy một số ý tưởng từ khối mã PHP bên dưới, điều này sẽ hữu ích ngay cả khi bạn đang sử dụng một ngôn ngữ khác:
<?php
$data = $_GET['data'];
function in_attribute($str){
return htmlspecialchars($str, ENT_COMPAT);
}
function in_html($str){
$link = '/^(((https?)|(//))).*/';
if(!preg_match($link, $str))
{
return "/";
}
return $str;
}
$data = in_attribute($data);
$data = in_html($data);
$data = real_url(data);
?>
Bảo vệ trang web của bạn khỏi XSS và hơn thế nữa
XSS là một vectơ tấn công phổ biến được tin tặc sử dụng. Thông thường, giá trị đường dẫn trong URL, bất kỳ trường nào trên trang web của bạn nơi dữ liệu có thể được nhập (chẳng hạn như trường biểu mẫu và nhận xét), có thể được sử dụng để kiểm tra lỗ hổng XSS. Nhưng tất nhiên, có nhiều phương pháp khác nhau mà tội phạm mạng có thể sử dụng để tấn công một trang web, đặc biệt nếu bạn có một trang web có nhiều người dùng và ẩn thông tin của họ.