2013-02-08 34 views
6

Trong dự án kế thừa của tôi, tôi có thể thấy việc sử dụng escapeHtml trước khi chuỗi được gửi tới trình duyệt.Khi nào tôi cần thoát chuỗi Html?

StringEscapeUtils.escapeHtml(stringBody); 

Tôi biết từ api doc gì escapeHtml does.here là ví dụ đưa ra: -

For example: 
"bread" & "butter" 
becomes: 
"bread" & "butter". 

hiểu biết của tôi là khi chúng tôi gửi các chuỗi sau khi thoát html của nó trách nhiệm trình duyệt có thể chuyển đổi trở lại ký tự gốc. Có đúng không?

Nhưng tôi không nhận được lý do tại sao và khi nào được yêu cầu và điều gì xảy ra nếu chúng tôi gửi nội dung chuỗi mà không cần thoát html? chi phí là gì nếu chúng tôi không thực hiện escapeHtml trước khi gửi tới trình duyệt

Trả lời

9

tôi có thể nghĩ ra một vài khả năng để giải thích lý do tại sao đôi khi một chuỗi không thoát:

  • lẽ các lập trình viên ban đầu là tự tin rằng ở nơi nào đó chuỗi không có ký tự đặc biệt (tuy nhiên, theo ý kiến ​​của tôi này sẽ là thực hành lập trình kém; chi phí rất ít để thoát chuỗi như bảo vệ chống lại các thay đổi trong tương lai)
  • chuỗi đã được thoát tại thời điểm đó trong mã. Bạn chắc chắn không muốn thoát khỏi một chuỗi hai lần; người dùng cuối cùng sẽ thấy trình tự thoát thay vì văn bản dự định.
  • Chuỗi là chính html thực tế. Bạn không muốn thoát khỏi html; bạn muốn trình duyệt xử lý nó!

EDIT - Lý do thoát là ký tự đặc biệt như &< có thể kết thúc khiến trình duyệt để hiển thị một cái gì đó khác với những gì bạn dự định. & là một lỗi kỹ thuật trong html. Hầu hết các trình duyệt cố gắng xử lý thông minh với các lỗi như vậy và sẽ hiển thị chúng một cách chính xác trong hầu hết các trường hợp. (Điều này gần như chắc chắn sẽ xảy ra trong văn bản ví dụ của bạn nếu chuỗi là văn bản trong một ví dụ <div>). Tuy nhiên, vì nó là đánh dấu xấu, một số trình duyệt sẽ không hoạt động tốt; công nghệ hỗ trợ (ví dụ: chuyển văn bản thành giọng nói) có thể không thành công; và có thể có những vấn đề khác.

Có một số trường hợp sẽ không thành công mặc cho những nỗ lực tốt nhất của trình duyệt để khôi phục từ đánh dấu không tốt. Nếu chuỗi mẫu của bạn là một giá trị thuộc tính, việc thoát dấu ngoặc kép sẽ hoàn toàn bắt buộc. Không có cách nào mà một trình duyệt sẽ xử lý một cách chính xác cái gì đó như:

<img alt=""bread" & "butter"" ... > 

Nguyên tắc chung là bất kỳ nhân vật mà không được đánh dấu nhưng có thể bị nhầm lẫn như đánh dấu cần phải được thoát.

Lưu ý rằng có một số ngữ cảnh trong đó văn bản có thể xuất hiện trong tài liệu html và chúng có các yêu cầu riêng để thoát. Trong các giá trị thuộc tính, bạn cần phải thoát khỏi dấu ngoặc kép và dấu và (nhưng không phải là <). Bạn phải thoát khỏi các ký tự không có đại diện trong bộ ký tự của tài liệu (không chắc nếu bạn đang sử dụng UTF-8, nhưng đó không phải luôn luôn như vậy).Trong các nút văn bản, chỉ cần thoát được &<. Trong các giá trị href, các ký tự cần thoát trong url phải được thoát (và đôi khi bị thoát kép để chúng vẫn bị thoát sau khi trình duyệt không thoát chúng một lần). Trong một khối CDATA, thông thường không có gì phải được thoát (ở cấp HTML).

