2012-03-02 34 views
6

Tôi đã nghĩ đến việc viết kịch bản xác thực của riêng mình nhưng tôi không biết nhiều về bảo mật.Tôi nên sử dụng thông tin gì để xác thực người dùng trong PHP?

Từ các bài viết tôi đã đọc, có vẻ như nó thường liên quan đến việc băm mật khẩu bằng một muối và lưu trữ nó trong cơ sở dữ liệu. Sau đó, khi người dùng yêu cầu đăng nhập, mật khẩu được băm và so sánh với cơ sở dữ liệu. Nếu nó khớp, thì dữ liệu của người dùng được lưu trữ trong $ _SESSION.

Tuy nhiên, tôi không biết điều này có an toàn hay không. Tôi đọc một cái gì đó về lưu trữ các khóa phiên trong cơ sở dữ liệu nhưng tôi không chắc chắn về cách thức hoạt động, hoặc làm thế nào để thực hiện điều đó.

Ai đó có thể giải thích cách triển khai xác thực bảo mật?

Ngoài ra, có bất kỳ đề xuất nào cho thư viện xác thực PHP tôi có thể kết hợp dễ dàng để tìm hiểu thay vì viết của riêng tôi không?

+2

Vui lòng đọc bản tóm tắt tuyệt vời này trước: [băm an toàn và muối cho mật khẩu php] (http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords) –

+1

Bạn nên quay lại sử dụng một khung xác thực hiện có bất cứ khi nào có thể, bởi vì, thực sự, nó phức tạp. Ví dụ: hãy xem https://github.com/delight-im/PHP-Auth, cả hai đều không có khung công tác bất khả tri và không có cơ sở dữ liệu. – caw

Trả lời

5

Kiểm tra this answer here.

Mặc dù câu trả lời là 3 tuổi, thư viện được đề xuất phpass được cập nhật.

Ngoài ra, +1 cho Aron Cederholm. Mật khẩu bảo mật là một chủ đề mở rộng và bạn nên nhìn đầu tiên tại các câu hỏi liên quan đã được thảo luận ở đây trên StackOverflow, do đó bạn sẽ quen thuộc hơn với chủ đề và thực tiễn tốt nhất về an ninh.

Mặc dù tôi thích các khung công tác (Symfony, Zend, v.v.) vì chúng thường thực hiện những thực tiễn tốt này, chỉ cần sử dụng chúng không làm cho bạn trở thành một lập trình viên giỏi. Bạn phải học các hoạt động bên trong của nó. Tôi luôn chào mừng lập trình viên viết mã hóa cơ chế xác thực an toàn của riêng mình (miễn là họ không triển khai nó trong một trang web thực sự cần bảo mật mạnh), bởi vì đó là cách tốt nhất để tìm hiểu và hiểu người tham gia chủ đề. Luôn luôn bắt đầu từ một triển khai hiện có, và THEN sử dụng nó làm ví dụ để tạo codebase của riêng bạn.

+0

Zend thực sự có một mô-đun Auth khủng khiếp đi kèm với các ví dụ không an toàn. – Jacco

5

Những điều cần lưu ý:

  1. xác thực; xác minh người dùng là họ nói họ là ai.
  2. Uỷ quyền; đảm bảo người dùng được phép làm những gì họ đang cố gắng.
  3. Kế toán; ghi lại và kiểm tra những gì họ làm.

Để xác thực, bạn cần theo dõi "người dùng" được kết nối với và (thường) được xác thực với hệ thống. Điều này đòi hỏi phải biết số nhận dạng (tên người dùng, email hoặc một số mã thông báo duy nhất khác) và cụm từ mật khẩu. Lưu trữ tên người dùng và cụm từ mật mã ở đâu đó, nhưng không bao giờ lưu trữ cụm từ mật khẩu mà không bảo mật cụm từ đầu tiên: không sử dụng thuật toán thông báo tiêu hóa (như MD5 hoặc SHA1) bằng muối. Sử dụng bcrypt để thay thế. Mặc dù nó không phải là một ý tưởng tồi để sử dụng một khuôn khổ ở đây, không luôn luôn dựa vào một khuôn khổ để làm điều đúng.

Để ủy quyền, bạn sẽ cần phải theo dõi những hành động mà người dùng đang thực hiện và thực hiện kiểm tra quyền để xem họ có được phép thực hiện hành động mà họ đang cố gắng hay không. Điều này có thể được thực hiện theo nhiều cách khác nhau và tất cả chúng đều là tên miền cụ thể - bạn sẽ không thường xuyên tìm thấy một ví dụ được cắt khô, mặc dù bạn có thể tìm thấy nhiều khung công tác để giúp bạn.

Để tính toán, bạn cần phải ghi lại những hành động mà người dùng thực hiện. Đây là phần bị bỏ quên thường xuyên nhất của bất kỳ ứng dụng nào, nhưng khi những điều xấu xảy ra, đó là kiến ​​thức hoàn toàn quan trọng để có và xây dựng lại nó từ nhật ký truy cập máy chủ web là một cơn ác mộng. Một lần nữa, đây là miền cụ thể nhưng một khung tốt nên dễ dàng thực hiện nó.

Cuối cùng, kết hợp cả ba thứ này với nhau là phiên của người dùng của bạn. Khi bạn gọi 'session_start()' trong PHP, nó sẽ gửi định danh phiên làm cookie cho khách hàng và lưu trữ tệp vào ổ cứng của máy chủ chứa nội dung của $_SESSION cho người dùng đó. Bạn cũng có thể định cấu hình PHP để ghi đè chức năng mặc định và lưu dữ liệu phiên sử dụng session_set_save_handler. Sau đó bạn có thể lưu trữ thông tin đó vào cơ sở dữ liệu.

TL; DR: Sử dụng khung như CodeIgniter, Drupal, Yii hoặc một số giải pháp tích cực khác được phát triển. Phần lớn các khung công tác ngoài kia sẽ làm bất cứ thứ gì bạn cần chúng, và nếu chúng không, chúng có thể được sửa đổi rất dễ dàng. Không tạo khung của riêng bạn cho việc này; sử dụng một cái đã có sẵn.

1

Tôi sử dụng tank_auth (plugin Codeigniter) khá tốt. Mã nguồn là một tham chiếu tốt cho cách thực hiện đăng nhập an toàn.

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