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/.
Nguồn
2009-04-16 05:40:50
Phản hồi tuyệt vời! Điều đó rất hữu ích. Cảm ơn bạn! – Andrew
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
Tạo UUID bằng PHP với hàm uniqid(): http://php.net/uniqid –