Я начинаю разрабатывать регистрацию пользователя в моем проекте. Пользователи подтвердят свою регистрацию по ссылке, отправленной по электронной почте.
Я подумал, что смогу использовать адрес электронной почты, вставленный в форму, плюс случайную соль и хэшировать эту конкатенированную строку, чтобы каждый токен строки становился уникальным. Ссылка будет примерно такой:
http://www.example.com/register/7ddf32e17a6ac5ce04a8ecbf782ca509
Я думаю, что это хорошо и легко построить, но я не уверен, достаточно ли он безопасен.
Я разрабатываю этот проект с использованием CakePHP 2.7 и SQL Server 2014.
Это действительно зависит от того, как вы генерируете MD5. Просто убедитесь, что ваши данные случайны. Я не использую MD5 для генерации этих типов хешей, а вместо этого сделаю что-то вроде:
$email_token = openssl_random_pseudo_bytes(16);
$token = bin2hex($email_token);
Лично я бы выбрал что-то подобное, используя random_bytes если использовать PHP7.
$email_token = bin2hex(random_bytes($length));
Для PHP5 доступен полифилл: https://github.com/paragonie/random_compat
Вам следует подумать о том, что может сделать потенциальный злоумышленник, если он способен генерировать токены, которые ему не принадлежат, а затем решить, достаточно ли хорош хеш MD5.
Если я правильно понял, вы просто хотите проверить электронную почту пользователя и создать учетную запись, только если пользователь действительно владеет адресом электронной почты. Будет ли это плохо для вас или владельца адреса, если злоумышленник создаст 1000 учетных записей с поддельными электронными письмами?
Как всегда, безопасность зависит от ситуации, ИМО.
Если вы хотите быть осторожным, не позволяйте токену зависеть от пользовательских данных. Создайте совершенно случайный токен и сохраните его рядом с ожидающей регистрацией в вашей базе данных.
Использовать совершенно случайно значение для пользователя, которое вы генерируете во время регистрации, пропустите его через «sha1» или «sha2», сохраните его в БД и используйте в электронном письме. Затем вы просто проверяете, есть ли это значение в базе данных. Если вы хотите дополнительно связать хеш с другой точкой данных (например, с адресом электронной почты), тем лучше.