2009-04-23 8 views
6

Chúng tôi nhận thấy rằng có thể tạo lại bản sao của cookie ASP.NET FormsAuthentication trên một máy khác, cho phép máy thứ hai xác thực mà không cần đăng nhập.Tôi có thể làm cho cookie ASP.NET FormsAuthentication của tôi an toàn hơn bằng cách liên kết nó với ID phiên không?

Một giải pháp được đề xuất cho điều này là lưu trữ ID phiên trong phạm vi FormsAuthenticationTicket.UserData và để kiểm tra xem hai giá trị có khớp với nhau trong Application_AuthenticateRequest() hay không.

Chúng tôi đang sử dụng:

FormsAuthenticationTicket.IsPersistent = false; 

Là cách tiếp cận này kết hợp Cookie FormsAuthentication với session ID là một ý tưởng tốt?

+0

Đây có phải là điều bạn đã thực sự cố gắng không? Bạn đã thực sự có một máy tính đăng nhập bằng cách sử dụng một cookie từ một máy khác? Tôi nghĩ rằng đã có một số mã hóa mỗi phiên. –

+0

Một đồng nghiệp đã thử nó. Tôi không biết liệu bất kỳ mã hóa nào đã được định cấu hình chưa. – tjrobinson

Trả lời

18

Tôi nghĩ rằng bạn đang đánh giá cao vấn đề. Khả năng sao chép cookie chỉ là vấn đề cố hữu của cookie - bất kỳ ai cũng có thể chặn bất kỳ cookie nào và mạo danh bất kỳ dữ liệu nào trong đó bằng cách thiết lập trên một máy khác.

"Bảo mật" của cookie xác thực xuất phát từ thực tế là không ai có thể (được cho là) ​​tạo cookie theo cách thủ công để giả mạo người dùng được xác thực. Tuy nhiên, một khi cookie được tạo ra, tất nhiên nó có thể được sử dụng để xác thực. Điều này có nghĩa là để "sự cố" của bạn xảy ra, trước tiên bạn vẫn cần có nhật ký người dùng hợp lệ. Nếu người dùng đó lạm dụng hệ thống bằng cách sao chép cookie của mình sang các máy khác để cung cấp cho mọi người quyền truy cập, điều đó hoàn toàn giống với người dùng chỉ cho mọi người biết tên người dùng và mật khẩu của cô ấy, ngoại trừ việc sử dụng nhiều hơn. Do đó, vấn đề không phải là việc sao chép cookie - chính là bản thân người dùng.

Một vector tấn công khác sẽ là nếu mạng bị xâm nhập và ai đó có thể chặn lưu lượng truy cập để ghép lại cookie thông qua trình thám thính hoặc bất kỳ thứ gì - nhưng lại một lần nữa, điều này vốn có với chính cookie. Điều này được gọi là Session Hijacking và cách duy nhất để bảo vệ chống lại điều này là sử dụng SSL cho trang web của bạn.

Nếu bạn đang thực sự lo lắng về nó, tôi chỉ cần thiết lập xác thực của bạn và thời gian chờ phiên là như nhau, và sau đó trong tập tin global.asax của bạn, chỉ cần gọi FormsAuthentication.Signout() bất cứ khi nào phiên của người dùng hết hạn. Việc này sẽ vô hiệu hóa xác thực bất cứ khi nào người dùng thực hiện phiên của họ, buộc họ phải đăng nhập lại sau. Tất nhiên, điều này có thể gây phiền toái cho người dùng của bạn ...

Tôi cũng rất muốn giới thiệu This MSDN article. Nó có thể trả lời câu hỏi của bạn tốt hơn rất nhiều so với tôi có thể.

+0

Cảm ơn câu trả lời của bạn - nó thực sự dọc theo dòng suy nghĩ của tôi nhưng lại muốn có ý kiến ​​thứ hai trước khi tôi cố gắng sửa chữa một thứ không thực sự là vấn đề. Đề xuất của bạn FormsAuthentication.Signout() dường như không áp dụng được trong trường hợp của tôi vì cookie xác thực sẽ hết hạn vào cuối phiên - buộc người dùng phải đăng nhập vào mỗi phiên mới. Hay tôi đã bỏ lỡ điều gì đó? – tjrobinson

+1

Trường hợp máy tính của người dùng bị nhiễm vi-rút đánh cắp cookie của họ thì sao? SSL sẽ không bảo vệ họ sau đó. Tôi cho rằng đó chỉ là một biến thể của Session Hijacking trong trường hợp đó. – tjrobinson

+1

Re: bình luận đầu tiên. Tôi không nghĩ rằng bạn đã bỏ lỡ bất cứ điều gì. Tôi đã nghĩ về nó nhiều hơn đêm qua và nghĩ rằng bạn có thể thử thiết lập một số dữ liệu người dùng vào vé xác thực, như địa chỉ IP của họ hoặc một cái gì đó, và nếu thông tin đó thay đổi, tự động đăng xuất chúng. Điều đó làm cho nó khó khăn hơn cho một máy khác để mạo danh ... nhưng địa chỉ IP cũng có thể bị giả mạo. Nó sẽ là một chút nhỏ hơn an toàn mặc dù. Re: bình luận thứ hai - yep, chỉ là một biến thể khác. – womp