Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
django-defender — 一个简单、超快的 Django 可复用应用,用于阻止暴力破解登录尝试。 | Kitploit
工具/GitHubGitHub/jazzband/django-defender
防御工具密码攻击Web安全身份验证
GitHubjazzband/django-defender

django-defender

一个简单、超快的 Django 可复用应用,用于阻止暴力破解登录尝试。

查看仓库
1.1k144288个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

django-defender

.. image:: https://jazzband.co/static/img/badge.svg :target: https://jazzband.co/ :alt: Jazzband

.. image:: https://img.shields.io/pypi/pyversions/django-defender.svg :alt: 支持的 Python 版本 :target: https://pypi.org/project/django-defender/

.. image:: https://img.shields.io/pypi/djversions/django-defender.svg :target: https://pypi.org/project/django-defender/ :alt: 支持的 Django 版本

.. image:: https://github.com/jazzband/django-defender/workflows/Test/badge.svg :target: https://github.com/jazzband/django-defender/actions :alt: GitHub Actions

.. image:: https://codecov.io/gh/jazzband/django-defender/branch/master/graph/badge.svg :target: https://codecov.io/gh/jazzband/django-defender :alt: 代码覆盖率

.. image:: https://readthedocs.org/projects/django-defender/badge/?version=latest :alt: 文档状态 :target: https://django-defender.readthedocs.io/en/latest/?badge=latest

一个简单的 Django 可复用应用,用于阻止暴力破解登录尝试。目标是使其尽可能快,避免拖慢登录过程。

我们将使用缓存,这样每次登录尝试时无需查询数据库。第一个版本基于 Redis,但目标是使其可配置,以便用户根据需求选择最佳后端。

使用 django-defender 的站点

如果你正在自己的站点上使用 defender,请提交 PR 以将其加入列表。

  • https://hub.docker.com
  • https://www.mycosbuilder.com

文档

文档可在 Read the Docs 上获取:

https://django-defender.readthedocs.io

特性

  • 将所有登录尝试记录到数据库

  • 支持使用不同标头获取 IP 地址的反向代理

  • 基于以下条件进行速率限制

    • 用户名
    • IP 地址
  • 使用 Redis 存储黑名单

  • 配置

    • Redis 服务器

      • 主机
      • 端口
      • 数据库
      • 密码
      • 键前缀
    • 封锁时长

    • 封锁前的错误尝试次数

  • 代码覆盖率 95%

  • 完善的文档

  • 能够将登录尝试存储到数据库

  • 用于清理登录尝试数据库表的管理命令

  • 管理页面

    • 被封锁的用户名和 IP 地址列表
    • 最近的登录尝试列表
    • 解除封锁的功能
  • 可轻松适配自定义认证方法

  • 封锁用户名或 IP 时发送信号

管理页面


.. image:: https://cloud.githubusercontent.com/assets/261601/5950540/8895b570-a729-11e4-9dc3-6b00e46c8043.png :target: https://cloud.githubusercontent.com/assets/261601/5950540/8895b570-a729-11e4-9dc3-6b00e46c8043.png :alt: 管理页面截图 1

.. image:: https://cloud.githubusercontent.com/assets/261601/5950541/88a35194-a729-11e4-981b-3a55b44ef9d5.png :target: https://cloud.githubusercontent.com/assets/261601/5950541/88a35194-a729-11e4-981b-3a55b44ef9d5.png :alt: 管理页面截图 2

系统要求

  • Python: 3.8, 3.9, 3.10, 3.11, 3.12, PyPy
  • Django: 3.2, 4.2, 5.0, 5.1, 5.2
  • Redis: 5.x, 6.x, 7.x

安装

下载代码,并根据方法选择以下一种方式运行 setup。

从 PyPI 安装生产就绪版本:

.. code-block:: bash

pip install django-defender

从源代码下载后安装开发版本:

.. code-block:: bash

python setup.py install

从 GitHub 仓库安装 master 分支开发版本:

.. code-block:: bash

pip install -e git+http://github.com/kencochran django-defender.git#egg=django_defender-dev

首先,你需要将此项目添加到 settings.py 中的 INSTALLED_APPS 列表:

