【问题标题】:CSRF exempt for contactform - DjangoCSRF 豁免联系表格 - Django
【发布时间】:2021-07-20 00:11:38
【问题描述】:

对联系人表单或使用 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, ['admin@example.com'])
        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提示;)

【问题讨论】:

  • 老实说,我认为您误解了 GDPR:根据 GDPR 的思维方式,在数据库中存储个人数据(在这种情况下是发件人的电子邮件地址)比使用饼干。所以在我看来,无论如何你都必须请求许可。
  • 我们是否保存用户的电子邮件地址?

标签: django cookies django-forms csrf django-csrf


【解决方案1】:

当您应用 csrf_excempt 装饰器时,您是在说任何地方的任何人都可以向您发布帖子,当您的站点中的任何人在他们的浏览器中加载联系表单时,您正在禁用 django 提供的验证,也许他们无能为力使用数据库,但他们可以从任何地方向您的 admin@example.com 帐户发送垃圾邮件,甚至无需加载您的表单视图。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2021-07-30
    • 2020-06-22
    • 2016-10-03
    • 2019-05-06
    • 2013-05-05
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多