Django中的加密和解密
我正在努力在我的电子邮件上实现“取消订阅链接”。我正在为未订阅的用户维护一个表 我想知道的电子邮件地址,一旦用户点击取消订阅链接。当然,我不能将其作为get参数发送,因为可以很容易地修改它 一个例子是,我想给我的10个朋友发送电子邮件,每封电子邮件都是HTML电子邮件,并且有一个取消订阅URL,因此如果用户单击链接,他就会被添加到我的Django中的加密和解密,django,encryption,unsubscribe,Django,Encryption,Unsubscribe,我正在努力在我的电子邮件上实现“取消订阅链接”。我正在为未订阅的用户维护一个表 我想知道的电子邮件地址,一旦用户点击取消订阅链接。当然,我不能将其作为get参数发送,因为可以很容易地修改它 一个例子是,我想给我的10个朋友发送电子邮件,每封电子邮件都是HTML电子邮件,并且有一个取消订阅URL,因此如果用户单击链接,他就会被添加到我的取消订阅模式中,然后我就不会给他们发送电子邮件 我想以某种方式加密电子邮件地址,将其作为get参数传递,然后在视图中解密并将其存储在我的数据库中。 我不知道在Dja
取消订阅模式中,然后我就不会给他们发送电子邮件
我想以某种方式加密电子邮件地址,将其作为get参数传递,然后在视图中解密并将其存储在我的数据库中。
我不知道在Django该怎么做。
如果有更好的方法来实现这一点,请告诉我。通常,加密也不是一个好主意,因为如果知道解密密钥,人们可以解密所有可能的内容,此外,它还可以使使用加密密钥开始攻击此应用程序变得相当容易:如果我以某种方式找到加密密钥,我可以构造一个URL,例如重置任意电子邮件地址的密码,从而重置Bob的密码,然后以Bob的身份登录
一个典型的解决方案是构造一个“取消订阅会话”表。如果有人请求取消订阅,您将该人添加到表中,并向其中添加某种随机的id
。最好不要使用主键之类的东西,因为它可以预测上一个和下一个id
s将是什么,然后人们可以“黑客”这个系统来确认另一个人的退订
因此,我们创建一个表,例如GUID(全局唯一标识符):
因此,现在如果您想取消订阅某人,您可以构造这样的UnsubscribingUser
model实例,并发送一封带有链接的电子邮件:
def unsubscribe(request):
uu = UnsubscribingUser.objects.create(user=request.user)
# send mail with uu.uuid
# ...
pass
然后,电子邮件应包含链接到处理UUID的视图的URL:
from datetime import datetime
from django.http import Http404
def unsubscribe_url(request, uuid):
uu = get_object_or_404(UnsubScribingUser, uuid=uuid)
if uu.expires <= datetime.now():
# unsubscribe logic
# ...
uu.delete()
else:
# too late
# do something in that case, for example
uu.delete()
raise Http404
从日期时间导入日期时间
从django.http导入Http404
def取消订阅url(请求,uuid):
uu=获取对象或404(取消订阅者,uuid=uuid)
如果uu.expires过期,为什么要加密它?不仅仅是散列?那么我应该如何在Django中进行散列和去散列?散列函数的思想是,在合理的时间内不可能对其进行去散列。密码通常也与hashfunction一起存储……此外,我真的不知道“未订阅用户”表是否符合GDPR。如果我回忆正确,欧盟用户的数据应该被销毁,如果不再需要的话。非常感谢,这个解决方案很好,但我不确定它在我的情况下如何工作。我正在编辑我的问题,以更好地解释我的需求-假设我有几个朋友的电子邮件,我向他们发送HTML电子邮件,每个电子邮件都有一个取消订阅URL,因此每个电子邮件的取消订阅URL将与其他朋友得到的不同,并且URL将有电子邮件(不知何故),在您的解决方案中,我将其存储在db中,我必须为每个用户创建一个UnsubscribingUser
实例,如果我向大量用户发送电子邮件,并且只有少数用户取消订阅,这可能不好。我的用例很简单,我只需要在我的URL中加密我的电子邮件以便取消订阅。
from datetime import datetime
from django.http import Http404
def unsubscribe_url(request, uuid):
uu = get_object_or_404(UnsubScribingUser, uuid=uuid)
if uu.expires <= datetime.now():
# unsubscribe logic
# ...
uu.delete()
else:
# too late
# do something in that case, for example
uu.delete()
raise Http404