Каковы наилучшие методы для активации/регистрации/пароля- reset ссылок в сообщениях электронной почты с помощью nonce
Приложения отправляют электронные письма для проверки учетных записей пользователей или пароля reset. Я считаю, что это так, как должно быть, и я прошу ссылки и реализации.
Если приложение должно отправить ссылку в электронном письме для проверки адреса пользователя, в соответствии с моим представлением ссылка и обработка приложения ссылки должны иметь следующие характеристики:
- Ссылка содержит nonce в URI запроса (
http://host/path?nonce
).
- По ссылке (GET) пользователю предоставляется форма, необязательно с номером.
- Пользователь подтверждает ввод (POST).
- Сервер получает запрос и
- проверяет входные параметры,
- выполняет изменение,
- и делает недействительным значение nonce.
Это должно быть правильно для HTTP RFC по безопасным и идемпотентным методам.
Проблема заключается в том, что этот процесс включает в себя одну дополнительную страницу или действие пользователя (пункт 3), которое считается излишним (если не бесполезным) для многих людей. У меня возникли проблемы с представлением такого подхода для сверстников и клиентов, поэтому я прошу внести свой вклад в эту более широкую техническую группу. Единственный аргумент, который я имел против пропустить шаг POST, - это возможная предварительная загрузка ссылки из браузера.
- Есть ли ссылки на эту тему, которые могли бы лучше объяснить эту идею и убедить даже нетехнического человека (лучшие практики из журналов, блогов,...)?
- Существуют ли ссылочные сайты (предпочтительно популярные и со многими пользователями), которые реализуют этот подход?
- Если нет, существуют ли документированные причины или эквивалентные альтернативы?
Спасибо,
Kariem
Детали, сохраненные
Я сохранил основную часть короткой, но чтобы уменьшить слишком много дискуссий вокруг деталей, которые я намеренно упустил, добавлю несколько предположений:
- Содержание сообщения не является частью этого обсуждения. Пользователь знает, что ей нужно щелкнуть ссылку, чтобы выполнить действие. Если пользователь не реагирует, ничего не произойдет, что также известно.
- Нам не нужно указывать, почему мы отправляем по почте пользователя, а также политику связи. Мы предполагаем, что пользователь ожидает получить электронное письмо.
- У nonce есть временная метка истечения срока действия и напрямую связана с адресом электронной почты получателей, чтобы уменьшить дубликаты.
Примечания
С OpenID и т.п. обычные веб-приложения освобождаются от внедрения стандартного управления учетными записями пользователей (пароль, электронная почта...), но некоторые клиенты хотят "своих пользователей"
Как ни странно, я еще не нашел удовлетворительного вопроса и ответа. Что я нашел до сих пор:
Ответы
Ответ 1
Этот вопрос очень похож на Внедрение безопасных уникальных URL-адресов для однократного использования в ASP.NET(С#).
Мой ответ рядом с вашей схемой, с несколькими указанными вопросами - например, короткий срок действия, обработка двойных регистраций и т.д.
Важное значение имеет использование использования криптографического nonce, что многие, как правило, пропускают - например, "позволяет просто использовать GUID"...
Один новый момент, который вы делаете, поднимает, и это важно здесь, это идемпотентность GET.
Пока я согласен с вашим общим намерением, ясно, что идемпотентность прямо противоречит одноразовым ссылкам, что является необходимостью в некоторых ситуациях, подобных этому.
Мне хотелось бы сказать, что это действительно не нарушает идемпотентность GET, но, к сожалению, это так... С другой стороны, RFC говорит, что GET СЛЕДУЕТ быть идемпотентным, его не ДОЛЖЕН. Поэтому я бы сказал, откажись от этого в этом случае, и придерживайтесь одноразовых авто-недействительных ссылок.
Если вы действительно хотите стремиться к строгому соблюдению RFC и не попасть в не-идемпотентные (?) GET, вы можете иметь страницу GET, автоматически отправляющую POST-вид лазейки вокруг этого бита RFC, но законным, и вы не требуете от пользователя двойного оптика, и вы не подслушиваете его...
Вам не нужно беспокоиться о предварительной загрузке (вы говорите о CSRF или оптимизаторах браузера?)... CSRF бесполезен из-за nonce, а оптимизаторы обычно не обрабатывают javascript (используемый для автоматической отправки) на предварительно загруженная страница.
Ответ 2
О пароле reset:
Практика этого, отправляя электронное письмо на зарегистрированный пользователем адрес электронной почты, в то время как очень распространенная на практике, не является хорошей защитой. Выполнение этого полностью отключает защиту вашего приложения от поставщика электронной почты пользователя. Неважно, сколько длинных паролей вам нужно и какое умное шифрование пароля вы используете. Я смогу попасть на ваш сайт, прочитав электронное письмо, отправленное пользователю, учитывая, что у меня есть доступ к учетной записи электронной почты или я могу прочитать незашифрованное письмо в любом месте на своем пути к пользователю (подумайте: злые системные администраторы).
Это может быть или не быть важным в зависимости от требований безопасности данного сайта, но я, как пользователь сайта, по крайней мере захотел бы отключить такую функцию пароля reset, так как считаю это небезопасно.
Я нашел этот белый документ, в котором обсуждается тема.
Краткая версия того, как это сделать безопасным способом:
-
Требовать жесткие факты об учетной записи
- имя пользователя.
- адрес электронной почты.
- 10-значный номер счета или другая информация
как номер социального страхования.
-
Требовать, чтобы пользователь отвечал как минимум на три предопределенных вопроса (предопределенные вами,
не позволяйте пользователю создавать свои собственные вопросы), которые не могут быть тривиальными. Как "Что
ваше любимое место отдыха ", а не" Какой ваш любимый цвет ".
-
Необязательно: отправьте код подтверждения на предопределенный адрес электронной почты или номер ячейки (SMS), который должен ввести пользователь.
-
Разрешить пользователю вводить новый пароль.
Ответ 3
Я вообще согласен с вами с некоторыми изменениями, предложенными ниже.
- Пользователь регистрируется на вашем сайте, предоставляя электронное письмо.
- Адрес электронной почты проверки отправляется на учетную запись пользователя с двумя ссылками:
a) Одна ссылка с GUID для проверки регистрации. b) Одна ссылка с GUID для отклонения проверки.
- Когда они посещают URL-адрес проверки по электронной почте, они автоматически проверяются, и руководство по проверке помечено как таковое в вашей системе.
- Когда они посещают URL-адрес отклонения по электронной почте, они автоматически удаляются из очереди возможных проверок, но, что более важно, вы можете сообщить пользователю, что вы сожалеете о регистрации по электронной почте, и дайте им дополнительные варианты, такие как удаление их электронной почты с вашего система. Это остановит любые жалобы типа персонализированного типа о том, кто входит в мою электронную почту в вашей системе... blah blah blah.
Да, вы должны предположить, что когда они нажимают ссылку подтверждения, которую они проверяют. Сделать их нажатием второй кнопки на странице немного и нужно только для двойной регистрации в стиле, когда вы планируете спам зарегистрированного лица. Стандартные схемы регистрации/проверки обычно не требуют этого.