Мои пользователи могут подписаться на темы, которые отправляют им электронное письмо с простой ссылкой для отказа от подписки. Эта ссылка содержит зашифрованный подписчик и проверяющий идентификатор пользователя с помощью этого процесса:
// generate iv and create encrypted data
$iv = openssl_random_pseudo_bytes(16);
$encrypted = openssl_encrypt($data, 'AES-128-CBC', ENCRYPTION_KEY,0,$iv);
// send the iv along with the encrypted text
$ciphertext = $iv . $encrypted;
// generate a hash which can verify the data has not changed
$hash = hash_hmac('sha1', $ciphertext, ENCRYPTION_KEY)
// encode the data for email link
encoded = urlencode(base_64_encode($hash.$ciphertext))
Это генерирует строку как:
www.site.com?id=YzU4MzAzMjljZWUyYmNmY2JmNjE5MGE0YzVhNDUzZjI0YmJmZWI3YoyqdFj6dxA/OVJOw2UN7HErYVV5dmhUVEJzVHBsUGd3aDNHbjVYbmFMa0dhUFczSmpXWnFBN0FyVGxkVml3S041VlhsSXd6TitJYld5QmdhWEFkL3hYSDFiRWdzN0wvNjFXYURiYlNreXpLQ1ZqWnhHMmdCSlZGaUVxU3ZGY3I3RW9GZkJYN3l4Vkp3YmJicg
На стороне сервера я проверяю данные и хэш и проверяю, что подписчик действителен для идентификатора пользователя, содержащегося в данных, а затем отмечаю, что срок подписки истек.
Я разработал это шифрование для временных входов в систему (входов с датой истечения срока действия), но является ли строка из 250 символов избыточной для простой ссылки отказа от подписки? Основные проблемы заключаются в том, что это неприглядно в URL-адресах и текстовых электронных письмах. Также существует риск того, что ссылка будет разорвана в текстовых почтовых клиентах.
Если это будет взломано, то больше всего рискуют записи подписки, помеченные как просроченные. Должен ли я беспокоиться о переутомлении (или о чем-либо еще) Есть ли более простой, но все же безопасный метод? Я нуб с шифрованием. Основной вопрос — сколько достаточно?
Более простой метод — это случайная строка определенной длины (например, 30 символов), хранящаяся в таблице с unique
ограничение на это поле. Это случайное значение не имеет никакого значения, кроме БД, и не может быть расшифровано, поскольку в нем нет информации. Это означает что-либо, только когда вы используете его в предложении where для поиска записи в этой таблице.
Других решений пока нет …