it-swarm-vi.com

Cookies phiên an toàn

Trong khi tìm kiếm các phương pháp để tạo cookie phiên an toàn, tôi đã xem qua ấn phẩm này: Giao thức cookie an toàn . Nó đề xuất công thức sau đây cho cookie phiên:

cookie = user | expiration | data_k | mac

ở đâu

  • | Biểu thị sự kết hợp.
  • user là tên người dùng của khách hàng.
  • expiration là thời gian hết hạn của cookie.
  • data_k Là dữ liệu được mã hóa liên quan đến máy khách (chẳng hạn như ID phiên hoặc thông tin giỏ hàng) được mã hóa bằng khóa k. [.__.]
    • k được lấy từ khóa máy chủ riêng sk; k = HMAC(user | expiration, sk).
    • data_k Có thể được mã hóa bằng cách sử dụng AES bằng cách sử dụng khóa k.
  • mac là một HMAC của cookie để xác minh tính xác thực của cookie; mac = HMAC(user | expiration | data | session-key, k).
    • data là dữ liệu không được mã hóa liên quan đến máy khách.
    • session-key Là khóa phiên SSL.
  • HMACHMAC-MD5 hoặc HMAC-SHA1.

Theo bài báo, nó cung cấp bảo mật cookie và ngăn chặn các cuộc tấn công phát lại và âm lượng. Đối với tôi (là một người nghiệp dư trong bảo mật/mật mã) điều này có vẻ khá tốt. Phương pháp này tốt như thế nào đối với cookie phiên hoặc cookie nói chung?

35
user369450

Vâng, điều này trông giống như một kế hoạch khá tốt để bảo vệ cookie.

Một lược đồ khác gần đây trong lĩnh vực này là SCS: Phiên bản Cookie an toàn cho HTTP , đây là một lược đồ vững chắc, được cân nhắc rất kỹ. Tôi khuyên bạn nên đọc các cuộc thảo luận về bảo mật của tài liệu đó để hiểu rõ về các mối đe dọa bảo mật có thể là gì.

Để giúp hiểu mục đích và vai trò của chương trình cookie mà bạn đề cập, hãy để tôi sao lưu và cung cấp một số ngữ cảnh. Điều phổ biến là các ứng dụng web cần duy trì trạng thái phiên: tức là, một số trạng thái có thời gian tồn tại trong phiên hiện tại và điều đó bị ràng buộc với phiên hiện tại. Có hai cách để duy trì trạng thái phiên:

  1. Lưu trữ trạng thái phiên trên máy chủ. Máy chủ web cung cấp cho trình duyệt một cookie phiên: cookie có mục đích duy nhất là giữ một chuỗi bit lớn, không thể kiểm soát được dùng làm định danh phiên. Máy chủ giữ một bảng tra cứu, với một mục nhập cho mỗi phiên mở, ánh xạ từ mã định danh phiên sang tất cả trạng thái phiên được liên kết với phiên này. Điều này giúp mã ứng dụng web dễ dàng truy xuất và cập nhật trạng thái phiên được liên kết với yêu cầu HTTP/HTTPS cụ thể. Hầu hết các khung ứng dụng web cung cấp hỗ trợ tích hợp để lưu trữ trạng thái phiên ở phía máy chủ.

    Đây là cách an toàn nhất để lưu trữ trạng thái phiên. Vì trạng thái phiên được lưu trữ trên máy chủ, máy khách không có quyền truy cập trực tiếp vào nó. Do đó, không có cách nào để kẻ tấn công đọc hoặc giả mạo trạng thái phiên (hoặc phát lại các giá trị cũ). Nó đòi hỏi một số công việc bổ sung để giữ trạng thái phiên được đồng bộ hóa trên tất cả các máy chủ, nếu ứng dụng web của bạn được phân phối trên nhiều nút tính toán back-end.

  2. Lưu trữ trạng thái phiên trên máy khách. Cách tiếp cận khác là đặt trạng thái phiên trong cookie và gửi cookie đến trình duyệt. Bây giờ mỗi yêu cầu tiếp theo từ trình duyệt sẽ bao gồm trạng thái phiên. Nếu ứng dụng web muốn sửa đổi trạng thái phiên, nó có thể gửi cookie cập nhật tới trình duyệt.

    Nếu được thực hiện một cách ngây thơ, đây là một lỗ hổng bảo mật lớn, bởi vì nó cho phép một khách hàng độc hại xem và sửa đổi trạng thái phiên. Cái trước là một vấn đề nếu có bất kỳ dữ liệu bí mật nào trong trạng thái phiên. Vấn đề thứ hai là vấn đề nếu máy chủ tin tưởng hoặc dựa vào trạng thái phiên theo bất kỳ cách nào (ví dụ: xem xét liệu trạng thái phiên có bao gồm tên người dùng của người dùng đã đăng nhập hay không, và một chút cho biết người dùng đó có phải là quản trị viên hay không; sau đó, một khách hàng độc hại có thể bỏ qua cơ chế xác thực của ứng dụng web).

    Đề xuất mà bạn đề cập và chương trình SCS, nhằm bảo vệ chống lại những rủi ro này tốt nhất có thể. Họ có thể làm như vậy theo cách chủ yếu là thành công. Tuy nhiên, họ không thể ngăn khách hàng độc hại xóa cookie (và do đó xóa trạng thái phiên). Ngoài ra, họ không thể ngăn khách hàng độc hại phát lại giá trị cũ của cookie (và do đó đặt lại trạng thái phiên thành giá trị cũ hơn), nếu phiên bản cũ hơn xuất hiện trong cùng một phiên. Do đó, nhà phát triển ứng dụng web cần nhận thức được những rủi ro này và quan tâm đến những giá trị nào được lưu trữ trong trạng thái phiên.

