php - Достаточно ли безопасно использование UUID в ссылке для отмены подписки на новостную рассылку? - PullRequest
1 голос
/ 01 апреля 2020

Я работаю над сценарием рассылки php. У меня есть таблица подписчиков MySQL, где каждому пользователю назначено UUID, и я удивляюсь, было бы достаточно безопасно использовать ее в ссылке для отмены подписки.

Я создаю ее, заменяя атрибут href вместе с query и UUID, которые соответствуют электронной почте пользователя:

// Get UUID based on submitted email

$link = "href='https://example.com/unsubscribe.php?id=$uuid'>unsubscribe</a>)";

$html_message = file_get_contents('welcome_template.html');
$html_message = str_replace('href="">unsubscribe</a>', $link, $html_message);

// Headers and stuff

mail($email, $respond_subject, $html_message, $headers, '-fhello@example.com');

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

Этот ответ на аналогичный вопрос гласит, что

Более простой метод - это случайная строка заданного * Длина 1027 * (например, 30 символов), хранящаяся в таблице с уникальным ограничением для этого поля.

Является ли UUID допустимой случайной строкой?

1 Ответ

1 голос
/ 16 апреля 2020

Предсказуемость зависит от того, какую версию UUID вы используете:

  1. Легко предсказуемо, если у них сэмплы сгенерированы на одном компьютере в одно и то же время.
  2. Легко предсказуемо, если они имеют сэмплы, сгенерированные на одной машине примерно в одно и то же время.
  3. Очень легко предсказуемо, если вы опубликуете sh ваше пространство имен UUID
  4. Полностью непредсказуемо
  5. Очень легко предсказуемо, если Вы публикуете sh UUID вашего пространства имен

* Функция UUID () 1024 * создает UUID V1, но есть другие генераторы для получения других версий, если это необходимо.

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

Именно поэтому многие такие системы не заботятся о защите этой поверхности и вместо этого отправляют электронное письмо с подтверждением отписавшемуся пользователю со ссылкой либо «нажмите, чтобы подтвердить», либо «нажмите, чтобы отменить "в зависимости от того, насколько вероятно, что атаки или ошибки будут против законных запросов. И эта ссылка должна включать случайный уникальный идентификатор, сгенерированный для этого указанного c запроса на отмену подписки, чтобы у злоумышленника не было надежды угадать его.

...