Những ký tự nào cần được thoát trong HTML?


251

Chúng có giống với XML không, có lẽ cộng với khoảng trắng (  )?

Tôi đã tìm thấy một số danh sách lớn các ký tự thoát HTML nhưng tôi không nghĩ chúng phải được thoát. Tôi muốn biết những gì cần phải thoát.

Câu trả lời:


318

Nếu bạn đang chèn nội dung văn bản vào tài liệu của mình ở vị trí có nội dung văn bản được mong đợi 1 , bạn thường chỉ cần thoát các ký tự giống như trong XML . Bên trong một phần tử, phần tử này chỉ bao gồm ký hiệu thoát thực thể &và dấu phân cách phần tử nhỏ hơn và lớn hơn dấu hiệu < >:

& becomes &amp;
< becomes &lt;
> becomes &gt;

Bên trong các giá trị thuộc tính, bạn cũng phải thoát ký tự trích dẫn bạn đang sử dụng:

" becomes &quot;
' becomes &#39;

Trong một số trường hợp, có thể an toàn khi bỏ qua việc thoát khỏi một số nhân vật này, nhưng tôi khuyến khích bạn nên thoát khỏi tất cả năm trường hợp trong tất cả các trường hợp để giảm cơ hội phạm sai lầm.

Nếu mã hóa tài liệu của bạn không hỗ trợ tất cả các ký tự bạn đang sử dụng, chẳng hạn như nếu bạn đang cố sử dụng biểu tượng cảm xúc trong tài liệu được mã hóa ASCII, bạn cũng cần phải thoát các ký tự đó. Hầu hết các tài liệu ngày nay được mã hóa bằng mã hóa UTF-8 hỗ trợ Unicode đầy đủ trong trường hợp không cần thiết.

Nói chung, bạn không nên thoát khỏi không gian như &nbsp;. &nbsp;không phải là một không gian bình thường, nó là một không gian không phá vỡ . Bạn có thể sử dụng những từ này thay vì các khoảng trắng thông thường để ngăn ngắt dòng bị chèn giữa hai từ hoặc để thêm khoảng trắng mà không bị tự động thu gọn, nhưng đây thường là trường hợp hiếm gặp. Đừng làm điều này trừ khi bạn có một ràng buộc thiết kế đòi hỏi nó.


1 Theo "vị trí dự kiến ​​nội dung văn bản", ý tôi là bên trong một phần tử hoặc giá trị thuộc tính được trích dẫn trong đó áp dụng quy tắc phân tích cú pháp thông thường. Ví dụ: <p>HERE</p>hoặc <p title="HERE">...</p>. Những gì tôi đã viết ở trên không áp dụng cho nội dung có các quy tắc hoặc ý nghĩa phân tích cú pháp đặc biệt, chẳng hạn như bên trong thẻ script hoặc kiểu, hoặc như một tên thành phần hoặc thuộc tính. Ví dụ: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script>, hoặc <p NOT-HERE="...">...</p>.

Trong các bối cảnh này, các quy tắc phức tạp hơn và việc giới thiệu lỗ hổng bảo mật dễ dàng hơn nhiều. Tôi đặc biệt không khuyến khích bạn chèn nội dung động vào bất kỳ vị trí nào trong số này. Tôi đã thấy các nhóm các nhà phát triển nhận thức bảo mật có thẩm quyền giới thiệu các lỗ hổng bằng cách giả định rằng họ đã mã hóa các giá trị này một cách chính xác, nhưng thiếu một trường hợp cạnh. Thường có một sự thay thế an toàn hơn, chẳng hạn như đặt giá trị động vào một thuộc tính và sau đó xử lý nó bằng JavaScript.

Nếu bạn phải, vui lòng đọc Quy tắc phòng ngừa XSS của Dự án bảo mật ứng dụng web mở để giúp hiểu một số vấn đề bạn cần lưu ý.


2
Một số giá trị thuộc tính HTML cũng có thể có ý nghĩa đặc biệt (JS / CSS). Vì vậy, nó cũng không áp dụng cho những điều này, ví dụ: <p onclick="NOT-HERE">...</p><p style="NOT-HERE">...</p>.
geekley

21

Nó phụ thuộc vào bối cảnh. Một số bối cảnh có thể có trong HTML:

  • cơ quan tài liệu
  • bên trong thuộc tính chung
  • bên trong thẻ script
  • bên trong thẻ phong cách
  • nhiều hơn nữa

Xem Bảng cheat Ngăn chặn kịch bản chéo trang web của OWASP , đặc biệt là phần " Tại sao tôi không thể mã hóa thực thể HTML không mã hóa? " Và " Quy tắc phòng ngừa XSS ". Tuy nhiên, tốt nhất là đọc toàn bộ tài liệu.


9

Về cơ bản, có ba ký tự chính phải luôn được thoát trong các tệp HTML và XML của bạn, vì vậy chúng không tương tác với phần còn lại của các đánh dấu, vì vậy, như bạn có thể mong đợi, hai trong số chúng sẽ là các trình bao bọc cú pháp, là < >, chúng được liệt kê như dưới đây:

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)

