Код-ревью 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, валидация, повторный ввод пароля и подтверждение нового адреса.
Что должен найти ревьюер
- Безопасностьстрока 4
@csrf_exemptотключает встроенную защиту Django: смену email можно подделать с чужого сайта. - Безопасностьстрока 8Значение принимается и из GET: смена email по ссылке.
- Ошибкастрока 8Email не валидируется и может быть пустым.
- Безопасностьстрока 9Смена email без подтверждения пароля и письма на новый адрес: путь к захвату аккаунта через сброс пароля.
Разбор
Смена email критичное действие: через неё захватывают аккаунт. Нужны CSRF-защита, только POST, валидация, повторный ввод пароля и подтверждение нового адреса.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.