2009-04-16 41 views
7

Tôi có quy trình xác thực cơ bản sử dụng Zend_Auth_Adapter_DbTable. Tôi có các hành động đăng nhập và đăng xuất trên Bộ điều khiển xác thực của mình. Bây giờ tôi muốn tạo một hàm để đặt lại mật khẩu đã quên bằng cách tự động tạo mật khẩu, lưu mật khẩu mới và gửi email cho họ bằng mật khẩu mới được tạo.Cách tạo mật khẩu ngẫu nhiên hoặc URL tạm thời để đặt lại mật khẩu trong Zend Framework?

Quy trình tốt nhất để thực hiện việc này là gì? Tôi nên tạo một mật khẩu mới như thế nào? Khung công tác Zend có bất kỳ thứ gì có thể làm việc này dễ dàng hơn không?

Tôi cũng đã nghe nói về việc gửi email có liên kết đến trang ngắn hạn cho phép họ đặt mật khẩu mới. Làm thế nào điều này có thể được thực hiện với khung công tác Zend?

Trả lời

22

Zend Framework không có lớp tạo mật khẩu. Dưới đây là một bài viết về cách sử dụng mô-đun PEAR Text_Password để tạo mật khẩu: https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/howdoi/?p=118

Tuy nhiên, thực tiễn bảo mật không phải là gửi mật khẩu trong email đồng bằng. Thay vào đó, bạn nên đặt lại tài khoản của họ để họ có thể đăng nhập tạm thời mà không cần cung cấp mật khẩu (được cung cấp URL hết hạn bạn gửi cho họ trong email) và sau khi đăng nhập, yêu cầu họ cập nhật mật khẩu của riêng họ thành một cái gì đó họ. Sau đó lưu trữ băm muối của mật khẩu của họ.


Dưới đây là một số gợi ý ra khỏi đỉnh đầu của tôi để làm điều này trong Zend Framework:

  • Xác định một bảng AccountReset với các lĩnh vực: reset_id (GUID khóa chính), account_id (tham chiếu đến Accounts.account_id), và expiration (dấu thời gian).
  • Thực hiện một hành động gọi là AccountController::resetAction(), tức là trong bộ điều khiển tương tự như bạn sử dụng để tạo tài khoản, đăng nhập, thay đổi mật khẩu, vv
  • Khi người dùng chọn để thiết lập lại tài khoản của mình, chèn một hàng mới trong một bảng AccountReset với một GUID mới, tham chiếu đến tài khoản của người dùng và expiration 30 phút hoặc lâu hơn trong tương lai.
  • Gửi email đến địa chỉ trong hồ sơ cho người dùng đó, bao gồm URL mà anh ấy nên nhấp vào: "https .../account/reset/reset_id/< GUID >" (nếu bạn thông minh với quy tắc định tuyến, bạn có thể rút ngắn URL đó nhưng vẫn giữ GUID trong đó).
  • Khi AccountController::resetAction() nhận được yêu cầu, nó tra cứu thông số reset_id trong bảng AccountReset. Nếu GUID đó tồn tại và thời gian expiration chưa trôi qua, hãy trình bày cho người dùng một biểu mẫu để thay đổi mật khẩu của mình (mà không yêu cầu anh ta được xác thực và đăng nhập).
  • Nếu resetAction() nhận được yêu cầu không có GUID hoặc GUID không tồn tại trong cơ sở dữ liệu hoặc hàng đó đã vượt qua expiration thì hành động này có thể hiển thị người dùng bằng nút để bắt đầu yêu cầu đặt lại mới và gửi email có GUID mới. Hãy nhớ đặt nút này thành yêu cầu POST!

Do GUID chỉ được gửi trong email đến địa chỉ của người dùng đó, không ai khác có thể có quyền truy cập để thay đổi mật khẩu. Ngay cả khi email của người dùng bị chặn, chỉ có một khoảng thời gian giới hạn GUID sẽ cấp quyền truy cập đó.

Nếu bạn muốn thận trọng hơn, bạn có thể ghi chú địa chỉ IP của khách hàng trong bảng AccountReset và yêu cầu mật khẩu được thay đổi từ một khách hàng có cùng địa chỉ IP, trong khoảng thời gian 30 phút đó.

Đây chỉ là bẻ khóa và tôi chưa triển khai hoặc đánh giá nó để bảo mật phù hợp. Nếu bạn chịu trách nhiệm thực hiện bảo mật, đó là nghĩa vụ của bạn để đọc về các vấn đề bảo mật. Một tài nguyên được coi trọng cho bảo mật PHP là http://phpsecurity.org/.

+0

Phản hồi tuyệt vời! Điều đó rất hữu ích. Cảm ơn bạn! – Andrew

+0

Câu hỏi duy nhất khác của tôi là ... tôi có cần tạo một số ngẫu nhiên cho GUID không? Vì vậy, đưa tôi trở lại câu hỏi ban đầu của tôi về làm thế nào để đi về làm điều đó? Ngoài ra, làm thế nào tôi nên đi về thực thi rằng GUID là duy nhất trong cơ sở dữ liệu? – Andrew

+2

Tạo UUID bằng PHP với hàm uniqid(): http://php.net/uniqid –

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