Восстановление пароля без отправки пароля по электронной почте - PullRequest
4 голосов
/ 25 июня 2009

Итак, я играл с asp:PasswordRecovery и обнаружил, что он мне действительно не нравится по нескольким причинам:

1) Пароль Алисы можно сбросить, даже не имея доступа к электронной почте Алисы. Секретный вопрос для сброса пароля смягчает это, но на самом деле не удовлетворяет меня.

2) Новый пароль Алисы отправляется обратно ей в виде открытого текста. Я бы лучше отправил ей специальную ссылку на мою страницу (например, страницу, например example.com/recovery.aspx?P=lfaj0831uefjc), которая позволила бы ей сменить пароль.

Полагаю, я мог бы сделать это сам, создав некую таблицу страниц восстановления пароля с истекшим сроком и отправив эти страницы пользователям, которые просили сбросить данные. Каким-то образом эти страницы могут также изменять пароли пользователей за кулисами (например, путем их сброса вручную и последующего использования текста нового пароля для изменения пароля, поскольку пароль не может быть изменен без знания старого). Я уверен, что другие уже сталкивались с этой проблемой раньше, и такое решение кажется мне немного странным. Есть ли лучший способ сделать это?

Идеальное решение не нарушает инкапсуляцию путем прямого доступа к базе данных, а вместо этого использует существующие хранимые процедуры в базе данных ... хотя это может быть невозможно.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2010

В настоящее время я внедряю систему управления пользователями с открытым исходным кодом поверх Spring + SpringSecurity, и вот как я решаю проблему утраченного пароля.

  1. У учетной записи пользователя должен быть предварительно зарегистрированный адрес электронной почты.
  2. Чтобы запросить сброс, пользователь вводит имя своей учетной записи в форму.
  3. Временный «код сброса» генерируется и прикрепляется к учетной записи и отправляется по электронной почте пользователю, встроенному в гиперссылку.
  4. Получив электронное письмо, пользователь нажимает ссылку, по которой он переходит на страницу, чтобы ввести новый пароль.
  5. Перед тем, как принять новый пароль, код сброса (по ссылке) сверяется с сохраненным кодом, чтобы убедиться, что он правильный и что его срок действия не истек.

Это позволяет избежать отправки пароля (в открытом виде) в сообщении электронной почты. И это также защищает от того, что один человек сбрасывает пароль другого человека просто для того, чтобы это было неприятно, потому что сброс пароля происходит только после использования ссылки.

Но это зависит от безопасности учетной записи электронной почты пользователя, а также от того, что электронная почта не отслеживается во время транспортировки. Для некоторых приложений это может быть неприемлемым риском.

Другая часть уравнения заключается в том, что вам нужно быть очень осторожным при изменении зарегистрированных адресов электронной почты пользователя. По крайней мере, пользователь должен ввести свой текущий пароль с просьбой изменить адрес ..., чтобы предотвратить взлом через автоматические сеансы входа в систему.

2 голосов
/ 18 октября 2009

Я рекомендую добавить дополнительный уровень проверки, вот несколько вариантов на выбор.

  1. Сначала вы можете сохранить IP-адрес запрашивающей стороны в базе данных, затем, когда он щелкнет ссылку сброса, сравнить его с IP-адресом своего текущего компьютера, если они совпадают, затем сбросить пароль. Если электронное письмо было перехвачено, то лицо, пытающееся сбросить пароль, должно иметь соответствующий IP-адрес.
  2. Используйте cookie-файл и сохраните уникальное значение, например GUID, MD5-хэш или что-то в этом роде. Поэтому, когда пользователь делает запрос на сброс пароля, cookie сохраняется на его компьютере и в базе данных, когда пользователь щелкает ссылку, локальный cookie должен соответствовать значению базы данных, иначе он не сможет сбросить свой пароль.

В целом я категорически против отправки пароля по электронной почте, поэтому мне больше нравится опция ссылки для сброса пароля, чем новый текстовый пароль.

...