How to prevent brute force attack in Django Rest + Using Django Rest Throttling

后端 未结 1 1571
失恋的感觉
失恋的感觉 2021-01-01 05:07

Block particular user for some specific time to using Django REST Throttling.

I have seen Django REST Throttling.

I don\'t want to

相关标签:
1条回答
  • 2021-01-01 06:11

    I have found the solution after customized Django REST Throttling,

    Its Blocking particular user after 3 login attempts (Block user_id that presents in my application). Block IP address after 6 login attempts for anonymous user.

    prevent.py:-

    #!/usr/bin/python
    
    from collections import Counter
    
    from rest_framework.throttling import SimpleRateThrottle
    from django.contrib.auth.models import User
    
    
    class UserLoginRateThrottle(SimpleRateThrottle):
        scope = 'loginAttempts'
    
        def get_cache_key(self, request, view):
            user = User.objects.filter(username=request.data.get('username'))
            ident = user[0].pk if user else self.get_ident(request)
    
            return self.cache_format % {
                'scope': self.scope,
                'ident': ident
            }
    
        def allow_request(self, request, view):
            """
            Implement the check to see if the request should be throttled.
            On success calls `throttle_success`.
            On failure calls `throttle_failure`.
            """
            if self.rate is None:
                return True
    
            self.key = self.get_cache_key(request, view)
            if self.key is None:
                return True
    
            self.history = self.cache.get(self.key, [])
            self.now = self.timer()
    
            while self.history and self.history[-1] <= self.now - self.duration:
                self.history.pop()
    
            if len(self.history) >= self.num_requests:
                return self.throttle_failure()
    
            if len(self.history) >= 3:
                data = Counter(self.history)
                for key, value in data.items():
                    if value == 2:
                        return self.throttle_failure()
            return self.throttle_success(request)
    
        def throttle_success(self, request):
            """
            Inserts the current request's timestamp along with the key
            into the cache.
            """
            user = User.objects.filter(username=request.data.get('username'))
            if user:
                self.history.insert(0, user[0].id)
            self.history.insert(0, self.now)
            self.cache.set(self.key, self.history, self.duration)
            return True
    

    view.py:-

      from .prevent import UserLoginRateThrottle
       ....
       ....
       ....
       class ObtainAuthToken(auth_views.ObtainAuthToken):
           throttle_classes = (UserLoginRateThrottle,)/use this method here your login view
    
           def post(self, request, *args, **kwargs):
               ....
           ....
    

    Add some parameters in setting file

    settings.py:-

    # Django-rest-framework
    REST_FRAMEWORK = {
        ...
        ...
        ...
        'DEFAULT_THROTTLE_CLASSES': (
            'rest_framework.throttling.UserRateThrottle',
    
        ),
        'DEFAULT_THROTTLE_RATES': {
            'loginAttempts': '6/hr',
            'user': '1000/min',
        }
    }
    
    0 讨论(0)
提交回复
热议问题