Ngoài ra, chúng tôi có thể sử dụng trích dẫn kép (") là" và trích dẫn đơn (') là & apos

Tránh đưa nội dung động vào <script><style> các quy tắc này không được áp dụng cho chúng. Ví dụ: nếu bạn phải đưa JSON vào a, thay thế <bằng \ x3c, ký tự U + 2028 bằng \ u2028 và U + 2029 bằng \ u2029 sau khi tuần tự hóa JSON.)

Nhân vật thoát HTML: Danh sách đầy đủ: http://www.theukwebdesigncompany.com/articles/entity-escape-char character.php

Vì vậy, bạn cần phải thoát <, hoặc & khi được theo dõi bởi bất kỳ thứ gì có thể bắt đầu tham chiếu ký tự. Ngoài ra Quy tắc về ký hiệu là quy tắc duy nhất như vậy cho các thuộc tính được trích dẫn, vì dấu ngoặc kép phù hợp là điều duy nhất sẽ chấm dứt một thuộc tính. Nhưng nếu bạn không muốn chấm dứt giá trị thuộc tính ở đó, hãy thoát dấu ngoặc kép.

Thay đổi thành UTF-8 có nghĩa là lưu lại tệp của bạn:

Sử dụng mã hóa ký tự UTF-8 cho trang của bạn có nghĩa là bạn có thể tránh được nhu cầu thoát hầu hết và chỉ hoạt động với các ký tự. Tuy nhiên, lưu ý rằng để thay đổi mã hóa tài liệu của bạn, việc thay đổi khai báo mã hóa ở đầu trang hoặc trên máy chủ là không đủ. Bạn cần lưu lại tài liệu của mình trong bảng mã đó. Để được trợ giúp hiểu cách thực hiện điều đó với ứng dụng của bạn, hãy đọc Cài đặt mã hóa trong các ứng dụng tác giả web.

Nhân vật vô hình hoặc mơ hồ:

Một vai trò đặc biệt hữu ích cho việc trốn thoát là đại diện cho các nhân vật vô hình hoặc mơ hồ trong cách trình bày.

Một ví dụ sẽ là ký tự Unicode U + 200F RIGHT-TO-LEFT Mark. Ký tự này có thể được sử dụng để làm rõ tính định hướng trong văn bản hai chiều (ví dụ: khi sử dụng các tập lệnh tiếng Ả Rập hoặc tiếng Do Thái). Tuy nhiên, nó không có hình thức đồ họa, vì vậy rất khó để xem các ký tự này ở đâu trong văn bản và nếu chúng bị mất hoặc bị lãng quên, chúng có thể tạo ra kết quả bất ngờ trong quá trình chỉnh sửa sau này. Thay vào đó, việc sử dụng (hoặc tương đương tham chiếu ký tự số của nó) giúp bạn dễ dàng phát hiện ra các ký tự này.

Một ví dụ về một nhân vật mơ hồ là KHÔNG GIAN U + 00A0 NO-BREAK. Loại không gian này ngăn chặn ngắt dòng, nhưng nó trông giống như bất kỳ không gian nào khác khi được sử dụng làm ký tự. Sử dụng làm cho nó khá rõ ràng nơi các không gian như vậy xuất hiện trong văn bản.


3

Câu trả lời chính xác phụ thuộc vào ngữ cảnh. Nói chung, các ký tự này không được có mặt ( HTML 5.2 §3.2.4.2.5 ):

Các nút văn bản và giá trị thuộc tính phải bao gồm các ký tự Unicode, không được chứa các ký tự U + 0000, không được chứa các ký tự Unicode không xác định vĩnh viễn (không ký tự) và không được chứa các ký tự điều khiển ngoài các ký tự khoảng trắng. Đặc tả này bao gồm các ràng buộc bổ sung về giá trị chính xác của các nút Văn bản và giá trị thuộc tính tùy thuộc vào ngữ cảnh chính xác của chúng.

Đối với các phần tử trong HTML, các ràng buộc của mô hình nội dung Văn bản cũng phụ thuộc vào loại phần tử. Chẳng hạn, một "<" bên trong một phần tử textarea không cần phải thoát trong HTML vì textarea là một phần tử văn bản thô có thể thoát được.

Những hạn chế này nằm rải rác trong đặc điểm kỹ thuật. Ví dụ: các giá trị thuộc tính ( §8.1.2.3 ) không được chứa ký hiệu không rõ ràng(i) trống, (ii) trong các dấu ngoặc đơn (và do đó không được chứa ký tự U + 0027 APOSTROPHE '), (iii) trong dấu ngoặc kép ( không được chứa ký tự đánh dấu U + 0022 ") hoặc (iv) không được trích dẫn - với các hạn chế sau:

... không được chứa bất kỳ ký tự không gian bằng chữ nào, bất kỳ ký tự U + 0022 QUOTATION MARK ("), ký tự U + 0027 APOSTROPHE ('), ký tự U + 003D THIẾT BỊ (=), ký tự U + 003C LESS-THAN SIGN ( <), U + 003E ký tự TUYỆT VỜI-THAN (>) hoặc ký tự U + 0060 GRAVE ACCENT (`) và không được là chuỗi trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.