联系表单的 CSRF 豁免 - Django

问题描述

对联系表单或使用 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] 帐户发送垃圾邮件,甚至无需加载您的表单视图。