我想我创建一个停用代码,将其与用户 ID 一起放入取消订阅链接中。然后,当我的时事通讯的收件人单击该链接时,我可以查找他们的用户 ID 并查看停用代码是否匹配。
这听起来是最好的方法吗?
还有哪些其他方法?
实施单击取消订阅功能可让收件人轻松选择退出时事通讯或交易电子邮件,从而显着增强用户体验。这种方法不仅符合法律要求,而且尊重用户偏好,有可能提高您的品牌认知度。
利用第三方电子邮件服务通常是管理取消订阅功能的最直接、最安全的方法。 SendGrid、MailGun、Brevo 和 Postmark 等服务提供符合法律标准且用户友好的内置取消订阅机制。这些平台可处理取消订阅功能的复杂性,让您能够专注于核心业务活动。
如果您希望实现自己的取消订阅系统,则必须确保其安全并验证用户确实希望取消订阅。此验证可防止未经用户同意而恶意取消订阅用户的尝试。
一种简单的方法涉及使用唯一的、未发布的用户标识符的哈希值与全局秘密相结合。这种方法可确保退订链接特定于用户,并且攻击者无法轻易猜测或暴力破解。
const APP_SECRETS = [
'🦕 dinosaurs ⭐ 5975a2e459b480418e92da905ca839f3',
'🍄 mushrooms 🌟 cbd8b97768188bbff79fbdfe4be77a2a',
];
function generateUnsubscribeUrlData(user) {
return {
id: user.email,
hash: secureHash(user.uniqueUnsubscribeId + APP_SECRETS[0])
};
}
function verifyUnsubscribeUrlData(db, email, hash) {
const user = db.users.findByEmail(email);
for (const secret of APP_SECRETS) {
if (secureHash(user.uniqueUnsubscribeId + secret) === hash) {
return true;
}
}
return false;
}
注意事项:确保您的全局秘密是可靠的,并且您的唯一标识符不易被猜测。使用多个不可猜测的用户信息可以增强安全性。
一种更安全但空间效率较低的方法是为每封取消订阅的电子邮件生成一个唯一的随机数。该随机数不是直接存储的,而是使用安全的加盐哈希函数进行哈希处理。取消订阅链接包含用户的 ID 和随机数,该随机数根据存储的哈希值进行验证。
由于轮换机密或删除用户而导致的过期取消订阅链接应将用户重定向到电子邮件首选项页面。提供无缝登录重定向(例如,
/login?redirectTo=/user/email/preferences
)可确保用户即使取消订阅链接已过期也可以轻松管理其电子邮件首选项。
您可以使用散列算法来保护用户ID(这样就没有人可以通过令人讨厌的循环取消注册您的所有数据库)。
您最终会得到两个参数:userID 和 hash。
优点是您不需要存储停用代码和用户 ID 之间的任何映射。
从用户的角度来看,不需要用户输入电子邮件地址来取消订阅。将所有信息嵌入链接中的方法(例如您所描述的)要好得多。