С точки зрения конечного пользователя, однократная отмена подписки прекрасна.
Однако использование hash (id + secret) небезопасно, потому что умный злоумышленник может очень быстро «перевести» секрет, а затем перейти к отписанию каждого пользователя в вашей БД просто путем увеличения идентификатора.
Безопаснее хранить идентификатор «полусекретный» на сервере и использовать адрес электронной почты для поиска пользователя после отмены подписки. Таким образом, успешная отмена подписки требует сопряжения адреса электронной почты с правильным идентификатором. Вы можете сделать это еще более безопасным, сохранив по-настоящему секретный ключ для каждого пользователя и используя это вместо ID. Это особенно необходимо, если публикуются пары электронной почты + ID.
Так, например, ваша отписки ссылка будет выглядеть следующим образом:
http://mydomain.com/unsubscribe?email={$email}&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'])
Позвольте мне получить это прямо ... параметр userID в этом случае будет хэширован с хэш-параметром. Таким образом, params являются userID и hash, а затем hash (hashedUserID, hash) = userID .... правильно? – Tony
Я думаю, что он означает url =/unsub? UserID = x & hash = $ hash (x + secret), где секрет - это то, что вы не раскрываете. –
Тогда я должен хранить секрет в базе данных, который по существу будет кодом дезактивации. Так в чем же преимущество? – Tony