2009-03-19 38 views
41

Tôi đang cố gắng xác định phương thức an toàn nhất cho biểu mẫu đăng nhập dựa trên ajax để xác thực và đặt cookie phía máy khách. Tôi đã nhìn thấy những điều về cuộc tấn công XSS như thế này:Cookie đăng nhập/phiên, Ajax và bảo mật

How do HttpOnly cookies work with AJAX requests?

http://www.codinghorror.com/blog/archives/001167.html

Vì vậy, tôi đoán câu hỏi cốt lõi của tôi là ...

1) Đang sử dụng ajax tinh khiết để đặt cookie an toàn, nếu vậy, phương pháp an toàn nhất (httpOnly + SSL + giá trị được mã hóa, v.v.) là gì?

2) Phương pháp ajax thuần túy có liên quan đến việc đặt phía máy khách cookie không? Điều này có an toàn không?

3) Thiết lập cookie theo cách này có đáng tin cậy trên tất cả các trình duyệt/HĐH chính không?

4) Việc sử dụng IFrame ẩn có an toàn hơn không (gọi một trang web để đặt cookie)?

5) Nếu có thể, có ai có mã cho điều này (PHP là chương trình phụ trợ của tôi) không?

Mục tiêu của tôi là đặt cookie và cung cấp cookie cho cuộc gọi tiếp theo tới máy chủ mà không cần điều hướng khỏi trang.

Tôi thực sự muốn đánh dấu sự đồng thuận, cách an toàn nhất để thực hiện việc này. Cuối cùng, mã này được lên kế hoạch được thực hiện mã nguồn mở, vì vậy hãy không có mã thương mại (hoặc không có gì mà không đứng lên để giám sát công cộng)

Cảm ơn, -Todd

Trả lời

68
  1. Cookie cần được tạo phía máy chủ vì phiên liên kết máy khách với máy chủ và do đó trao đổi mã thông báo phải đi từ máy chủ đến ứng dụng khách ở một số giai đoạn. Nó sẽ không thực sự hữu ích để tạo ra phía máy khách cookie, vì máy khách máy từ xa không đáng tin cậy.

    Có thể đặt cookie trong khi gọi AJAX. Để máy chủ (và mạng) một cuộc gọi AJAX chỉ đơn giản là một cuộc gọi HTTP, và bất kỳ phản ứng HTTP nào của máy chủ có thể thiết lập một cookie. Vì vậy, có, nó có thể bắt đầu một phiên để đáp ứng với một cuộc gọi AJAX, và cookie sẽ được lưu trữ bởi khách hàng như bình thường.

    Vì vậy, bạn có thể sử dụng AJAX để thực hiện quá trình đăng nhập giống như bạn có thể vừa dựa vào POST từ một biểu mẫu trên trang. Máy chủ sẽ thấy chúng theo cùng một cách và nếu máy chủ đặt cookie, trình duyệt sẽ lưu trữ nó. Về cơ bản, Javascript phía máy khách không bao giờ cần biết giá trị của cookie (và tốt hơn là nên bảo mật nếu không, có thể đạt được bằng cách sử dụng tiện ích mở rộng cookie "httponly" được các trình duyệt gần đây vinh danh). Lưu ý rằng các cuộc gọi HTTP tiếp theo từ máy khách đến máy chủ, cho dù đó là yêu cầu trang bình thường hay chúng là yêu cầu AJAX, sẽ bao gồm cookie đó tự động, ngay cả khi được đánh dấu httponly và trình duyệt tôn trọng tiện ích mở rộng đó. Tập lệnh của bạn không cần phải 'nhận biết' cookie.

    Bạn đã đề cập sử dụng HTTPS (HTTP qua SSL) - ngăn người khác đọc thông tin quá cảnh hoặc mạo danh máy chủ, vì vậy rất tiện lợi để ngăn việc truyền mật khẩu hoặc các thông tin quan trọng khác. Nó cũng có thể giúp bảo vệ chống lại các cuộc tấn công dựa trên mạng, mặc dù nó không làm cho bạn miễn dịch với tất cả mọi thứ mà CSRF có thể ném bạn, và nó không bảo vệ bạn chống lại sự thích hợp của phiên làm việc hoặc XSS. Vì vậy, tôi sẽ tránh suy nghĩ về HTTPS như một bản sửa lỗi nếu bạn sử dụng nó: bạn vẫn còn cần thận trọng về việc viết mã chéo và yêu cầu qua nhiều trang web.

  2. (xem 1. Tôi loại kết hợp chúng)

  3. Cho rằng các cookie được thiết lập bởi các máy chủ trong tiêu đề HTTP response của nó, có nó là đáng tin cậy. Tuy nhiên, để làm cho nó tương thích với nhiều trình duyệt, bạn vẫn cần đảm bảo đăng nhập là có thể khi AJAX không khả dụng. Điều này có thể yêu cầu thực hiện một thay thế được nhìn thấy chỉ khi không có Javascript hoặc nếu AJAX không có sẵn. (Lưu ý: bây giờ trong năm 2014, bạn không cần phải lo lắng về việc hỗ trợ trình duyệt cho AJAX nữa).

  4. Nó sẽ không thay đổi bảo mật. Sẽ không cần thiết cho nó, ngoại trừ việc tôi đã thấy các iframe ẩn được sử dụng trước đó để 'mô phỏng' AJAX trước đó - tức là thực hiện các cuộc gọi không đồng bộ đến máy chủ. Về cơ bản, tuy nhiên bạn làm điều đó không quan trọng, đó là máy chủ thiết lập cookie, và khách hàng sẽ chấp nhận và trả lại cookie cho dù nó có bằng AJAX hay không.

Phần lớn, cho dù bạn sử dụng AJAX hay không không ảnh hưởng đến bảo mật nhiều như tất cả bảo mật thực sự xảy ra ở phía máy chủ và máy chủ gọi AJAX giống như không Cuộc gọi AJAX: không đáng tin cậy. Do đó, bạn cần phải biết các vấn đề như session fixationlogin CSRF cũng như các vấn đề ảnh hưởng đến phiên như toàn bộ như CSRFXSS cũng giống như bạn sẽ làm nếu bạn không sử dụng AJAX. Các vấn đề không thực sự thay đổi khi sử dụng AJAX ngoại trừ, tôi đoán là bạn có thể mắc nhiều sai lầm hơn với công nghệ nếu bạn không quen thuộc với nó hoặc nó phức tạp hơn.

trả lời được cập nhật Tháng 9 2014

+6

Cảm ơn bạn, câu trả lời đã được chỉ là những gì tôi đang tìm kiếm - chu đáo và không có gì ngắn tuyệt vời. Tôi đánh giá cao nó. - Todd – supertodda

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