问题描述
对联系表单或使用 Django 的 send_mail 函数的表单使用 CSRF 豁免是否安全?
所以根据文档;
抵御 CSRF 攻击的第一道防线是确保 GET 请求 (以及其他“安全”方法,如 RFC 7231#section-4.2.1 所定义)是 无副作用。
POST 请求,它只创建一个电子邮件消息而不接触数据库,被认为是一种“安全”的方法吗?
示例代码
from django.core.mail import BadHeaderError,send_mail
from django.http import HttpResponse,HttpResponseRedirect
def send_email(request):
subject = request.POST.get('subject','')
message = request.POST.get('message','')
from_email = request.POST.get('from_email','')
if subject and message and from_email:
try:
send_mail(subject,message,from_email,['[email protected]'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return HttpResponseRedirect('/contact/thanks/')
else:
# In reality we'd use a form class
# to get proper validation errors.
return HttpResponse('Make sure all fields are entered and valid.')
*来自文档的示例
我只是想知道在添加 CSRF 豁免之前我是否没有遗漏一些东西。现在我听到你在想,为什么有人要禁用 CSRF 验证?
在欧盟,我们必须遵守 GDPR。通过设置cookie,我们需要明确要求用户接受cookie,如果我们可以阻止设置cookie,我们就不需要显示cookie提示;)
解决方法
当您应用 csrf_excempt 装饰器时,您是说来自任何地方的任何人都可以向您发送帖子,当您站点中的任何人在其浏览器中加载联系表单时,您正在禁用 django 提供的验证,也许他们无法做任何事情使用数据库,但他们可以从任何地方向您的 [email protected] 帐户发送垃圾邮件,甚至无需加载您的表单视图。