Код-ревью Junior CSRF, SameSite и CORS обновлено

Ревью: представление Django для смены email

Вопрос

Найдите проблемы в представлении.

from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse

@csrf_exempt
def change_email(request):
    if not request.user.is_authenticated:
        return JsonResponse({"error": "auth"}, status=401)
    new_email = request.GET.get("email") or request.POST.get("email")
    request.user.email = new_email
    request.user.save()
    return JsonResponse({"ok": True})

Коротко

Смена email критичное действие: через неё захватывают аккаунт. Нужны CSRF-защита, только POST, валидация, повторный ввод пароля и подтверждение нового адреса.

Что должен найти ревьюер

  1. Безопасностьстрока 4
    @csrf_exempt отключает встроенную защиту Django: смену email можно подделать с чужого сайта.
  2. Безопасностьстрока 8
    Значение принимается и из GET: смена email по ссылке.
  3. Ошибкастрока 8
    Email не валидируется и может быть пустым.
  4. Безопасностьстрока 9
    Смена email без подтверждения пароля и письма на новый адрес: путь к захвату аккаунта через сброс пароля.

Разбор

Смена email критичное действие: через неё захватывают аккаунт. Нужны CSRF-защита, только POST, валидация, повторный ввод пароля и подтверждение нового адреса.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме