2008-08-28 49 views

Trả lời

59

httpOnly được hỗ trợ như của Tomcat 6.0.19 và Tomcat 5.5.28.

Xem mục changelog cho lỗi 44382.

Các bình luận cuối cùng cho lỗi 44382 tiểu bang, "điều này đã được áp dụng cho 5.5.x và sẽ được đưa vào 5.5.28 trở đi." Tuy nhiên, nó không xuất hiện 5.5.28 đã được phát hành.

Chức năng HttpOnly có thể được kích hoạt cho tất cả các ứng dụng web trong conf/context.xml:

<Context useHttpOnly="true"> 
... 
</Context> 

giải thích của tôi là nó cũng làm việc cho một bối cảnh cá nhân bằng cách thiết lập nó trên mong muốn Context mục nhập trong conf/server.xml (giống như cách trên).

+0

Tôi đang chạy Tomcat 5.5.36. Thuộc tính useHttpOnly này dường như chỉ hoạt động đối với cookie JSESSIONID. Tôi đã thêm cờ này vào tất cả các ngữ cảnh của mình để đảm bảo tất cả cookie sẽ được thêm vào "; HttpOnly" ở cuối. Tuy nhiên, chỉ JSESSIONID bị ảnh hưởng như sau: 'Set-Cookie =' JSESSIONID = 25E8F ...; Đường dẫn =/đường dẫn tùy chỉnh; HttpOnly mycustomcookie1 = xxxxxxx; Đường dẫn =/ mycustomcookie2 = 1351101062602; Đường dẫn =/ mycustomcookie3 = 0; Đường dẫn =/ mycustomcookie4 = 1; Đường dẫn = /; Bảo mật mycustomcookie5 = 4000; Hết hạn = Sat, 22-Oct-2022 17:51:02 GMT; Đường dẫn =/ Có điều gì khác tôi đang làm sai không? –

+0

Tài liệu này dường như chỉ ra rằng cờ useHttpOnly chỉ liên quan đến cookie phiên id: http://tomcat.apache.org/tomcat-5.5-doc/config/context.html#Common_Attributes Tôi nghĩ đây là điểm dừng đo lường nhằm bảo vệ cookie phiên. Khả năng gắn cờ các cookie như HttpOnly không phải là một phần của đặc tả Servlet cho đến 3.0 (được bao phủ bởi Tomcat 7): http://today.java.net/pub/a/today/2008/10/14/introduction-to- servlet-3.html # other-linh tinh-thay đổi –

9

Đối với cookie phiên, có vẻ như nó chưa được hỗ trợ trong Tomcat. Xem báo cáo lỗi Need to add support for HTTPOnly session cookie parameter. Một công việc liên quan đến phần nào bây giờ có thể được tìm thấy here, mà về cơ bản nắm chặt để tự vá Tomcat. Không thể thực sự tìm thấy một cách dễ dàng để làm điều đó tại thời điểm này vào thời điểm này tôi đang sợ hãi.

Để tóm tắt các công việc xung quanh, nó liên quan đến tải 5,5 source, và sau đó thay đổi nguồn ở các vị trí sau:

org.apache.catalina.connector.Request.java

//this is what needs to be changed 
//response.addCookieInternal(cookie); 

//this is whats new 
response.addCookieInternal(cookie, true); 
} 

org.apache.catalina.connectorResponse.addCookieInternal

public void addCookieInternal(final Cookie cookie) { 
addCookieInternal(cookie, false); 
} 