.. code-block:: python

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', # ... 'defender', # ... ]

接下来,安装 FailedLoginMiddleware 中间件:

.. code-block:: python

MIDDLEWARE_CLASSES = [ 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'defender.middleware.FailedLoginMiddleware', ]

如果你想通过 Django 管理后台管理被封锁的用户,请将以下内容添加到 urls.py:

.. code-block:: python

urlpatterns = [ path('admin/defender/', include('defender.urls')), # defender 管理 path('admin/', admin.site.urls), # 常规管理 # 你自己的路由规则... ]

数据库迁移


你需要在数据库中创建运行所需的表。

.. code-block:: bash

python manage.py migrate defender

管理命令


cleanup_django_defender

如果你的网站流量很大,AccessAttempts 表会很快被填满。如果你不需要保留数据用于审计,有一个管理命令可以帮助你保持表整洁。

它会根据 DEFENDER_ACCESS_ATTEMPT_EXPIRATION 设置决定删除哪些记录。如果未指定,默认为 24 小时。

.. code-block:: bash

$ python manage.py cleanup_django_defender

你可以将其设置为每日或每周的 cron 任务,以控制表的大小。

.. code-block:: bash

每天凌晨 12:24 运行。

24 0 * * * /usr/bin/python manage.py cleanup_django_defender >> /var/log/django_defender_cleanup.log

长期目标

  • 支持可插拔的后端,使用户可以使用 Redis 以外的其他方案
  • 当用户账户被封锁时发送邮件通知
  • 添加白名单,用于永远不会被封锁的用户名和 IP(如管理员等)
  • 为 IP 地址添加永久黑名单
  • 扫描已知代理 IP,不封锁来自这些 IP 的请求(提高合法 IP 不被封锁的概率)
  • 添加管理命令,用于清理旧的(可配置的)登录尝试记录。

性能


defender 的目标是尽可能快,避免拖慢登录过程。为确保达到目标,我们需要一种测试应用的方法,以确认我们走在正确的轨道上。最好的方法是比较使用 defender、django-axes 和普通 Django 登录的耗时。

普通 Django 登录作为基准,预计是三种方法中最快的,因为没有额外的检查。

带 defender 的登录可能会比普通 Django 登录慢,但希望比 django-axes 登录快。目标是使常规登录与 defender 之间的差异尽可能小。

django-axes 的登录速度可能是三者中最慢的,因为它进行更多检查并执行大量数据库查询。

确定登录速度的最佳方法是对每种配置的应用进行负载测试,并比较每种类型的登录时间。

负载测试


为了确保覆盖所有不同类型的登录,在负载测试中我们需要不止一项测试。

#. 全部成功:仅进行成功登录的负载测试。

#. 混合:部分成功、部分失败:进行包含成功和失败登录的负载测试,观察失败对性能的影响。

#. 全部失败:全部失败登录的负载测试,比较性能差异。

我们需要一个示例应用来进行负载测试,唯一区别在于配置:加载 defender、axes,或两者都不加载。

我们可以使用托管的负载测试服务,或类似 jmeter 的工具。无论哪种方式,所有测试必须保持一致。如果使用 jmeter,应提供 jmeter 配置,以便其他人自行运行测试。

负载测试结果


我们将在此处发布结果。我们会解释每项测试,并展示结果及图表。

为什么不用 django-axes

django-axes 很优秀,但它将所有数据存储在数据库中,当数据量很大时会造成瓶颈。它会使认证请求延迟 200-300ms。这对某些站点可能不算什么,但对其他站点来说太长了。

该项目最初是 django-axes 的一个分支,尽可能多地使用其代码,同时移除不需要的部分,并加速查询以改进登录。

django-defender 的工作原理

#. 当有人尝试登录时,首先检查他们当前是否被封锁。检查他们使用的用户名以及 IP 地址。如果被封锁,转至第 5 步。如果未被封锁,转至第 2 步。

#. 未被封锁,因此检查登录是否有效。如果有效,转至第 6 步。如果无效,转至第 3 步。

#. 登录尝试无效。为此尝试将用户名和 IP 地址添加到缓存。如果这导致他们超出限制,将其添加到封锁列表,然后转至第 5 步。如果未超出限制,转至第 4 步。

#. 登录无效,但未超出限制。将用户发回登录页面,让他们重试。

#. 用户被封锁:将用户发至封锁页面,告知他们已被封锁,并给出预计解封时间。

#. 登录有效。重置所有失败登录尝试,并将用户转到目标页面。

缓存后端

Defender 使用缓存保存失败的尝试。

缓存键


计数器:

  • prefix:failed:ip:[ip] (计数, TTL)
  • prefix:failed:username:[username] (计数, TTL)

布尔值(如果存在则表示已封锁):

  • prefix:blocked:ip:[ip] (true, TTL)
  • prefix:blocked:username:[username] (true, TTL)

自定义 django-defender

有几个选项可以对 django-defender 进行自定义。这些应在你的 settings.py 文件中定义。

  • DEFENDER_LOGIN_FAILURE_LIMIT\ : 整数:在记录失败登录之前允许的登录尝试次数。 [默认值: 3\ ]

  • DEFENDER_LOGIN_FAILURE_LIMIT_USERNAME\ : 整数:在记录失败登录之前允许的用户名尝试次数。 [默认值: DEFENDER_LOGIN_FAILURE_LIMIT\ ]

  • DEFENDER_LOGIN_FAILURE_LIMIT_IP\ : 整数:在记录失败登录之前允许的 IP 尝试次数。 [默认值: DEFENDER_LOGIN_FAILURE_LIMIT\ ]

  • DEFENDER_BEHIND_REVERSE_PROXY\ : 布尔值:defender 是否位于反向代理后面? [默认值: False\ ]

  • DEFENDER_REVERSE_PROXY_HEADER\ : 字符串:包含你的反向代理 IP 地址的 HTTP 标头名称。 [默认值: HTTP_X_FORWARDED_FOR\ ]

  • DEFENDER_LOCK_OUT_BY_IP_AND_USERNAME\ : 布尔值:根据 IP 和用户名的组合锁定用户。这可以防止用户通过封锁 IP 地址来阻止来自同一 IP 的其他用户访问应用程序。 [默认值: False\ ]

  • DEFENDER_DISABLE_IP_LOCKOUT\ : 布尔值:如果为 True,则不会封锁用户 IP 地址,只会封锁用户名。 [默认值: False]

  • DEFENDER_DISABLE_USERNAME_LOCKOUT\ : 布尔值:如果为 True,则不会封锁用户名,只会封锁 IP 地址。 [默认值: False]

  • DEFENDER_COOLOFF_TIME\ : 整数:如果设置,定义一段时间不活动后,旧的失败登录尝试和用户名/IP 封锁将被遗忘。整数,解释为秒数。如果为 0,则失败登录尝试和用户名/IP 封锁均不会过期。 [默认值: 300\ ]

  • DEFENDER_ATTEMPT_COOLOFF_TIME\ : 整数:如果设置,覆盖由 DEFENDER_COOLOFF_TIME 设置的失败登录尝试遗忘时间。整数,解释为秒数。如果为 0,则失败登录尝试不会过期。 [默认值: DEFENDER_COOLOFF_TIME\ ]

  • DEFENDER_LOCKOUT_COOLOFF_TIME\ : 整数或列表:如果设置,覆盖由 DEFENDER_COOLOFF_TIME 设置的用户名/IP 封锁遗忘时间。整数,解释为秒数。列表中的整数,解释为秒数,索引表示在过去的 DEFENDER_ACCESS_ATTEMPT_EXPIRATION 小时内已发生的封锁次数(达到某个最大值之前)。如果设置为 0 或 [],则用户名/IP 封锁不会过期。 [默认值: DEFENDER_COOLOFF_TIME\ ]

  • DEFENDER_LOCKOUT_TEMPLATE\ : 字符串: [默认值: None\ ] 如果设置,指定在用户被封锁时渲染的模板。模板接收以下上下文变量:

    • cooloff_time_seconds\ : 冷却时间(秒)
    • cooloff_time_minutes\ : 冷却时间(分钟)
    • failure_limit\ : 封锁前的失败次数。
下载工具