2010-04-07 34 views
22

Đôi khi, tôi đi qua một số khung phát triển web nhất định không cung cấp tính năng xác thực, chẳng hạn như trong Xác thực ASP.NET.Thực tiễn tốt nhất để thực hiện bảo mật "Ghi nhớ"

Tôi đã tự hỏi cần phải cân nhắc các biện pháp bảo mật nào khi thực hiện các tính năng đăng nhập "Remember Me", bằng mã hóa bằng tay?

Dưới đây là những điều tôi thường làm:

  1. Store tên người dùng trong cookie. Tên người dùng không được mã hóa.

  2. Lưu trữ khóa bí mật trong cookie. Khóa bí mật được tạo bằng cách sử dụng chức năng một chiều dựa trên tên người dùng. Máy chủ sẽ xác minh khóa bí mật chống lại tên người dùng, để đảm bảo tên người dùng này không bị thay đổi.

  3. Sử dụng HttpOnly trong cookie. http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

Bất kỳ điều gì khác tôi đã bỏ lỡ, điều gì có thể dẫn đến lỗ hổng bảo mật?

Trả lời

17

Cookie phải luôn là giá trị ngẫu nhiên hết hạn. Có những trường hợp bạn có thể lưu trữ trạng thái dưới dạng giá trị cookie và không phải là mối đe dọa bí mật, chẳng hạn như ngôn ngữ ưa thích của người dùng, nhưng điều này nên tránh càng nhiều càng tốt. Bật HttpOnlyCookies, là một ý tưởng tuyệt vời.

Đọc A3: "Xác thực bị hỏng và Quản lý phiên" trong OWASP top 10 for 2010. Một điểm quan trọng trong phần này là https phải được sử dụng cho toàn bộ phiên. Nếu phiên họp kéo dài trong một thời gian rất dài, thì điều này thậm chí còn quan trọng hơn.

Cũng nên nhớ rằng "Remember Me" tạo một cửa sổ lớn trong đó kẻ tấn công có thể "cưỡi" trên phiên. Điều này cho một kẻ tấn công một thời gian rất dài (tháng?), Trong đó ông có thể cung cấp một cuộc tấn công CSRF. Ngay cả khi bạn có bảo vệ CSRF, kẻ tấn công vẫn có thể đi trên một phiên với XSS và XmlHttpRequest (HttpOnlyCookies sẽ ngăn chặn một hijack đầy đủ). "Remember Me" tạo ra các mối đe dọa khác như xss, csrf, sniffing nghiêm trọng hơn. Miễn là các lỗ hổng này đã được giải quyết, thì bạn không nên có vấn đề với tin tặc thế giới thực.

Phương pháp đơn giản nhất (và an toàn) để thực hiện một "nhớ đến tôi" tính năng sẽ được sửa đổi thời gian chờ phiên file web.config của bạn:

<configuration> 
     <system.web> 
      <sessionState timeout="60"/> 
      </sessionState> 
     </system.web> 
    </configuration> 

Se thời gian chờ một cái gì đó cao, có lẽ một tháng hoặc vì thế. Nếu hộp kiểm "Nhớ thông tin đăng nhập của tôi" không được chọn thì lưu trữ biến phiên của thời gian chờ thông thường hơn (như 24 giờ). Kiểm tra biến phiên này trong một tệp tiêu đề cho mỗi yêu cầu. Nếu hộp kiểm được chọn, sau đó hành động bình thường và để cho asp.net chăm sóc nó.

Nếu phiên không hết hạn thì sẽ dễ dàng hơn nhiều để tạo hiệu lực. Những giá trị này rất lớn, nhưng cho phép một hacker tốn nhiều năm để đoán một id phiên là một lỗ hổng.

+3

Câu trả lời hay. Điều duy nhất tôi sẽ thêm là đề phòng để ngăn chặn XSS và CSRF. Cả hai vấn đề này trở nên quan trọng nếu bạn có các phiên sống lâu. –

+0

@Srim Tôi hoàn toàn đồng ý với bạn. (+1) – rook

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