public void addCookieInternal(final Cookie cookie, boolean HTTPOnly) { 

if (isCommitted()) 
return; 

final StringBuffer sb = new StringBuffer(); 
//web application code can receive a IllegalArgumentException 
//from the appendCookieValue invokation 
if (SecurityUtil.isPackageProtectionEnabled()) { 
AccessController.doPrivileged(new PrivilegedAction() { 
public Object run(){ 
ServerCookie.appendCookieValue 
(sb, cookie.getVersion(), cookie.getName(), 
cookie.getValue(), cookie.getPath(), 
cookie.getDomain(), cookie.getComment(), 
cookie.getMaxAge(), cookie.getSecure()); 
return null; 
} 
}); 
} else { 
ServerCookie.appendCookieValue 
(sb, cookie.getVersion(), cookie.getName(), cookie.getValue(), 
cookie.getPath(), cookie.getDomain(), cookie.getComment(), 
cookie.getMaxAge(), cookie.getSecure()); 
} 
//of course, we really need to modify ServerCookie 
//but this is the general idea 
if (HTTPOnly) { 
sb.append("; HttpOnly"); 
} 

//if we reached here, no exception, cookie is valid 
// the header name is Set-Cookie for both "old" and v.1 (RFC2109) 
// RFC2965 is not supported by browsers and the Servlet spec 
// asks for 2109. 
addHeader("Set-Cookie", sb.toString()); 

cookies.add(cookie); 
} 
19

Cập nhật: Công cụ JSESSIONID ở đây là chỉ dành cho các thùng chứa cũ hơn. Vui lòng sử dụng câu trả lời hiện tại của jt trừ khi bạn đang sử dụng < Tomcat 6.0.19 hoặc < Tomcat 5.5.28 hoặc một vùng chứa khác không hỗ trợ cookie HttpOnly JSESSIONID làm tùy chọn cấu hình.

Khi cài đặt cookie trong ứng dụng của bạn, sử dụng

response.setHeader("Set-Cookie", "name=value; HttpOnly"); 

Tuy nhiên, trong nhiều ứng dụng web, cookie quan trọng nhất là các định danh phiên, được tự động thiết lập bởi các container như cookie JSESSIONID.

Nếu bạn chỉ sử dụng cookie này, bạn có thể viết một ServletFilter để đặt lại cookie trên đường ra, buộc JSESSIONID để HttpOnly. Trang tại http://keepitlocked.net/archive/2007/11/05/java-and-httponly.aspx http://alexsmolen.com/blog/?p=16 đề xuất thêm nội dung sau vào bộ lọc.

if (response.containsHeader("SET-COOKIE")) { 
    String sessionid = request.getSession().getId(); 
    response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid 
         + ";Path=/<whatever>; Secure; HttpOnly"); 
} 

nhưng lưu ý rằng điều này sẽ ghi đè tất cả cookie và chỉ đặt những gì bạn nêu ở đây trong bộ lọc này.

Nếu bạn sử dụng cookie bổ sung cho cookie JSESSIONID, thì bạn sẽ cần mở rộng mã này để đặt tất cả cookie trong bộ lọc. Đây không phải là một giải pháp tuyệt vời trong trường hợp nhiều cookie, nhưng có lẽ là một sửa chữa nhanh có thể chấp nhận được cho thiết lập chỉ JSESSIONID. Vui lòng lưu ý rằng khi mã của bạn phát triển theo thời gian, có một lỗi ẩn khó chịu đang chờ bạn khi bạn quên bộ lọc này và thử và đặt cookie khác ở một nơi khác trong mã của bạn. Tất nhiên, nó sẽ không được thiết lập.

Đây thực sự là một bản hack. Nếu bạn sử dụng Tomcat và có thể biên dịch nó, sau đó hãy xem đề xuất tuyệt vời của Shabaz để vá hỗ trợ HttpOnly vào Tomcat.

+8

Mã này loại bỏ cờ an toàn, do đó việc sử dụng https vô nghĩa. –

+0

Trong Servlet máy chủ ứng dụng 3.0 khiếu nại tôi có thể thiết lập các HttpOnly và cờ an toàn cho cookie phiên (JSESSIONID) bằng cách thêm dòng sau vào web.xml: đúng đúng

+0

@RogerJin vui lòng đăng câu trả lời này làm câu trả lời mới, câu trả lời 6 năm này ngày càng trở nên lỗi thời. – Cheekysoft

14

Hãy cẩn thận đừng ghi đè cờ cookie "; bảo mật" trong https phiên. Cờ này ngăn trình duyệt gửi cookie qua kết nối http không được mã hóa, về cơ bản hiển thị việc sử dụng https cho các yêu cầu hợp pháp vô nghĩa.

