2012-01-25 24 views
34

Khi mã hóa dữ liệu có thể không an toàn, có lý do nào để mã hóa > không?HTML: Tôi có nên mã hóa lớn hơn hay không? (> >)

  • validates một trong hai cách.
  • Trình duyệt giải thích cùng một trong hai cách, (Trong trường hợp attr="data", attr='data', <tag>data</tag>)

Tôi nghĩ rằng lý do ai đó sẽ làm điều này là

  • Để đơn giản hóa regex dựa loại bỏ thẻ. <[^>]+>? (hiếm)
  • Chuỗi không được trích dẫn attr=data. : -o (không xảy ra!)
  • Thẩm mỹ trong mã. (vì vậy cái gì?)

Tôi có thiếu gì không?

Trả lời

29

Nói đúng cách, để ngăn chặn việc tiêm HTML, bạn chỉ cần mã hóa <&lt;.

Nếu đầu vào của người dùng sẽ được đặt vào một thuộc tính, cũng mã hóa "&quot;.

Nếu bạn đang làm đúng và sử dụng các thuộc tính được trích dẫn chính xác, bạn không cần phải lo lắng về >. Tuy nhiên, nếu bạn không chắc chắn về điều này, bạn nên mã hóa nó chỉ để yên tâm - nó sẽ không làm hại gì cả.

+2

** Cảnh báo bảo mật: ** Câu trả lời này không đúng. Đối với một ví dụ cơ bản, ''' là một dấu ngoặc kép thuộc tính được chấp nhận và không thoát khỏi nó trong một thuộc tính như vậy là một vector tấn công. Ngoài ra còn có các vector tấn công khác tùy thuộc vào ngữ cảnh. –

+0

Đúng là '' 'có thể được sử dụng thay vì' "' cho báo giá thuộc tính. Trên thực tế, có thể thêm các thuộc tính không có dấu ngoặc kép. Nhà phát triển nên hiểu ứng dụng của mình mà không đưa ra giả định. tất cả các thuộc tính được trích dẫn bằng cách sử dụng tiêu chuẩn mới nhất '" 'để câu trả lời này đúng cho tôi. –

15

Các HTML4 đặc điểm kỹ thuật trong phần của nó 5.3.2 nói rằng

tác giả nên sử dụng "&gt;" (ASCII thập phân 62) trong văn bản thay vì ">"

vì vậy tôi tin rằng bạn nên mã hóa ký hiệu > lớn hơn là &gt; (vì bạn phải tuân theo các tiêu chuẩn).

+1

Nó là tốt để cố gắng tuân theo các tiêu chuẩn nếu có thể - nhưng tất cả chúng ta đều biết rằng không thể tuân thủ các tiêu chuẩn và làm cho trang web của bạn hoạt động trên tất cả các trình duyệt (và rõ ràng là các trình duyệt IE6). Vì vậy, thông thường được cho phép trong một số trường hợp nhất định - và nếu bạn có thể tạo một thứ gì đó hoạt động trên tất cả các trình duyệt hiện tại và bạn mong muốn làm việc trên tất cả các trình duyệt trong tương lai và thực hành phổ biến - thì tôi không chắc chắn rằng tiêu chuẩn. –

+1

Nhưng trong trường hợp của poster ban đầu, có thể, và đơn giản, để tuân thủ các tiêu chuẩn. Tại sao anh ta nên làm gì đó chống lại họ khi anh ta có thể tránh điều đó? –

+4

Tiêu chuẩn nói NÊN, không PHẢI. Và cụ thể hơn: "... để tránh các vấn đề với các tác nhân người dùng cũ". Điều đó có nghĩa, nếu bạn không nhắm mục tiêu các trình duyệt trước năm 1999, bạn không cần phải làm gì cả. – user123444555621

-2

Mã hóa các ký tự html luôn là một công việc tinh vi. Bạn nên luôn mã hóa những gì cần phải được mã hóa và luôn sử dụng các tiêu chuẩn. Sử dụng dấu ngoặc kép là tiêu chuẩn, và thậm chí dấu ngoặc kép bên trong dấu ngoặc kép sẽ được mã hóa. Luôn mã hóa ENCODE. Hãy tưởng tượng một cái gì đó như thế này

<div> this is my text an img></div> 

Có thể là img> sẽ được phân tích cú pháp từ trình duyệt dưới dạng thẻ hình ảnh. Trình duyệt luôn cố gắng giải quyết các thẻ hoặc dấu trích dẫn không được đính kèm. Như basile nói tiêu chuẩn sử dụng, nếu không bạn có thể có kết quả bất ngờ mà không hiểu nguồn gốc của lỗi.

+0

* "Có thể là img> sẽ được phân tích cú pháp từ trình duyệt dưới dạng thẻ hình ảnh" *, tôi nghĩ là không. –

+0

để bạn nghĩ là không, bạn có nghĩ vậy không? – albanx

+0

Vâng, [hãy xem những gì người khác nghĩ] (http://stackoverflow.com/questions/17685535/would-the-browser-ever-try-to-parse-img). –

0

Luôn

này là để ngăn chặn XSS tiêm (thông qua người dùng sử dụng bất kỳ biểu mẫu của mình nộp HTML thô hay javascript). Bằng cách thoát khỏi đầu ra của bạn, trình duyệt không biết phân tích cú pháp hoặc thực hiện bất kỳ thao tác nào - chỉ hiển thị nó dưới dạng văn bản.

Điều này có thể cảm thấy ít vấn đề hơn nếu bạn không xử lý đầu ra động dựa trên đầu vào của người dùng, tuy nhiên điều quan trọng là ít nhất phải hiểu, nếu không tạo thói quen tốt.

+2

Thoát '<' là để ngăn chặn tiêm XSS. Tôi không tin điều này áp dụng cho '>'. –

3

hiện phân tích cú pháp HTML trình duyệt không có vấn đề với uquoted > s

Tuy nhiên, thật không may, sử dụng biểu thức thông thường để "parse" HTML trong JS là khá phổ biến. (ví dụ: Ext.util.Format.stripTags). Các công cụ dòng lệnh viết kém, IDE, hoặc các lớp Java vv có thể không đủ tinh vi để xác định giới hạn của thẻ mở.

Vì vậy, bạn có thể gặp vấn đề với mã như thế này:

<script data-usercontent=">malicious();//"></script> 

(! Lưu ý cách xử lý cú pháp highlighter đoạn này)

+0

Tất nhiên, tùy thuộc vào hoàn cảnh, bạn có thể thực sự muốn thực hiện điều này nhằm mục đích phá vỡ các nỗ lực nghiệp dư khi phân tích cú pháp nội dung của bạn (xem https://xkcd.com/859/) –

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