2010-01-27 47 views
13

Làm cách nào để đảm bảo tôi không thoát khỏi điều gì đó hai lần?Thoát html trong Java

Tôi đã nghe rằng thực hành tốt của nó để thoát khỏi các giá trị khi bạn nhận được chúng từ một biểu mẫu và cũng thoát khi bạn xuất. Bằng cách đó bạn có hai cơ hội để bắt một cái gì đó.

+5

Bài viết của Joel Spolsky * Làm cho mã trông sai * bài viết - http://www.joelonsoftware.com/articles/Wrong.html - là về loại vấn đề chính xác này. – mob

+0

Tôi thực sự thích bài viết đó :) – Kyle

+0

Thực sự tốt. – pastapockets

Trả lời

18

Tôi giả sử bạn đang sử dụng JSP.

Chỉ cần thoát trong khi đang hiển thị chỉ. Có thẻ JSTL<c:out> là hoàn toàn phù hợp. Nó trốn thoát các thực thể HTML theo mặc định. Sử dụng nó để hiển thị mọi đầu vào do người dùng kiểm soát, chẳng hạn như URL yêu cầu, tiêu đề yêu cầu và thông số yêu cầu.

Ví dụ:

<input type="text" name="foo" value="<c:out value="${param.foo}" />"> 

Thoát trong khi nhập là không cần thiết. XSS không gây hại trong mã Java thô hoặc trong cơ sở dữ liệu SQL. Mặt khác, bạn cũng muốn lưu dữ liệu chưa được sửa đổi trong DB để bạn vẫn có thể thấy những gì người dùng thực sự đã nhập, để bạn có thể thực hiện các hành động trên mạng xã hội trên người dùng có hiệu quả.

Nếu bạn muốn biết những gì cần thoát trong khi nhập, nó sẽ là SQL injection. Trong trường hợp này, chỉ cần sử dụng PreparedStatement thay vì thường xuyên Statement bất cứ khi nào bạn muốn lưu bất kỳ đầu vào nào do người dùng kiểm soát vào cơ sở dữ liệu.

Ví dụ:

create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))"); 
create.setString(1, username); 
create.setString(2, password); 
create.executeUpdate(); 
+0

Tôi hiện đang bị thuyết phục để chỉ thoát ra trong khi hiển thị. Tôi tự hỏi tại sao Spring lại có 'defaultHtmlEscape' cho các form? – Kyle

+0

@Spines: bloat khuôn khổ? –

+0

Không phải là một tùy chọn để đặt "htmlescape" theo mặc định ... và htmlescape có nghĩa là nó sẽ ghi các giá trị vào biểu mẫu html cuối cùng đã thoát? Một cái gì đó như helios

3

Bạn chỉ nên html mã hóa khi bạn xuất nội dung nào đó vào trình duyệt. Điều này ngăn chặn các cuộc tấn công XSS. Loại thoát mà bạn thực hiện khi bạn thu thập dữ liệu từ biểu mẫu, trước khi bạn chèn nó vào cơ sở dữ liệu là không phải là mã hóa html. Nó thoát khỏi các ký tự cơ sở dữ liệu đặc biệt (được thực hiện tốt nhất bằng cách sử dụng các truy vấn được tham số hóa). Mục đích của việc này là để ngăn chặn các cuộc tấn công SQL injection. Vì vậy, không có mã hóa kép đang diễn ra.

2

Nội dung vô hại trong một ngữ cảnh có thể nguy hiểm trong một ngữ cảnh khác. Cách tốt nhất để tránh các cuộc tấn công tiêm là chuẩn bị nội dung trước khi chuyển nó sang ngữ cảnh khác. Trong trường hợp văn bản html của bạn thay đổi ngữ cảnh của nó khi nó được truyền cho trình duyệt. Máy chủ không hiển thị html nhưng trình duyệt thực hiện. Vì vậy, hãy chắc chắn để vượt qua không có độc hại html để trình duyệt và mặt nạ nó trước khi gửi.

Một lý lẽ khác để làm như vậy là có thể mã tấn công được lắp ráp trong ứng dụng từ hai đầu vào nhiều hơn. Mỗi đầu vào đều vô hại nhưng cùng nhau chúng có thể trở nên nguy hiểm.

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