Ответ 1
Создайте таблицу с такой структурой, как
create table ResetTickets(
username varchar(200),
tokenHash varbinary(16),
expirationDate datetime,
tokenUsed bit)
Затем в вашем коде, когда пользователь нажимает кнопку пароля reset, вы создадите случайный токен, затем поместите запись в эту таблицу с хешированным значением этого token
и датой истечения чего-то вроде DATEADD(day, 1, GETDATE())
и добавляет значение токена на URL-адрес, который вы отправляете пользователю по электронной почте для пароля reset.
www.example.com/passwordReset?username=Karan&token=ZB71yObR
На странице пароля reset вы берете имя пользователя и токен, прошедшие через, хеш-токен, затем сравниваете это с таблицей ResetTickets
, и если дата истечения еще не прошла, а токен еще не был использован затем возьмите пользователя на страницу, которая позволяет им вводить новый пароль.
Осторожно о:
- Удостоверьтесь, что срок действия маркера истекает, не позволяйте электронной почте от двух лет назад reset пароль.
- Обязательно отметьте используемый токен, не позволяйте другим пользователям компьютера использовать историю браузера для паролей пользователей reset.
- Убедитесь, что вы произвольно создаете случайный токен. Не используйте
Rand
и используйте его для генерации токена, два пользователя, которые reset в то же время получат один и тот же токен (я мог бы reset мой пароль и ваш пароль одновременно использовать мой токен reset ваша учетная запись). Вместо этого сделайте статическийRNGCryptoServiceProvider
и используйте методGetBytes
, из которого класс является потокобезопасным, поэтому вам не нужно беспокоиться о два потока, использующих один и тот же экземпляр. - Обязательно параметризовать ваши запросы. В вашем текущем коде, если я набрал идентификатор пользователя
'; delete dbo.[USERS] --
, он удалит всех пользователей в вашей базе данных. См. Связанное сообщение SO для получения дополнительной информации о том, как его исправить. - Убедитесь, что вы используете маркер, ваша страница
passwordReset
принимает только версию unhashed, и вы никогда не храните неизвестную версию где-либо (включая журналы электронной почты исходящих сообщений для пользователей). Это предотвращает доступ злоумышленника к доступу к базе данных от создания маркера для другого пользователя, считывая значение, которое было отправлено в электронном письме, а затем отправляет одно и то же значение (и, возможно, получает доступ к пользователю-администратору, который может делать больше материала чем просто прочитанные значения).