Cuối cùng, ngoài nguy cơ thoát kép, chi phí thoát tất cả văn bản là tối thiểu: một chút xử lý bổ sung và một vài byte phụ trên mạng.

+0

Ted Một lần nữa câu hỏi của tôi là cách HTML thoát giúp gửi thông tin tới trình duyệt? Nếu chúng tôi không làm như vậy thì chi phí là bao nhiêu? –

+0

@MSach - Tôi mở rộng câu trả lời của mình. –

+0

Cảm ơn Ted đã giải thích chi tiết. Một câu hỏi nữa là khi chúng tôi gửi nhân vật & lt đến trình duyệt, Trình duyệt có chuyển đổi ký tự đó (trong trường hợp này & lt thành <) tự động trước khi hiển thị nó không? –

2

bạn phải thoát khỏi html hoặc xml khi có khả năng nó được hiểu cùng với html được tạo trang (đọc jsp).

điều này tốt question cũng giải thích điều đó.

3

HTML (ngày nay chúng ta nên nói XML) xác định nhiều ký tự "đặc biệt", có nghĩa là các ký tự này có ý nghĩa đặc biệt đối với trình duyệt tương phản với ký tự "bình thường". Ví dụ: chuỗi "Hello, World!" chỉ chứa các ký tự "bình thường" và do đó nó có nghĩa là "Hello, World!" cho trình duyệt. Chuỗi "<b>Hello, World!</b>", chứa các ký tự đặc biệt '<', '>''/' và đối với trình duyệt, điều đó có nghĩa là: typeset string "Hello, World!" in bold thay vì chỉ typeset "<b>Hello, World!</b>".

Phương pháp escapeHtml (String) có thể (tôi không thể chắc chắn vì tôi không biết cách thực hiện) chuyển đổi chuỗi tùy ý thành mã HTML để hướng dẫn trình duyệt sắp xếp chuỗi này theo nghĩa đen. Ví dụ: escapeHtml ("<b>Hello, World!</b>") whill return HTML code sẽ được trình duyệt hiểu là typeset "<b>Hello, World!</b>" normally thay vì typeset string "Hello, World!" in bold. Nếu phương thức escapeHtml (String) được triển khai chính xác, bạn không nên quan tâm cách mã HTML được tạo ra bằng phương thức này trông như thế nào. Chỉ cần sử dụng nó, nơi bạn muốn yêu cầu trình duyệt để sắp xếp một số chuỗi theo nghĩa đen.

1

Từ kinh nghiệm của tôi, tất cả các chuỗi phải được thoát khỏi Html trước khi được hiển thị trên trang. Dự án hiện tại của chúng tôi là quản lý tất cả các đơn vị tổ chức từ Active Directory và các đơn vị này có thể chứa bất kỳ ký tự đặc biệt nào (bao gồm cả ký tự Html). Khi hiển thị trên trang web, bạn có thể kết thúc với đoạn mã sau để hiển thị một kỷ lục gọi User <Marketing>

<a href="viewDetail.do"> <%=request.getAttribute("Name");%> </a> 

sau khi trang được trả lại, nó sẽ trở thành

<a href="viewDetail.do"> User <Marketing> </a> 

nào thực sự xuất hiện như User siêu liên kết trên trang.

Tuy nhiên, nếu bạn thoát khỏi giá trị Html trước khi gửi để trang

request.setAttribute("Name", StringEscapeUtils.escapeHtml("User <Marketing>")); 

sau khi trang được trả lại, nó sẽ trở thành

<a href="viewDetail.do"> User &lt;Marketing&gt; </a> 

mà xuất hiện một cách chính xác trên trang JSP

Một thời gian ngắn, bạn sử dụng thoát ký tự Html để ngăn đầu vào đặc biệt. Nếu đầu vào chứa ký tự Html, trang của bạn sẽ xuất hiện sai trong khi hiển thị

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