Hướng dẫn why should i escape html? - tại sao tôi phải thoát khỏi html?

Từ kinh nghiệm của tôi, tất cả các chuỗi nên đượ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à về việc 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, bạn có thể kết thúc với mã sau để hiển thị bản ghi có tên User

 <%=request.getAttribute("Name");%> 

Sau khi trang được hiển thị, nó sẽ trở thành

 User  

Mà thực sự xuất hiện dưới dạng siêu liên kết User trên trang.

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

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

Sau khi trang được hiển thị, nó sẽ trở thành

  User <Marketing> 

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

Một thời gian ngắn, bạn sử dụng các ký tự HTML thoát để ngăn chặ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 quá trình kết xuất

Theo các nguyên tắc bảo mật, chúng tôi thường được dạy để vệ sinh các trường đầu vào cho các ký tự như & hoặc ' để chúng không thể được sử dụng để tiêm SQL, v.v.

Tuy nhiên, bây giờ tôi có một vấn đề: Tôi thực sự cần lưu trữ một đầu vào chuỗi có chứa các ký tự này. Đó là một yêu cầu kinh doanh. Máy quét mã của tôi chắc chắn sẽ gắn cờ điều này thành một cảnh báo cảnh báo vì đây là lỗ hổng SQL cổ điển nếu tôi không vệ sinh đầu vào. Cơ sở dữ liệu của tôi sau đó sẽ lưu trữ chuỗi & thay vì & (chỉ là một ví dụ). Nhưng đây không phải là những gì chúng tôi muốn. Chúng tôi thực sự muốn theo nghĩa đen & hoặc ' được lưu trữ trong cơ sở dữ liệu.

Những cách tốt để làm điều này là gì?

Avid ♦

72.4K22 Huy hiệu vàng137 Huy hiệu bạc218 Huy hiệu đồng22 gold badges137 silver badges218 bronze badges

Hỏi ngày 21 tháng 8 năm 2015 lúc 10:40Aug 21, 2015 at 10:40

Hướng dẫn why should i escape html? - tại sao tôi phải thoát khỏi html?

Pang Ser Larkpang Ser LarkPang Ser Lark

1.9212 Huy hiệu vàng16 Huy hiệu bạc27 Huy hiệu đồng2 gold badges16 silver badges27 bronze badges

4

Bất kỳ máy quét phân tích tĩnh tốt nào cũng sẽ không đánh dấu lỗ hổng nếu bạn đang lưu trữ HTML thô trong cơ sở dữ liệu của mình - sau tất cả, đó chỉ là một chuỗi.

Chuỗi chuỗi chỉ trở nên nguy hiểm khi được truyền qua "chức năng chìm".

Ví dụ,

 User  
2 hoàn toàn an toàn để lưu trữ trong cơ sở dữ liệu của bạn. Trong thực tế là
 User  
3.

Cái sau chỉ nguy hiểm khi nó được chuyển từ một biến chuỗi và được nối với một truy vấn được mã hóa cứng trong ứng dụng vì toàn bộ chuỗi được chuyển đến máy chủ cơ sở dữ liệu và nó không biết sự khác biệt giữa truy vấn và dữ liệu. Đây là lý do tại sao bạn nên sử dụng các truy vấn được tham số hóa để truyền dữ liệu vào cơ sở dữ liệu của bạn - sau đó DB biết những gì cần diễn giải là dữ liệu được gõ mạnh và những gì cần diễn giải khi truy vấn tự xây dựng.

Khi xuất vào trình duyệt, đây là nơi bạn cần mã hóa khi thích hợp. Thông thường bạn sẽ xuất ra HTML, vì vậy bạn cần mã hóa HTML (& trở thành

 User  
5 như bạn nói). Nếu bạn sẽ xuất ra JSON hoặc JavaScript (không mặc dù đó là một bãi mìn) thì bạn nên xuất văn bản bằng mã hóa Hex Entity thay thế (
 User  
6).

Đã trả lời ngày 22 tháng 8 năm 2015 lúc 7:23Aug 22, 2015 at 7:23

SilverlightfoxsilverlightfoxSilverlightFox

33.4K6 Huy hiệu vàng69 Huy hiệu bạc181 Huy hiệu Đồng6 gold badges69 silver badges181 bronze badges

6

Nếu bạn sẽ tồn tại các ký tự đó, hãy đảm bảo rằng bạn đã sử dụng các biến liên kết (hoặc câu lệnh được chuẩn bị) để tồn tại chúng.

Sau đó, bạn cũng nên thêm mã hóa HTML khi hiển thị thông tin trên giao diện người dùng của bạn.

Đã trả lời ngày 21 tháng 8 năm 2015 lúc 11:19Aug 21, 2015 at 11:19

Hướng dẫn why should i escape html? - tại sao tôi phải thoát khỏi html?

Nếu bạn có thể tránh lưu trữ các nhân vật như vậy vì những lý do bạn đã đề cập (và những người khác), đó là điều tốt nhất cho bạn. Tuy nhiên, nếu bạn buộc phải liên quan đến mô hình kinh doanh của mình, bạn vẫn có một tùy chọn: bất kể ngôn ngữ lập trình nào bạn đang sử dụng, bạn luôn có thể dựa vào khái niệm truy vấn tham số để thực hiện mục tiêu đó. Bằng cách đó, bạn ngăn ngừa tiêm SQL.

Đã trả lời ngày 21 tháng 8 năm 2015 lúc 11:17Aug 21, 2015 at 11:17

1

HTML có cần trình tự thoát không?

Nếu các thuộc tính HTML không được trích dẫn, một số ký tự nhất định, quan trọng nhất là khoảng trắng, chẳng hạn như không gian và tab, phải được thoát ra bằng các thực thể.Các ngôn ngữ khác liên quan đến HTML có các phương pháp thoát khỏi các ký tự riêng.. Other languages related to HTML have their own methods of escaping characters.

Khi nào bạn nên thoát khỏi một chuỗi?

Thoát một chuỗi có nghĩa là để giảm sự mơ hồ trong các trích dẫn (và các ký tự khác) được sử dụng trong chuỗi đó.Chẳng hạn, khi bạn xác định một chuỗi, bạn thường bao quanh nó trong các trích dẫn kép hoặc trích dẫn đơn: "Xin chào, Thế giới."to reduce ambiguity in quotes (and other characters) used in that string. For instance, when you're defining a string, you typically surround it in either double quotes or single quotes: "Hello, World."