Django的黑名单用户和主机。自动黑名单利率有限的客户。

django-blacklist的Python项目详细描述


Django黑名单

Django的黑名单用户和主机。自动黑名单利率有限的客户。

概述

Django黑名单允许您阻止特定用户和IP地址/网络访问您的应用程序。 可以从管理界面手动阻止客户端,或者在超过请求速率限制后自动阻止客户端。 黑名单规则适用于特定的持续时间。

安装

要安装软件包,请运行:

$ pip install django-blacklist

blacklist应用程序添加到INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'blacklist'
]

AuthenticationMiddleware

之后添加blacklist_middleware中间件
MIDDLEWARE = [
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'blacklist.middleware.blacklist_middleware',
    ...
]

应用黑名单数据库迁移:

$ python manage.py migrate blacklist

用法

你可以从管理员那里管理黑名单规则。更改在重新启动服务器后生效。 规则可以针对用户或IP地址。 您还可以通过指定可选的prefixlen字段(网络前缀位的数目)以IP网络(范围)为目标。 每个规则都有特定的持续时间。在该持续时间过后,规则将自动过期,不需要重新启动。 当请求由于匹配规则而被拒绝时,将返回一个http状态为400(坏请求)的响应, 日志程序django.security输出错误。

删除过期的规则

过期的规则不会自动从数据库中删除。 可以使用附带的管理命令trim_blacklist

$ python manage.py trim_blacklist [-c <created_days>] [-e <expired_days>]

选项-c-e分别指定创建和到期的最短时间。

自动黑名单

超过指定的请求速率限制后,可以自动将客户端列入黑名单。 此功能需要django-ratelimit

首先,通过应用@ratelimit装饰器来限制视图的速率。确保设置block=False。 然后,黑名单通过添加@blacklist_ratelimited装饰器来限制客户端的速率。指定黑名单持续时间。 例如:

from datetime import timedelta
from ratelimit.decorators import ratelimit
from blacklist.ratelimit import blacklist_ratelimited

@ratelimit(key='user_or_ip', rate='50/m', block=False)
@blacklist_ratelimited(timedelta(minutes=30))
def index(request):
    ...

自动规则立即生效,无需重新启动。 如果请求来自经过身份验证的用户,则规则将以该用户为目标。 否则,它将以他们的IP地址为目标。


注意:客户端IP地址取自request.METAREMOTE_ADDR值。 如果您的应用程序位于一个或多个反向代理后面,默认情况下, 始终是最近的代理的地址。 为了避免将所有客户列入黑名单,您可以从中间件中的X-Forwarded-For头设置REMOTE_ADDR。 但是,请记住,可以伪造此标头以绕过速率限制。 要解决这个问题,可以使用该头中的最后一个地址。 如果你在两个代理后面,使用第二个到最后,等等


@blacklist_ratelimited接受两个参数:(duration, block=True)

  • duration可以是一个timedelta对象,也可以是两个独立持续时间的元组 (用于基于用户和基于IP的规则)。
  • block指定是立即拒绝请求,还是将请求传递给视图。

自动规则将有一个包含请求ID的注释,该注释触发了规则的创建, 以及“请求线”。 只有在可用时才添加请求ID。django不生成请求id。 为此,您可以安装django-log-request-id

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java搜索文本中的字符串模式   SecurityManager引发异常的java Mockito模拟   java(仅限Netbeans)未找到适合jdbc的驱动程序:mysql://localhost   java计算给定字符串所有前缀的哈希值的子字符串的哈希值   java如何避免每次访问REST认证API以使用实际服务   用于HTML的java Jsoup选择器组合   可以复制或引用的java构造函数   Java中的HashMap。搞砸containsKey返回意外值   java数组平均值计算   java是检查字符串是否包含特定字符的最有效方法   java反序列化对象类已更改   java典型的EJB3/JPA/JSF中的事务范围是什么?   Install4j的java错误代码20   java:compileJava在本地项目()依赖项上的多模块项目上持续失败“错误:包x.y.z不存在”   java有一种生成Suppression的方法。现有代码库中checkstyle的xml文件?