Table of Contents
Giới thiệu Văn lệnh Đối chiếu (XSS) và JavaScript Defenses
Việc dán văn lệnh đa sắc thái (XSS) là một trong những điểm có nhiều điểm có sẵn trên web, nhất định xếp hạng trong mục OWASP 10. Một cuộc tấn công XSS cho phép một kẻ tấn công để tiêm các tập lệnh độc vào trang web được người dùng xem. Những tập lệnh này có thể lấy cắp các biểu tượng phiên chạy, chuyển hướng dẫn để đánh cắp các nơi Mạng, hoặc gỡ lỗi. Trong khi việc sử dụng máy chủ là quan trọng, JavaScript đóng vai trò then chốt bên cạnh khách hàng để phát hiện và ngăn chặn các cuộc tấn công. Bài này cung cấp một hướng dẫn toàn diện, sẵn sàng để sử dụng JavaScript từ ứng dụng XSS.
Hiểu được ba loại XSS
Trước khi lặn vào phòng chống, cần phải hiểu ba loại XSS chính: được lưu trữ, phản ánh, và dựa trên chất kháng sinh.
XSS đã lưu
Đã lưu (hiện) XSS xảy ra khi đầu vào đầy ác ý được cất giữ vĩnh viễn trên máy phục vụ (v. d., trong cơ sở dữ liệu, đăng đăng xuất hay chú thích) và sau đó phục vụ cho người dùng không có độ tinh sạch thích hợp. Việc nạp lại tấn công thực hiện trong trình duyệt của bất cứ ai xem nội dung đã lưu.
XSS phản ánh
XSS phản ánh khi văn lệnh độc hại được phản ánh trên một máy phục vụ Mạng, thường qua tham số hay đơn của địa chỉ Mạng. Kẻ tấn công lừa nạn nhân để nhấn vào một liên kết đã được thiết kế, và mã đã tiêm sẽ thực hiện ngay lập tức. Khác với việc lưu trữ XSS, việc tải không bền vững.
XSS có mã nguồn điện từ K
XSS dựa vào HTML là một điểm dễ bị tổn thương hoàn toàn của khách hàng. Việc tải trọng này chỉnh sửa môi trường HTML trong trình duyệt của nạn nhân. Mã độc hại không bao giờ chạm đến máy phục vụ; nó bắt nguồn từ JavaScript ở bên khách hàng mà không an toàn để xử lý dữ liệu nhập (v. d., đọc từ [FLT: 0, ), hoặc ).
Phát hiện các vụ tấn công XSS bằng JavaScript
Phát hiện ra là về nhận diện hoạt động khả nghi trước khi có thiệt hại. JavaScript có thể theo dõi các kết nhập, theo dõi đột biến HTML, và xác thực dữ liệu tại các điểm nhập. Trong khi phát hiện bên khách hàng không thể bắt tất cả các cuộc tấn công (đặc biệt nếu người tấn công yêu cầu trực tiếp đến máy phục vụ), nó cung cấp một dòng có giá trị đầu tiên phòng thủ.
Bộ kiểm tra và làm sạch kết nhập
Luôn luôn xác nhận và làm sạch dữ liệu cho người dùng bên khách trước khi xử lý. Hãy dùng thay vì để ngăn chặn thực hiện văn lệnh. Những hàm sau đây dải ký tự nguy hiểm ra khỏi chuỗi:
function sanitizeInput(input) {
const div = document.createElement('div');
div.textContent = input;
return div.innerHTML;
}
Điều này có tác dụng vì thiết lập không giải thích thẻ HTML; nó coi mọi thứ như văn bản đơn giản. Kết quả [FLT: 7) chứa phiên bản riêng của bất kỳ ký tự HTML đặc biệt nào (v., , [FLT: khả năng]].
Theo dõi các biến thể HTML cho các yếu tố đáng nghi
Những kẻ tấn công thường tiêm thẻ (, vào điện thoại , bạn có thể xem các yếu tố chèn bất ngờ.
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === 1) { // element node
if (node.tagName === 'SCRIPT') {
console.warn('Potential XSS: a script element was injected via DOM.');
node.remove(); // or log and analyze
}
// Check for dangerous attributes
if (node.hasAttribute('onerror') || node.hasAttribute('onload')) {
console.warn('Suspicious event handler attribute detected.');
}
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
Khả năng tự động:) chặn các tập lệnh bằng có thể bị bỏ qua bởi những kẻ tấn công thông minh và có thể phá vỡ chức năng hợp pháp. Hãy dùng nó làm công cụ giám sát thay vì cơ chế phòng ngừa chính.
Đang kiểm tra tham số URL và HÌNH
Đối với XSS dựa trên HTML, đọc các thành phần URL một cách an toàn và tránh trực tiếp chèn các giá trị vào HTML. Phát hiện ra việc cố gắng để gửi mã thực hiện:
const params = new URLSearchParams(window.location.search);
const userParam = params.get('name');
if (userParam && /[<>"'\/]/.test(userParam)) {
console.warn('Potential XSS in parameter: ' + userParam);
// Do not use this value in the DOM without encoding
}
Ngăn chặn các cuộc tấn công XSS bằng JavaScript
Phòng ngừa cần một phương pháp đa hoãn. Chỉ JavaScript không thể bảo đảm một ứng dụng, nhưng khi kết hợp với cách cách cách thức cách tân và [FLT: 0] Chính sách bảo mật đối thoại , nó giảm đáng kể rủi ro.
Mật mã mọi dữ liệu được dùng bởi người dùng trước khi chèn vào nút « K »
Quy tắc vàng: không bao giờ đưa dữ liệu không đáng tin vào điện văn. Hãy dùng phương pháp an toàn (Science) thay vì mật mã trong HTML.
Dùng hoặc
const userInput = getUserInput();
const safeText = document.createTextNode(userInput);
document.getElementById('output').appendChild(safeText);
Khi bạn phải dùng , Sanitit với thư viện
Nếu bạn hoàn toàn cần phải làm HTML (v. d., từ một trình soạn thảo văn bản phong phú), dựa vào một thư viện được tín nhiệm như [FLT: 0] Xác nhận . Hãy kiểm tra một thư viện kiểm tra mã độc hại trong khi bảo tồn HTML an toàn.
// Example with DOMPurify (install via npm or CDN)
const dirty = '<img src=x onerror="alert(1)">';
const clean = DOMPurify.sanitize(dirty);
document.getElementById('content').innerHTML = clean;
Hãy xem xét cách phân tích dữ liệu nhập, lột bỏ thẻ và thuộc tính nguy hiểm, và chỉ cho phép các yếu tố. [FLT: 0]View purify on GitHub [FLT: 1].
Tránh hàm JavaScript nguy hiểm
Một số phương pháp và tài sản JavaScript nổi tiếng để bật XSS. Tránh hay kiểm soát chặt chẽ:
- ) — hãy dùng hoặc làm sạch.
- , ) — cùng quy tắc.
- — không bao giờ dùng với người dùng nhập.
- ) — có thể bị khai thác nếu có đầu vào nào bị kết dính.
- / với mã chuỗi ) — tránh dùng chức năng tham chiếu.
- [FLT:] xây dựng ) — tương tự như .
Chính sách bảo mật nội dung được thực hiện (CP) qua JavaScript? Chưa khuyến nghị
CNP là một cơ chế trình duyệt hạn chế các tập lệnh nào chạy được. Nó thường được đặt bằng tiêu đề HTTP, nhưng bạn cũng có thể đặt nó bằng thẻ hoặc qua JavaScript bằng cách tạo một yếu tố . Tuy nhiên, thiết lập kiểu MIME ít an toàn hơn vì một người tấn công đã có khả năng tắt nó. Luôn luôn thích dùng JavaScript để thực thi một bộ điều khiển CN (g, trong quá trình phát triển: nó nạp sớm: trong khi bạn nạp trang đầu.
const meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
meta.content = "default-src 'self'; script-src 'self' 'unsafe-inline'"; // Be very careful with 'unsafe-inline'
document.head.appendChild(meta);
Để sản xuất, hãy cấu hình CNP trong máy phục vụ Mạng của bạn hoặc ủy nhiệm ngược. [FLT: 0] Tài liệu hướng dẫn [FLT: 1] đầy đủ.
Các biện pháp bảo mật khác
Ngoài các chiến thuật đặc trưng JavaScript, một chiến lược phòng chống XSS toàn diện bao gồm những biện pháp quan trọng này:
- Luôn xác nhận ở phía máy phục vụ. [FLT: 1] có thể bỏ qua các chứng nhận khách hàng. Không bao giờ tin dữ liệu khách hàng.
- Dùng những người dẫn đầu phản ứng HTTP thích hợp. , , và đặc biệt .
- Mã hóa mỗi lần bạn trình dịch dữ liệu người dùng. Vấn đề ngữ cảnh: mã hóa cho thực thể HTML, mã hóa URL, mã hóa chuỗi JavaScript, v.
- Giữ quan hệ phụ thuộc cập nhật. Thư viện JavaScript dễ thay đổi (v. d., phiên bản cũ jQuery) là một véc- tơ XSS phổ biến. Dùng npm kiểm tra hay công cụ tương tự.
- Dùng khung có sẵn XSS. Phản ứng, A góc, và Vue tự động thoát ra bằng mặc định. Tuy nhiên, hãy cẩn thận với hoặc .
- Ghi đè một ký tự chung [FLT: 1] tránh và nếu có thể. Hãy dùng từ « danh sách » hay « vohes for inlines » (dòng chữ).
Ví dụ thực tế:
Xem xét một hệ thống chú thích blog nơi người dùng gửi tin nhắn được hiển thị cho người khác. Một người tấn công có thể thử chèn . Đây là một phương pháp JavaScript hòa nhập với hậu phương:
- Phục tùng:) Dùng trước khi gửi đến máy phục vụ (nhưng máy phục vụ vẫn phải làm sạch).
- Dữ liệu trả về:) Hậu phương HTML-en mã hoá văn bản chú thích.
- Dịch [FLT: 0]:) Dùng hoặc một động cơ mẫu an toàn. Đừng bao giờ dùng với dữ liệu thô.
function renderComment(comment) {
const item = document.createElement('div');
item.className = 'comment';
const body = document.createElement('p');
body.textContent = comment.body; // escaped by browser
item.appendChild(body);
document.getElementById('comments').appendChild(item);
}
Kiểm tra sự phòng thủ
Sau khi thực hiện việc phòng ngừa, hãy thử nghiệm ứng dụng của bạn bằng máy quét tự động và tải bằng tay. Các véc- tơ thử nghiệm thông thường bao gồm:
Dùng công cụ phát triển trình duyệt để kiểm tra mã HTML và đảm bảo các chuyến bay thoát. Cũng thử ra thực thi thực thi cho duyệt Mạng bằng cách kiểm tra bàn điều khiển để tìm báo cáo vi phạm.
Kết luận
Văn lệnh xuyên đại diện vẫn là một mối đe dọa nghiêm trọng, nhưng JavaScript cung cấp các công cụ mạnh mẽ cho cả việc phát hiện lẫn phòng ngừa. Bằng cách hiệu chỉnh các dữ liệu nhập, giám sát các thay đổi HTML, thoát ra, và tích hợp với thư viện mạnh mẽ như ixPurification, bạn có thể làm cứng an ninh khách hàng của bạn. Hãy nhớ rằng các biện pháp bên khách hàng không phải là một viên đạn bạc; chúng bổ sung một chiến lược phòng thủ bên cạnh máy chủ, đầu ra đầu ra, và kiểm tra thường xuyên. Cảnh giác, thường xuyên, và giữ các thư viện của bạn cập nhật ngày.
Để đọc thêm, hãy tham khảo ý kiến trang ) và OWAP XSS Cheve Sheet ).