繁体   English   中英

如何在Django Rest Framework中保护注册和登录API?

[英]How to secure APIs for Registration and Login in Django Rest Framework?

我一直和现在几乎每个Django Framework用户都使用Django Rest Framework来创建REST API。 我正在使用它使用django-rest-framework-jwt进行令牌认证,并在用户通过我们的其余API登录时返回令牌。

所以问题是如何保护我们的API端点的任何注册或登录视图。任何高级XSS脚本都可能有恶意循环来创建注册。我们如何在Django Rest Framework中保护它?

正如您所说,您不能拥有像JWT这样的身份验证系统来保护您的网页,例如登录和注册。 但是,您还可以做很多其他事情。 下面我简要提到其中两个,让你开始休息,你可以详细研究。

  • 首先解决XSS问题 -

某些浏览器能够阻止似乎是XSS攻击的内容。 他们通过在页面的GET或POST参数中查找JavaScript内容来工作。 如果在服务器的响应中重放了JavaScript,则会阻止页面呈现,并显示错误页面。 X-XSS-Protection标头用于控制XSS过滤器的操作。

履行

Django提供了在settings> base.py中间件中添加的中间件和设置:

django.middleware.security.SecurityMiddleware

设置:

SECURE_BROWSER_XSS_FILTER = True
This sets header to X-XSS-Protection: 1; mode=block

您可以采取其他措施防止某些脚本反复登录您的登录页面或注册页面 -

  • 蛮力攻击

安全问题

自动程序可能会攻击以破解用户的用户名和密码或减慢服务器的速度。

这些攻击通常采用以下几种形式之一:1。一个IP地址尝试使用多个密码的用户名。 2.许多IP地址尝试使用多个密码的用户名。 3.一个IP地址尝试使用一些常用密码的许多用户名。 4.许多IP地址尝试使用一个或几个通用密码的许多用户名。 5.攻击域上的任何随机URL以减慢服务器响应。

履行

Django Rest Framework提供了内置的限制设置

REST_FRAMEWORK = {
    ...
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
        'rest_framework.throttling.ScopedRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '60/minute',
        'app1': '10000/day',
        'app2': '10000/day',
    },
    ...
}

另一个解决方案是django-defender或django-ratelimit,仅用于防止失败的登录尝试。

希望能帮助到你。

我在定制的Django REST Throttling之后找到了解决方案,

它在3次登录尝试后阻止特定用户(在我的应用程序中阻止user_id)。 匿名用户登录6次后阻止IP地址。

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):
           ....
       ....

settings.py:-

# Django-rest-framework
REST_FRAMEWORK = {
    ...
    ...
    ...
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.UserRateThrottle',

    ),
    'DEFAULT_THROTTLE_RATES': {
        'loginAttempts': '6/hr',
        'user': '1000/min',
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM