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 Cassandra复制因子大于节点数   java J2EE JTA事务回滚不适用于OSE Glassfish 4.0(Build 89)   java spring安全预认证用户登录   org的java类文件。反应流。从RxJava编译示例时未找到Publisher?   java在使用dataFormat作为POJO通过Camel调用Web服务时无法设置SOAP标头   Javafx类的java静态实例   java如何防止一个部件在关闭时覆盖另一个部件的位置   sql server无法从我的java代码连接到数据库   java在JList(Swing)中显示带有的ArrayList   从Java中的CXF服务获取WSAddressing数据   使用资产文件夹进行java简单json解析(本地)   java LDAPException未绑定的无效凭据   JavaJSFspring部署到weblogic   JAVA中字符数组中的特定元素排列?   如果脚本位于不同的目录中,则ant不会使用exec标记运行Javashell脚本