2009-05-12 4 views
5

Я думаю, что я создаю код дезактивации, который помещается в ссылку отмены подписки вместе с идентификатором пользователя. Затем, когда получатель моего информационного бюллетеня нажимает на ссылку, я могу найти идентификатор пользователя и посмотреть, соответствует ли код дезактивации.Каков наилучший способ внедрения ссылки для рассылки новостей?

Это звучит как лучший способ?

Каковы другие способы?

ответ

8

Вы можете просто использовать алгоритм хеширования для защиты идентификатора пользователя (чтобы никто не мог отменить регистрацию всей вашей БД с неприятным циклом).

Вы получите два параметра: userID и hash.

Преимущество в том, что вам не нужно сохранять какое-либо сопоставление между кодом дезактивации и идентификатором пользователя.

+0

Позвольте мне получить это прямо ... параметр userID в этом случае будет хэширован с хэш-параметром. Таким образом, params являются userID и hash, а затем hash (hashedUserID, hash) = userID .... правильно? – Tony

+1

Я думаю, что он означает url =/unsub? UserID = x & hash = $ hash (x + secret), где секрет - это то, что вы не раскрываете. –

+0

Тогда я должен хранить секрет в базе данных, который по существу будет кодом дезактивации. Так в чем же преимущество? – Tony

4

С точки зрения пользователя не требуется, чтобы пользователь вводил адрес электронной почты для отмены подписки. Подход, который содержит всю информацию, встроенную в ссылку (например, вы описываете), намного лучше.

6

С точки зрения конечного пользователя, однократная отмена подписки прекрасна.

Однако использование 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'])