2012-06-04 22 views
7

Tôi xin lỗi nếu điều này có thể thông thường với một số người, nhưng tôi vẫn đang học. Tôi có ứng dụng iOS đồng bộ hóa tệp với máy chủ web. Khi người dùng đăng nhập trên thiết bị, anh ấy vẫn đăng nhập trừ khi anh ấy đăng xuất. Hiện tại, bất cứ khi nào người dùng khởi tạo yêu cầu máy chủ, chẳng hạn như thêm, cập nhật hoặc xóa tệp, tôi chỉ gửi email của người dùng chứ không phải mật khẩu cho máy chủ vì người dùng đã được xác thực trên thiết bị.Tôi có nên xác thực mật khẩu của người dùng cho mọi yêu cầu máy chủ không?

Tôi có nên gửi mật khẩu được lưu trữ của người dùng mỗi lần gửi yêu cầu và yêu cầu máy chủ xác thực mật khẩu trước khi tiếp tục yêu cầu không? Tại sao hay tại sao không?

Trả lời

5

Bạn nên gửi số nhận dạng phiên, thay vì địa chỉ email.

Số nhận dạng phiên là một số lớn (128 bit là đủ) được chọn bởi trình tạo số ngẫu nhiên mã hóa khi người dùng được xác thực thành công. Nó được đặt là "cookie" trong thiết bị web của người dùng và được gửi cùng với từng yêu cầu qua kênh bảo mật (TLS).

Địa chỉ email công khai. Bạn chỉ có thể xác thực yêu cầu bằng bí mật, như mật khẩu hoặc số nhận dạng phiên.

+0

Vì vậy, mỗi người dùng có một mã định danh phiên duy nhất, một lần được tạo? Đây có phải là loại ID duy nhất cho các yêu cầu máy chủ của họ không? Nó có thay đổi với mỗi yêu cầu hay nó là một định danh thời gian cuộc sống? Điều gì về một mật khẩu băm? Tôi có thể sử dụng nó để thay thế không? – Snowman

+0

Bạn tạo một số nhận dạng phiên mới mỗi khi họ đăng nhập. Không chắc chắn bạn đang sử dụng máy chủ nào nhưng hầu hết sẽ tự động thực hiện việc này cho bạn. Điều quan trọng là nếu máy chủ tạo cookie id phiên * trước * người dùng đã đăng nhập và gửi cookie đó qua kênh không an toàn, bạn phải vô hiệu hóa phiên và tạo phiên mới khi đăng nhập. Tất cả các yêu cầu được xác thực phải được thực hiện qua HTTPS. – erickson

+0

Vì vậy, ví dụ như ứng dụng Facebook iOS..a người dùng thường sẽ vẫn đăng nhập trong nhiều tháng. Họ sẽ làm như thế nào? Họ sẽ sử dụng cùng một ID phiên cho nhiều tháng mà người dùng đã đăng nhập? Họ có gửi email hoặc mật khẩu không? Làm thế nào để họ tra cứu người dùng? – Snowman

4

Tôi không phải chuyên gia, nhưng cho đến khi bạn nhận được câu trả lời tốt hơn dưới đây là một vài lời khuyên:

  • Mỗi yêu cầu nên bao gồm một số loại "định danh session" để chỉ ra nó là một phần của phiên đăng nhập. Số nhận dạng này là không thể/khó khăn để kẻ tấn công đoán hoặc sử dụng lại. Thường thì các cookie HTTP được sử dụng cho điều này, nhưng bạn có thể đưa chúng vào URL.
  • Bạn không bao giờ nên gửi mật khẩu thô trên mạng, vì bất kỳ ai đánh hơi mạng sẽ thấy chúng. Thay vào đó, bạn nên gửi một số loại mật khẩu băm hoặc sử dụng giao thức thử thách phản hồi.

Nếu bạn đang sử dụng HTTPS, bạn có thể không cần phải lo lắng về điều này quá nhiều. Nếu đó là lưu lượng truy cập không được mã hóa, thì bạn có thể muốn "ký" từng thư có giá trị băm bổ sung.

2

Sử dụng địa chỉ email để xác định người dùng có nghĩa là ai đó có thể giả mạo quyền truy cập vào dịch vụ của bạn bằng cách sử dụng địa chỉ email của người dùng hiện tại. Như Kristopher Johnson đề xuất, sử dụng từ định danh phiên tránh hiển thị thông tin xác thực và có thể là lựa chọn thiết kế tốt.

Những người tốt tại OWASPsession management cheat sheet là điểm khởi đầu tuyệt vời cho bất kỳ thiết kế nào.

Họ khuyên bạn nên sử dụng khung hiện có để quản lý phiên (Java EE, ASP.NET, PHP) nếu có sẵn.

-2

Nếu bạn đang truy cập SSL thì việc gửi tên người dùng và mật khẩu theo mọi yêu cầu là tốt nhất. Tại sao? Bởi vì nó là một giao diện lập trình đơn giản hơn và bởi vì các thẻ không thêm giá trị thực. Tại một số thời điểm để nhận được mã thông báo, bạn sẽ phải gửi thông tin đăng nhập, do đó, điều gì quan trọng nếu bạn gửi thông tin xác thực mỗi lần hay không? Không ai có thể giải mã SSL trong một thời gian xứng đáng. Bây giờ có thể có lỗ hổng bảo mật khác như trên máy chủ web chính nó, nhưng điều đó không có gì để làm với việc vận chuyển từ máy khách đến máy chủ (được bảo vệ). Do đó, Người dùng/vượt qua với mọi yêu cầu là tốt nhất.

Và bởi vì một ứng dụng iOS của mình, bạn có thể lưu trữ các thông tin trong NSUserDefaults (mà là sandboxed để ứng dụng cụ thể của bạn và không có các ứng dụng khác có thể truy cập nó)

Xin Answer và chấp nhận, những câu trả lời khác được gây hiểu lầm

Bây giờ nếu nó không phải là một ứng dụng iOS và bạn phải lưu trữ thông tin đăng nhập trong cookie thay vì NSUserDefaults thì OK, có thể bạn có thể lập luận để sử dụng phiên. Nhưng ngoài những phiên đó không đáng để đau đầu!

+0

Nó không phải là một giao diện lập trình đơn giản trên máy chủ. Hầu hết các thùng chứa ứng dụng web giả sử sử dụng một định danh phiên và tự động quản lý nó cho bạn. Bất kỳ thư viện máy khách HTTP phong nha nào cũng sẽ cung cấp tương tự, vì nó là một quy ước được theo dõi rộng rãi. – erickson

+1

@erickson Có thực sự nó đơn giản hơn. Hình dung điều này. Khách hàng gửi mã thông báo. Máy chủ gửi lại mã thông báo không hợp lệ. Khách hàng phải yêu cầu mã thông báo mới. Điều đó đúng có thêm một bước không cần thiết khác. – MobileMon

+0

@erickson bạn có thể giải thích bất kỳ lợi ích thực sự nào khi sử dụng mã thông báo trong trường hợp này không? Có lẽ tôi có thể học điều gì đó – MobileMon

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