Какие рекомендации по активации/регистрации / сбросу пароля ссылки в сообщениях электронной почты с nonce


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

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

  1. ссылка содержит nonce в URI запроса (http://host/path?nonce).
  2. при переходе по ссылке (GET) пользователю предоставляется форма, необязательно с nonce.
  3. пользователь подтверждает ввод (сообщение).
  4. сервер получает запрос и
    • проверка входных параметров,
    • выполняет изменение,
    • и делает недействительным nonce.

Это должно быть правильным в HTTP RFC на безопасные и идемпотентные методы.

проблема заключается в том, что этот процесс включает в себя одну дополнительную страницу или действие пользователя (пункт 3), которое считается излишним (если не бесполезным) многими людьми. У меня были проблемы с представлением этого подхода коллегам и клиентам, поэтому я прошу внести свой вклад в это от более широкой технической группы. Единственным аргументом, который я имел против пропуска шага POST, была возможная предварительная загрузка ссылки из браузера.

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

спасибо,
Карием


подробности избавлены

Я сохранил основную часть короткой, но чтобы уменьшить слишком много дискуссий вокруг детали, которые я намеренно опустил, добавлю несколько предположений:

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

Примечания

С OpenID и тому подобное, обычные веб-приложения освобождаются от реализации стандартного управления учетными записями пользователей (пароль, электронная почта ...), но все же некоторые клиенты хотят 'их собственные пользователи'

Как ни странно, я еще не нашел удовлетворительного вопроса или ответа здесь. Что я нашел так далеко:

3 56

3 ответа:

этот вопрос очень похож на реализация безопасных, уникальных" одноразовых " URL-адресов активации в ASP.NET (C#).

мой ответ там близок к вашей схеме, с несколькими указанными проблемами - такими как короткий срок действия, обработка двойных регистраций и т. д.
Ваше использование криптографические nonce также важно, что многие склонны пропускать - например, "позволяет просто использовать GUID"...

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

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

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

вам действительно не нужно беспокоиться о предварительной загрузке (вы говорите о CSRF или оптимизаторах браузера?)... CSRF-атаку бесполезно из-за nonce и оптимизаторы обычно не обрабатывают javascript (используемый для автоматической отправки) на предварительно загруженной странице.

о сбросе пароля:

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

Это может быть или не быть важным в зависимости от требований безопасности рассматриваемого сайта, но я, как пользователь сайта, по крайней мере, хотел бы иметь возможность отключить такую функцию сброса пароля, поскольку я считаю ее небезопасной.

нашел этой статье это обсуждает тему.

краткая версия того, как это сделать в безопасном образом:

  1. требуйте жестких фактов об учетной записи

    1. имя пользователя.
    2. адрес электронной почты.
    3. 10-значный номер счета или другую информацию например, номер социального страхования.
  2. требуется, чтобы пользователь ответил по крайней мере на три предопределенных вопроса (предопределенных вами, не позволяйте пользователю создавать свои собственные вопросы), которые не могут быть тривиальными. Например, "Что такое любимое место отдыха", не "Какой твой любимый цвет".

  3. дополнительно: отправить код подтверждения на предопределенный адрес электронной почты или номер ячейки (SMS), который пользователь должен ввести.

  4. разрешить пользователю вводить новый пароль.

Я в целом согласен с вами, с некоторыми изменениями, которые предложены ниже.

  1. пользователь регистрируется на вашем сайте, предоставляя электронную почту.
  2. письмо с подтверждением отправляется в учетную запись Пользователя с двумя ссылками: а) одна ссылка с идентификатором GUID для проверки регистрации б) одна ссылка на GUID отклонить проверки
  3. когда они посещают url-адрес проверки из своей электронной почты, они автоматически проверяются, и идентификатор guid проверки помечается как таковой в вашем система.
  4. когда они посещают url-адрес отклонения от своей электронной почты, они автоматически удаляются из очереди возможных проверок, но что еще более важно, вы можете сказать пользователю, что вы сожалеете о регистрации электронной почты и дать им дополнительные параметры, такие как удаление их электронной почты из вашей системы. Это остановит любые жалобы типа пользовательского сервиса о том, что кто-то вводит мою электронную почту в вашей системе...бла бла бла.

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