private void rewriteCookieToHeader(HttpServletRequest request, HttpServletResponse response) { 
    if (response.containsHeader("SET-COOKIE")) { 
     String sessionid = request.getSession().getId(); 
     String contextPath = request.getContextPath(); 
     String secure = ""; 
     if (request.isSecure()) { 
      secure = "; Secure"; 
     } 
     response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid 
         + "; Path=" + contextPath + "; HttpOnly" + secure); 
    } 
} 
+2

Lưu ý rằng việc sử dụng 'request.isSecure()' không phải lúc nào cũng chính xác. Xem xét một nút cân bằng tải phía sau LB thực hiện tăng tốc SSL. Yêu cầu từ trình duyệt đến bộ cân bằng tải sẽ đi qua HTTPS, trong khi yêu cầu giữa cân bằng tải và máy chủ thực tế sẽ đến qua HTTP thuần túy. Điều này sẽ dẫn đến 'request.isSecure()' là 'false', trong khi trình duyệt đang sử dụng SSL. – Anton

2

cũng cần lưu ý rằng việc bật HttpOnly sẽ phá vỡ các ứng dụng yêu cầu truy cập trạng thái trở lại jvm.

yêu cầu http Applet sẽ không sử dụng cookie jsessionid và có thể được chỉ định cho một tomcat khác.

2

Đối với cookie mà tôi đặt rõ ràng, tôi đã chuyển sang sử dụng SimpleCookie do Apache Shiro cung cấp. Nó không kế thừa từ javax.servlet.http.Cookie vì vậy nó mất nhiều hơn một chút tung hứng để có được tất cả mọi thứ để làm việc một cách chính xác tuy nhiên nó cung cấp một thuộc tính HttpOnly và nó hoạt động với Servlet 2.5.

Để đặt cookie trên phản hồi, thay vì thực hiện response.addCookie(cookie), bạn cần thực hiện cookie.saveTo(request, response).

6

Nếu máy chủ web Serlvet 3.0 của bạn, như tomcat 7.0+, bạn có thể sử dụng dưới đây trong web.xml như:

<session-config> 
    <cookie-config> 
    <http-only>true</http-only>   
    <secure>true</secure>   
    </cookie-config> 
</session-config> 

Như đã đề cập trong tài liệu:

HttpOnly: Chỉ định cho dù bất kỳ phiên theo dõi các tập tin cookie được tạo ra bởi ứng dụng web này sẽ được đánh dấu là HttpOnly

Bảo mật: Chỉ định cho dù bất kỳ cookie theo dõi phiên nào được tạo bởi ứng dụng web này sẽ được đánh dấu là an toàn ngay cả khi yêu cầu mà khởi xướng phiên tương ứng được sử dụng HTTP đồng bằng thay vì HTTPS

Vui lòng tham khảo how to set httponly and session cookie for java web appliaction

0

Trong Tomcat6, Bạn có điều kiện có thể kích hoạt từ HTTP của bạn Listener Class:

public void contextInitialized(ServletContextEvent event) {     
    if (Boolean.getBoolean("HTTP_ONLY_SESSION")) HttpOnlyConfig.enable(event); 
} 

Sử dụng lớp này

import java.lang.reflect.Field; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import org.apache.catalina.core.StandardContext; 
public class HttpOnlyConfig 
{ 
    public static void enable(ServletContextEvent event) 
    { 
     ServletContext servletContext = event.getServletContext(); 
     Field f; 
     try 
     { // WARNING TOMCAT6 SPECIFIC!! 
      f = servletContext.getClass().getDeclaredField("context"); 
      f.setAccessible(true); 
      org.apache.catalina.core.ApplicationContext ac = (org.apache.catalina.core.ApplicationContext) f.get(servletContext); 
      f = ac.getClass().getDeclaredField("context"); 
      f.setAccessible(true); 
      org.apache.catalina.core.StandardContext sc = (StandardContext) f.get(ac); 
      sc.setUseHttpOnly(true); 
     } 
     catch (Exception e) 
     { 
      System.err.print("HttpOnlyConfig cant enable"); 
      e.printStackTrace(); 
     } 
    } 
} 
Các vấn đề liên quan