Công cụ dành cho nhà phát triển · HTML bộ thoát thực thể
Giải mã các thực thể HTML không có HTML bên trong: cách hoạt động của bộ giải mã bảng tra cứu
· Cách thức hoạt động
html bảo vệ mã hóa
Thủ thuật phổ biến để giải mã các thực thể bằng cách gán cho InternalHTML sẽ chạy dữ liệu đầu vào của bạn thông qua trình phân tích cú pháp HTML, đây chính xác là điều bạn không muốn. Bài đăng này giải thích cách tiếp cận dựa trên bảng an toàn hơn và cách nó xử lý các tham chiếu được đặt tên, thập phân và hex.
Bộ giải mã đã thực thi <img onerror> - một trường hợp cụ thể trong đó 'chỉ cần giải mã nó' đã trở thành thực thi tập lệnh
Đầu vào một lớp phổ biến element.innerHTML = không chỉ giải mã &. Nếu đầu vào cũng chứa <img src=x onerror=...>, trình duyệt sẽ tạo thành phần hình ảnh và thuộc tính xử lý sự kiện. Tùy thuộc vào cách nút đó được gắn và tải, điều này có thể biến lối tắt định dạng thành thực thi tập lệnh. Chuỗi giống HTML đã dán sẽ vẫn là dữ liệu khi công việc duy nhất là giải quyết các tham chiếu ký tự chứ không được phân tích cú pháp thành cây DOM.
Những gì InsideHTML thực sự làm với một chuỗi - các thuộc tính phân tích cú pháp, tạo phần tử và xử lý sự kiện, không chỉ thay thế thực thể
bên trongHTML gọi trình phân tích cú pháp HTML: các thẻ trở thành nút, các thuộc tính thu được ý nghĩa của trình duyệt và sau đó, nội dung đọc văn bản sẽ loại bỏ đánh dấu khỏi kết quả. Thẻ <strong> mà bạn dự định giữ nguyên dưới dạng dữ liệu nhập bằng chữ có thể biến mất dưới dạng định dạng văn bản. Một phần tử tách rời không phải là sự đảm bảo an toàn chung; mã thường chèn lại cây con đó hoặc sử dụng kết quả HTML ở nơi khác. Nếu bạn cần hiển thị dữ liệu đầu vào không đáng tin cậy, hãy chỉ định nội dung văn bản và dọn dẹp khi bạn cố tình chọn hiển thị HTML.
Cách tiếp cận bảng tra cứu — biểu thức chính quy cho &name;, &#NNN; và &#xHHH;, và bản đồ từ tên đến ký tự
Bộ giải mã của ToolAcre sử dụng biểu thức chính quy giới hạn để tìm tham chiếu có dạng &name;, { hoặc {. Các tham chiếu được đặt tên được tra cứu trong một bảng rõ ràng thực tế, bao gồm amp, lt, gt, dấu ngoặc kép và kiểu chữ phổ biến. Một cái tên không xác định được để lại như được viết chứ không phải đoán. Cách tiếp cận này không tạo ra phần tử nào và không gọi trình phân tích cú pháp HTML; nó chỉ đơn giản thay thế các chuỗi con được nhận dạng trong một chuỗi. Bảng này cố tình là một tập hợp con, không phải tất cả các tham chiếu ký tự được đặt tên HTML.
Xử lý các tham chiếu số - phân tích các điểm mã thập phân và thập lục phân và chuyển đổi chúng thành chuỗi, bao gồm cả các ký tự astral
Đối với tham chiếu số, hãy phân tích cú pháp số thập phân sau &# hoặc thập lục phân sau &#x, sau đó chuyển điểm mã số thành ký tự có String.fromCodePoint. Giá trị trung gian như 0x1F600 mang lại biểu tượng cảm xúc chứ không phải hai ký tự có thể in độc lập. Việc triển khai cũng ánh xạ các giá trị phạm vi điều khiển Windows-1252 lịch sử giống như trình duyệt thực hiện; 0, các điểm mã thay thế và các giá trị trên U+10FFFF trở thành ký tự thay thế. Việc xử lý lỗi rõ ràng đó giúp số không hợp lệ không làm hỏng bộ giải mã.
Ví dụ đã hoạt động: giải mã một chuỗi trộn &, © và 😀 — mỗi kết quả khớp được giải quyết từ bảng hoặc số
Giải mã dữ liệu nhập bằng chữ &, © và 😀: tham chiếu đầu tiên ánh xạ qua bảng được đặt tên thành &, số thập phân 169 trở thành © và hex 1F600 trở thành 😀. Bao gồm <img onerror="alert(1)"> thô bên cạnh chúng. Bộ giải mã trả về chuỗi trông giống thẻ đó dưới dạng các ký tự chuỗi thông thường; nó không tạo ra một hình ảnh hoặc thực hiện một sự kiện. Khi đưa kết quả vào một trang thực sau này, hãy sử dụng phần chìm văn bản an toàn thay vì lấy chuỗi đã giải mã và gán lại cho InsideHTML.
Cách tiếp cận bảng sẽ không làm được gì - các tham chiếu kế thừa không có dấu chấm phẩy và các vấn đề khó phục hồi lỗi của trình phân tích cú pháp, trừ khi được thực hiện có chủ ý
Phương pháp tra cứu có chủ ý không tái tạo các quy tắc khôi phục không có dấu chấm phẩy cũ của trình phân tích cú pháp HTML. &bản sao không có dấu chấm phẩy có thể không bị ảnh hưởng. Bảng có tên cố định cũng bỏ qua nhiều trong số hơn hai nghìn tham chiếu có tên HTML5. Những hạn chế đó là sự đánh đổi trung thực cho một bộ giải mã nhỏ có thể dự đoán được; chỉ chấp nhận các tài liệu tham khảo đã chấm dứt rõ ràng để tránh coi văn xuôi tùy tiện có chứa ký hiệu làm đánh dấu. Kiểm tra tên được hỗ trợ trong tài liệu của công cụ nếu cần có khả năng tương thích hoàn toàn với trình duyệt.
Điều này không bao gồm những gì — làm sạch HTML bạn định kết xuất, đây lại là một vấn đề khác
Tham chiếu giải mã không lọc HTML để hiển thị. Nếu văn bản được giải mã chứa chuỗi <script> thì vẫn nguy hiểm nếu sau đó một phần khác của ứng dụng chèn nó làm đánh dấu. Các ngữ cảnh như thuộc tính HTML, chuỗi JavaScript và URL, mỗi ngữ cảnh đều cần có chính sách và mã hóa đầu ra riêng. ToolAcre trả về văn bản; nó không thể làm cho một chiếc bồn rửa không an toàn trong tương lai trở nên an toàn.
Bài học rút ra: coi đầu vào là dữ liệu — cách trình thoát thực thể HTML giải mã bằng bảng tra cứu thay vì trình phân tích cú pháp HTML, để đầu vào của bạn vẫn là văn bản
Xử lý đầu vào dưới dạng dữ liệu. HTML trình thoát thực thể giải mã bằng bảng và số học điểm mã, không phải thủ thuật bên trongHTML, do đó, tải trọng trông giống như đánh dấu vẫn giữ nguyên các ký tự trơ trong công cụ. Hãy thử ba tham chiếu, sau đó kiểm tra cả văn bản được giải mã và cách bạn dự định sử dụng nó tiếp theo: ranh giới an toàn sẽ bị mất nếu bạn phân tích cú pháp thành HTML.