2009-07-22 44 views
6

Bất cứ khi nào bạn xác thực, ứng dụng của bạn sẽ thay đổi số nhận dạng phiên mà nó sử dụng. Điều này giúp ngăn người nào đó thiết lập phiên, sao chép số nhận dạng phiên và sau đó lừa người dùng sử dụng phiên. Vì kẻ tấn công đã biết định danh phiên, họ có thể sử dụng nó để truy cập phiên sau khi người dùng đăng nhập, cấp cho họ quyền truy cập đầy đủ. Cuộc tấn công này đã được gọi là "phiên cố định" trong số những thứ khác. Làm thế nào tôi có thể thay đổi id phiên khi người dùng đăng nhập vào hệ thống?Phiên bảo mật Java

+0

Có lý do nào bạn hỏi hai lần này không? http://stackoverflow.com/questions/1138436/can-i-regenerate-my-own-session-id-in-servlet – blowdart

+0

vâng tôi không thể thêm nhận xét và trả lời tin nhắn –

Trả lời

0

Vô hiệu hóa phiên hiện tại và có được một phiên làm việc mới:

//invalidate the current session 
request.getSession().invalidate(); 
/* 
get another session and get the ID (getSession()) will create a session if one does not exist 
*/ 
request.getSession().getId(); 
2

Lấy hiện có; vô hiệu hóa nó; tạo một cái mới ...

1) Lấy phiên hiện tại bằng HttpServletRequest.getSession();
2) Xóa phiên: HttpSession.invalidate();
3) Tạo tài khoản mới: HttpServletRequest.getSession(true);

+0

Nếu tôi sử dụng phương pháp này, một khi người dùng đăng nhập anh ta sẽ đăng xuất lần đầu tiên để tái tạo id –

+1

như blowdart nói: "Vậy thì đó là một hạn chế của khuôn khổ bạn đang sử dụng tôi sợ." Bạn có thể cung cấp mã ví dụ về quy trình xác thực của mình không? Điều này có thể giúp. – Henrik

1

Nói chung (vì đây không phải là vấn đề Java chút nào, đó là vấn đề chung về web), phiên làm việc phiên phát sinh khi ID phiên dễ phát hiện hoặc đoán. Phương pháp tấn công chính là khi ID phiên nằm trong URL của trang, ví dụ: http://example.com/index?sessionId=123. Kẻ tấn công có thể thiết lập chụp một phiên và sau đó nhúng liên kết vào trang của họ, lừa người dùng truy cập vào nó và trở thành một phần của phiên của họ. Sau đó, khi người dùng xác thực phiên được xác thực. Việc giảm nhẹ cho việc này là không sử dụng các ID phiên dựa trên URL, nhưng thay vào đó, hãy sử dụng cookie

Một số ứng dụng web sẽ sử dụng phiên cookie nhưng đặt từ URL ban đầu, chẳng hạn như truy cập http://example.com/index?sessionId=123 sẽ thấy id phiên trong url và sau đó tạo cookie phiên từ nó, đặt id trong cookie phiên thành 123. Giảm thiểu cho việc này là tạo id phiên ngẫu nhiên trên máy chủ mà không sử dụng bất kỳ đầu vào người dùng nào làm hạt giống vào trình tạo.

Ngoài ra còn có các trình duyệt dựa trên trình duyệt mà trình duyệt được mã hóa kém sẽ chấp nhận tạo cookie cho các tên miền không phải là miền gốc, nhưng bạn không thể làm gì nhiều với điều đó. Và Cross Site Scripting tấn công nơi bạn có thể gửi lệnh script vào trang web bị tấn công để đặt cookie phiên, có thể được giảm nhẹ bằng cách đặt cookie phiên là HTTP_ONLY (mặc dù Safari không tôn vinh cờ này)

Đối với Java khuyến nghị chung là

session.invalidate(); 
session=request.getSession(true); 

Tuy nhiên tại một điểm trên JBoss điều này không có tác dụng - vì vậy bạn cần kiểm tra công việc này như mong đợi trong khuôn khổ bạn đã chọn.

+0

Tôi thử sử dụng phương pháp này, nhưng người dùng sẽ đăng xuất là session.invalidate() được gọi là –

+0

Vậy thì đó là hạn chế của khung công tác mà bạn đang sử dụng tôi sợ. – blowdart

+0

tôi đang sử dụng jsf và tomcat, do đó, có bất kỳ phương pháp khác để giải quyết vấn đề? –

7

Bạn vẫn ở trên máy chủ trong khi bạn làm mất hiệu lực phiên.

//get stuff out of session you want before invalidating it. 
currentSession = request.getSession(true); 
UserProfile userProfile = (UserProfile) currentSession.getAttribute("userProfile"); 

//now invalidate it 
currentSession.invalidate(); 

//get new session and stuff the data back in 
HttpSession newSession = request.getSession(true); 
newSession.setAttribute("userProfile", userProfile);