2012-11-06 37 views
7

Tôi đã xem qua một số post on Meta SO và tôi tò mò về những khác biệt tinh tế giữa HTML và mã hóa Thuộc tính là gì.HTML và mã hóa thuộc tính

+2

Sự khác nhau giữa những gì? Câu hỏi của bạn dường như thiếu một vài từ. – Dai

+1

Có thể OP so sánh và & cam; nhưng tôi không thể thấy sự giống nhau. –

Trả lời

9

Mã hóa HTML thay thế các ký tự nhất định có ý nghĩa ngữ nghĩa trong đánh dấu HTML, với các ký tự tương đương có thể được hiển thị cho người dùng mà không ảnh hưởng đến việc phân tích đánh dấu.

Các nhân vật quan trọng và rõ ràng nhất là <,>, &, và "được được thay thế bằng &lt;, &gt;, &amp;&quot;, tương ứng. Thêm vào đó, một bộ mã hóa có thể thay thế nhân vật bậc cao với các thực thể HTML tương đương mã hóa, do đó nội dung có thể được giữ nguyên và được hiển thị chính xác ngay cả trong trường hợp trang được gửi tới trình duyệt dưới dạng ASCII. chuỗi ký tự từ phá vỡ thuộc tính của phần tử HTML. Cụ thể, bạn thường chỉ thay thế ", & và < với &quot;, &amp;&lt;. Điều này là do bản chất của các thuộc tính, dữ liệu mà chúng chứa và cách chúng được phân tích cú pháp và giải thích bởi trình duyệt hoặc trình phân tích cú pháp HTML khác với cách một tài liệu HTML và các phần tử của nó được đọc.


Xét về làm thế nào mà liên quan đến XSS, bạn muốn để khử trùng đúng chuỗi từ một nguồn bên ngoài (ví dụ như người dùng) để họ không phá vỡ trang của bạn, hoặc quan trọng hơn, tiêm markup và kịch bản có thể thay đổi hoặc phá hủy ứng dụng của bạn hoặc ảnh hưởng đến máy của người dùng của bạn (bằng cách tận dụng các lỗ hổng của trình duyệt hoặc nền tảng).

Nếu bạn muốn hiển thị nội dung do người dùng tạo trong trang, bạn sẽ mã hóa chuỗi và sau đó hiển thị nó trong đánh dấu của bạn và mọi thứ họ nhập sẽ được hiển thị theo nghĩa đen mà không lo lắng XSS hoặc đánh dấu bị hỏng.

Nếu bạn cần đính kèm nội dung do người dùng tạo vào thành phần trong thuộc tính (ví dụ: tooltip trên liên kết), bạn phải mã hóa để đảm bảo nội dung không phá vỡ đánh dấu của phần tử.

Bạn có thể sử dụng cùng chức năng cho mã hóa HTML để xử lý mã hóa thuộc tính không? Về mặt kỹ thuật, vâng. Trong trường hợp của câu hỏi meta bạn đã liên kết, có vẻ như họ đang sử dụng HTML đã được mã hóa và giải mã nó, sau đó sử dụng kết quả đó làm giá trị thuộc tính, dẫn đến đánh dấu được mã hóa hiển thị theo nghĩa đen.

+0

Vì HTML5 hỗ trợ các thuộc tính trích dẫn kép, trích dẫn đơn lẻ và thuộc tính quoteless, lời khuyên của bạn về các ký tự thoát trong các thuộc tính là KHÔNG đủ trong trường hợp chung. Chỉ giả sử bạn luôn sử dụng các thuộc tính được trích dẫn kép và không bao giờ dính dữ liệu vào trình xử lý sự kiện javascript như onclick. – Erlend

+0

Xem mã để mã hóa thuộc tính tại đây: https://github.com/chrisisbeef/jquery-encoder/blob/master/src/main/javascript/org/owasp/esapi/jquery/encoder.js – Erlend

+0

Chỉ cần chỉnh sửa nhỏ. Từ đoạn thứ hai: "Cụ thể, bạn thường chỉ thay thế", &, và

3

Tôi khuyên bạn nên xem qua OWASP XSS Prevention Rules 1 and 2.
Một bản tóm tắt ngắn gọn ...

Quy tắc 1 cho HTML

thoát các ký tự sau với mã hóa thực thể HTML ...
& ->&amp;
< ->&lt;
> ->&gt;
" ->&quot;
' ->&#x27;
/ ->&#x2F;

Rule 2 cho HTML Common Thuộc tính

Trừ cho các ký tự chữ và số, thoát khỏi tất cả các ký tự với các giá trị ASCII ít hơn 256 với & #xHH; định dạng (hoặc thực thể được đặt tên nếu có) để ngăn việc chuyển đổi khỏi thuộc tính. Lý do quy tắc này là quá rộng là các nhà phát triển thường xuyên để lại các thuộc tính unquoted. Các thuộc tính được trích dẫn đúng chỉ có thể được thoát bằng dấu ngoặc kép tương ứng. Các thuộc tính không được trích dẫn có thể được chia nhỏ với nhiều ký tự, bao gồm [dấu cách]% * +, - /; < =>^và |.

Các vấn đề liên quan