2010-06-07 10 views
11

Tôi đang cố đặt cờ httponly trên cookie JSESSIONID. Tuy nhiên, tôi đang làm việc trong Java EE 5 và không thể sử dụng setHttpOnly(). Trước tiên, tôi đã cố gắng tạo cookie JSESSIONID của riêng mình từ trong số doPost() của servlet bằng cách sử dụng response.setHeader().Đặt httponly trong cookie JSESSIONID (Java EE 5)

Khi điều đó không hiệu quả, tôi đã thử response.addHeader(). Điều đó cũng không hiệu quả. Sau đó, tôi đã học được rằng servlet đã xử lý chuyển đổi phiên thành một cookie JSESSIONID và chèn nó vào tiêu đề http vì vậy nếu tôi muốn chơi với cookie đó, tôi sẽ phải viết một bộ lọc. Tôi đã viết một bộ lọc và chơi với setHeader()/addHeader() ở đó, một lần nữa không có kết quả. Sau đó, tôi đã học được rằng có một số hành động xả/đóng đang diễn ra trong đối tượng phản hồi trước khi nó vào bộ lọc vì vậy nếu tôi muốn thao tác dữ liệu, tôi cần mở rộng HttpServletResponseWrapper và chuyển nó tới filterChain.doFilter(). Điều này được thực hiện nhưng tôi vẫn chưa nhận được kết quả. Rõ ràng tôi đang làm điều gì đó sai trái nhưng tôi không biết điều gì.

Tôi không chắc chắn nếu điều này là có liên quan đến tất cả các câu hỏi trong tầm tay nhưng không có tài liệu html đang được trả lại bởi servlet cho trình duyệt. Tất cả những gì thực sự xảy ra là một số đối tượng đang được phổ biến và trả về một tài liệu JSP. Tôi đã giả định rằng đối tượng Session được chuyển thành một cookie JSESSIONID và được gói - cùng với các đối tượng được thêm vào yêu cầu - trong tiêu đề http trước khi được gửi đến trình duyệt.

Tôi rất sẵn lòng đăng một số mã nhưng tôi muốn loại trừ khả năng khó khăn của tôi xuất phát từ sự hiểu lầm của lý thuyết đầu tiên.

+0

thêm một số mã định dạng vì Othe rwise nó là một chút của một bức tường văn bản không thể chấp nhận được. Có thể vẫn xem xét việc đăng mã mẫu của những gì bạn đã thử. –

Trả lời

10

Vì cookie JSESSIONID được quản lý bởi servletcontainer, cài đặt này là servletcontainer cụ thể. Không rõ bạn đang sử dụng cái nào, vì vậy đây là câu trả lời được nhắm mục tiêu Apache Tomcat 6.0 để bạn biết hướng nào bạn sẽ phải tìm kiếm servletcontainer của mình: bạn cần đặt thuộc tính useHttpOnly của phần tử <Context> của ứng dụng web thành true.

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

Xem thêm điều này Tomcat documentation về phần tử <Context>.

+0

Tôi càng khám phá chủ đề này, tôi càng nhận ra tôi hoàn toàn không biết gì về gần như mọi thứ. Tôi đang sử dụng JBOSS 4.0 nhưng, từ những gì tôi đã sẵn sàng, JBOSS là một thùng chứa EJB (?). Tôi không chắc chắn những gì servletcontainer tôi đang sử dụng. Tôi sẽ phải đăng một lần nữa khi tôi đã tìm ra những gì servletcontainer của tôi là. – Mythandros

+0

JBoss là một máy chủ ứng dụng. Nó sử dụng Tomcat làm thùng chứa servlet và thêm một số EJB và các tính năng JavaEE ưa thích khác trên đó. Câu chuyện EJB không liên quan ở đây. Đây là một vấn đề HTTP/Servlet. Bằng cách này, tôi không chắc chắn nếu JBoss 4.0 cũ hỗ trợ thuộc tính này ... Ít nhất, các hướng dẫn là giống như cho Tomcat. – BalusC

+0

Dường như thậm chí JBoss 4.3 không hỗ trợ điều này, bạn sẽ cần các vấn đề 5.0: https: //.jboss.org/browse/JBPAPP-3088 –

5

Bạn có thể sử dụng với Java EE 5:

Đối với phiên bản Java Enterprise Edition trước khi Java EE 6 một phương pháp phổ biến là để ghi đè lên đáp ứng tiêu đề http SET-COOKIE với một giá trị cookie phiên mà rõ ràng gắn thêm các HttpOnly cờ:

String sessionid = request.getSession().getId(); 
// be careful overwriting: JSESSIONID may have been set with other flags 
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly"); 

Nguồn: https://www.owasp.org/index.php/HttpOnly

tôi thử nghiệm nó thành một bộ lọc