我想实现一个时事通讯服务。该服务的用户将每周收到电子邮件,并且在每个电子邮件的底部将有一个";取消订阅链接";。用户单击该链接将直接取消订阅该服务。一种方法可以是散列电子邮件id以生成每个用户的令牌,然后这些令牌可以用于创建";取消订阅链接";对于该用户。
我正在用python实现这个系统,我发现提供这种功能的库是危险的。
当每个用户注册并为所有时事通讯的取消订阅链接使用相同的令牌时,为他们生成一个令牌是否安全?如果没有,该如何进行?
如果您将令牌与用户条目一起存储,为什么要增加通过哈希生成从用户电子邮件地址派生的令牌的复杂性?
您只需生成一个随机令牌(例如,在注册时(,为您的用户存储该令牌,电子邮件中的取消订阅链接将发送电子邮件地址和令牌作为参数。请注意,这意味着所有此类电子邮件都将包含可用于取消订阅用户的令牌,但这可能没问题(但不要将令牌用于其他目的(。您还可以为每封电子邮件生成和存储不同的随机令牌,并存储过期的令牌,这样令牌的数量就会受到限制。这样做的好处是攻击者可以在有限的时间内访问这样的取消订阅令牌,而且你还可以知道是哪封电子邮件让你的用户取消订阅。
此外,该链接不应直接取消订阅用户,因为一些电子邮件客户端可能会在用户打开电子邮件时下载链接。您应该有一个确认步骤,为了防止CSRF,该确认应该使用POST来实际取消订阅用户(传递相同的令牌(。