Мне нравится подход, состоящий в том, чтобы создать строку, которая выглядит примерно так: [username] [currentPassword] [expirationDate], хэшировать ее, а затем создать ссылку, которая выглядит следующим образом: resetPassword.php ? имя пользователя = [имя пользователя] & Exp = [EXPIRATIONDATE] и хэш = [хеш]
В файле resetPassword.php вы проверяете этот хеш с информацией в параметрах GET + ваш старый пароль, и, если хеш совпадает, продолжайте сбрасывать пароль.
Таким образом, срок действия ссылки истекает всякий раз, когда она истекает, и будет невозможно сбросить пароль для этой ссылки после его изменения.
Другой подход заключается в сохранении кода сброса пароля в базе данных.