Vì lý do này, việc lưu trữ trạng thái phiên trong cookie có rủi ro hơn một chút so với việc lưu trữ trên máy chủ, ngay cả khi bạn sử dụng một trong các chương trình mã hóa này để bảo vệ cookie. (Tuy nhiên, nếu bạn sẽ lưu trữ trạng thái phiên trong cookie, tôi chắc chắn khuyên bạn nên sử dụng một trong hai lược đồ này để bảo vệ các giá trị trong cookie.)

Tại sao mọi người sẽ lưu trữ trạng thái phiên trong cookie, với điều kiện là nó có thể dễ dàng được lưu trữ ở phía máy chủ? Hầu hết thời gian, không có lý do để. Tuy nhiên, trong một số trường hợp đặc biệt - chẳng hạn như máy chủ HTTP bị hạn chế rất nhiều về dung lượng lưu trữ hoặc trong các ứng dụng web cân bằng tải được phân phối trên nhiều máy mà không hỗ trợ tốt cho trạng thái phiên được đồng bộ hóa - có thể có lý do chính đáng để xem xét việc lưu trữ trạng thái phiên trong cookie và sau đó sử dụng một trong các chương trình này là một ý tưởng tốt.

P.S. Một chủ đề liên quan: nếu bạn sử dụng ASP.NET View State , hãy đảm bảo bạn định cấu hình nó để được mã hóa và xác thực: tức là cấu hình ViewStateEncryptionMode thành AlwaysEnableViewStateMac đến true; nếu bạn sử dụng nhiều nút máy chủ, hãy tạo khóa mật mã mạnh và định cấu hình machineKey của mỗi máy chủ để sử dụng khóa đó . Cuối cùng, hãy chắc chắn rằng bạn có một phiên bản cập nhật của khung công tác ASP.NET; các phiên bản cũ hơn có lỗi bảo mật nghiêm trọngtrong mật mã ViewState .

30
D.W.

Vấn đề gì bạn đang cố gắng giải quyết?

Có hai điều tôi có thể nghĩ đến:

  1. Bạn muốn thiết lập các phiên người dùng an toàn. Trong trường hợp này, rất có thể bạn thậm chí không cần tạo cookie phiên của riêng mình - chúng có thể được tạo qua phiên SSL với máy chủ của bạn và nói chung an toàn cho mọi nhu cầu của trang web. Chỉ cần đảm bảo trang web triển khai SSL chính xác và bạn sử dụng phương thức tạo phiên nổi tiếng như có thể tìm thấy bằng các ngôn ngữ phổ biến như PHP hoặc ASP.
  2. Bạn muốn lưu trữ dữ liệu an toàn trong cookie để truy xuất sau. Điều này khó bảo mật hơn nhiều, do nhiều vấn đề với cookie. Thay vào đó, tốt hơn là lưu trữ phía máy chủ và liên kết dữ liệu với người dùng bằng phương pháp khác. Nếu bạn phải làm điều này, phương pháp bạn mô tả có vẻ khá tốt về tổng thể, mặc dù tôi không rõ làm thế nào nó ngăn chặn các cuộc tấn công phát lại, hoặc các cuộc tấn công khác như con người ở giữa cách SSL thực hiện.

Hãy liên hệ với tôi trực tiếp nếu bạn muốn thảo luận thêm.

4
Charlie B

Một phần của phương pháp họ đề xuất là sử dụng khóa phiên SSL như một phần của tải trọng được mã hóa - nhưng điều này chỉ tồn tại chừng nào phiên SSL - tức là bạn không thể sử dụng phương pháp này cho các cookie dự định kéo dài hơn một phiên trình duyệt. Nó cũng không chính xác tầm thường; để giữ khóa phiên SSL, đặc biệt là việc chấm dứt SSL ở một nơi khác ngoài máy chủ http.

Trong thực tế, việc sử dụng một giá trị ngẫu nhiên cho cookie như một cách xử lý dữ liệu được lưu trữ bên cạnh máy đơn giản hơn rất nhiều. Điều này có thể được gắn với những thứ như hàm băm của tác nhân người dùng trình duyệt và tên mạng (không địa chỉ IP) của máy khách. Và/hoặc, nếu bạn phải, khóa phiên SSL trên máy chủ. Không cần mã hóa tất cả dữ liệu này và đẩy nó ra máy khách.

2
symcbean

Đây là một triển khai hợp lý vì nó giải quyết các vấn đề về:

  • Không thoái thác (xác minh giá trị không thay đổi)
  • Bảo mật (rằng nội dung được mã hóa không thể đọc được)

Tuy nhiên, thông tin người dùng hơi yếu và nếu không được tích hợp bên trong thông tin được mã hóa để so sánh sau này có thể bị xâm phạm.

Vấn đề lớn nhất với cookie hoặc bất kỳ dữ liệu nào có thể truy cập của khách hàng là máy khách (hacker) có thể sửa đổi hoặc sao chép nó. Việc chiếm quyền điều khiển phiên có thể dễ dàng thực hiện mặc dù SSL (như đã nhận xét trước đây là đủ - điều này không đủ). Các dạng phần mềm độc hại khác nhau, người dùng trung gian, người dùng trình duyệt và các cuộc tấn công khác có thể chụp cookie phiên, sao chép nó sang máy khác và bây giờ họ có thể 'sở hữu' phiên đó. Đối với một hệ thống thẻ trên tệp như Amazon, điều này có thể có vấn đề.

Để đóng vòng lặp trong đề xuất này, nhận dạng khách hàng phải là duy nhất hợp lý và sau đó được gắn với dữ liệu trong phần được mã hóa để ngăn máy tính khác đánh cắp cookie phiên. Ngoài ra, các thành phần của đề xuất dường như âm thanh.

0
Darrell Teague