Каков наилучший способ использовать ссылку для отказа от подписки на вашу рассылку новостей?
-
21-08-2019 - |
Вопрос
Я думаю, что я создаю код деактивации, добавляя его в ссылку для отмены подписки вместе с идентификатором пользователя.Затем, когда получатель моей рассылки нажимает на ссылку, я могу посмотреть его идентификатор пользователя и посмотреть, совпадает ли код деактивации.
Похоже ли это на лучший способ?
Каковы какие-то другие способы?
Решение
Вы могли бы просто использовать алгоритм хеширования для защиты идентификатора пользователя (чтобы никто не мог отменить регистрацию всей вашей базы данных с помощью неприятного цикла).
В итоге вы получите два параметра :Идентификатор пользователя и хэш.
Преимущество заключается в том, что вам не нужно будет сохранять какое-либо соответствие между кодом деактивации и идентификатором пользователя.
Другие советы
С точки зрения конечного пользователя, отмена подписки в один клик - это превосходно.
Однако использование хэша (id + secret) небезопасно, потому что умный злоумышленник может очень быстро "взломать" секрет, а затем отказаться от подписки на каждого пользователя в вашей базе данных, просто увеличив идентификатор.
Гораздо безопаснее сохранять идентификатор "полусекретным" на сервере и использовать адрес электронной почты для поиска пользователя при отказе от подписки.Таким образом, для успешной отмены подписки требуется сопоставление адреса электронной почты с правильным идентификатором.Вы можете сделать это еще более безопасным, сохранив действительно секретный ключ для каждого пользователя и используя его вместо идентификатора.Это особенно необходимо, если опубликованы пары email + ID.
Так, например, ваша ссылка для отказа от подписки будет выглядеть следующим образом:
http://mydomain.com/unsubscribe?email={$email}&hash={$hash}
А серверная функция для генерации $hash в PHP выглядела бы примерно так:
<?php
function unsubscribeHash($id, $email) {
$hashSecret = 'Fz!Fx~36N66>io3B-vlPDshdRxos8JjCd4+Ld-s2^ca{19Q/5u';
return sha1($id . $email . $hashSecret);
}
?>
Затем, чтобы завершить отказ от подписки, вы свяжетесь с пользователем по электронной почте и подтвердите
$_GET['hash'] == unsubscribeHash($user_id, $_GET['email'])
С точки зрения пользователя, не требуйте, чтобы пользователь вводил адрес электронной почты, чтобы отказаться от подписки.Подход, при котором вся информация встроена в ссылку (такую, как вы описываете), намного лучше.