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.META
的REMOTE_ADDR
值。
如果您的应用程序位于一个或多个反向代理后面,默认情况下,
始终是最近的代理的地址。
为了避免将所有客户列入黑名单,您可以从中间件中的X-Forwarded-For
头设置REMOTE_ADDR
。
但是,请记住,可以伪造此标头以绕过速率限制。
要解决这个问题,可以使用该头中的最后一个地址。
如果你在两个代理后面,使用第二个到最后,等等
@blacklist_ratelimited
接受两个参数:(duration, block=True)
。
duration
可以是一个timedelta
对象,也可以是两个独立持续时间的元组 (用于基于用户和基于IP的规则)。block
指定是立即拒绝请求,还是将请求传递给视图。
自动规则将有一个包含请求ID的注释,该注释触发了规则的创建, 以及“请求线”。 只有在可用时才添加请求ID。django不生成请求id。 为此,您可以安装django-log-request-id。