Найти - Пользователи
Полная версия: Возможно ли для работы csrf токена сделать исключения для конкретного IP адреса?
Начало » Django » Возможно ли для работы csrf токена сделать исключения для конкретного IP адреса?
1
ivn
Добрый день.
Возможно ли для работы csrf токена сделать исключения для конкретного IP адреса?
Т.е. например по POST запросу от такого то ip не отрабатывать csrf токен?
Спасибо.
ivn
Думается сделать так:
csrf_exempt(view) и потом проверять выдергивать ip из request
мб кто сталкивался?
scidam
Попробуйте создать свой middleware, ответственный за проверку csrf. Например, как-то так:

 from django.conf import settings
# some utility function that gets clients ip address, e.g. 
def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[-1].strip()
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip
# middleware.py
class MyCustomCsrfMiddleware(CsrfViewMiddleware):
    def process_view(self, request, callback, callback_args, callback_kwargs):
        ip = get_client_ip(request)
        trusted_ip_list = getattr(settings, 'TRUSTED_CSRF_IPS', [])
        if trusted_ip_list:
            if request.META['IP_ADDRESS'] in trusted_ip_list:
                return self._accept(request)
        return super().process_view(request,callback, callback_args, callback_kwargs)
# TRUSTED_CSRF_IPS = ["103.12.12.7", ] # shold be defined in your settings.py
ivn
scidam
Попробуйте создать свой middleware, ответственный за проверку csrf. Например, как-то так:
а как подключить?

я как понимаю, вот это имеется ввиду:
 if ip in trusted_ip_list:
вместо:
 if request.META['IP_ADDRESS'] in trusted_ip_list:

?
scidam
ivn
Использовать в перечне MIDDLEWARE_CLASSES свою MyCustomCsrfMiddleware вместо
django.middleware.csrf.CsrfViewMiddleware.
Здесь возможны вариации от версии Django, например, в Django 2.0
MIDDLEWARE_CLASSES теперь просто MIDDLEWARE.
В любом случае нужно ознакомиться c тем как писать middleware для django вашей версии.

ivn
scidam
1.9.10

я как понимаю, вот это имеется ввиду:
 if ip in trusted_ip_list:
вместо:
 if request.META['IP_ADDRESS'] in trusted_ip_list:

?
scidam
Да.
  if ip in trusted_ip_list:

правильней будет (это был псевдокод… )
ivn
Спасибо за ваши рекомендации.
Еще вот вопрос этот токен одноразовый?
Т.е. если пользователь получил токен может ли он по нему сделать сотню или даже больше запросов?
Как от этого принято защищаться? Мб что то есть на этот случай?
Спасибо еще раз.
scidam
Новый csrf токен нужен для каждой новой сессии/аутентификации; если его делать новым при каждом запросе, это даже может вызвать некоторые неудобства: например, человек заполнил форму, отправил ее, возникла ошибка, а потом он нажал “назад” в браузере, т.е. вернулся в первоначальную форму, исправил ее; теперь отправить ее бы не получилось, если бы с каждым запросом генерировался новый csrf токен.
ivn
Наверно уже не по теме, но как бороться с множественными запросами?
Например запустить JS код, который будет бесконечно отправлять POST запросы но создание каких то данных???
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB