跳转到主要内容

Django honey pot字段工具

项目描述

https://github.com/jamesturk/django-honeypot/actions/workflows/test.yml/badge.svg https://img.shields.io/pypi/v/django-honeypot.svg

Django应用程序,提供用于防止自动表单垃圾邮件的工具。

提供模板标签、视图装饰器和中间件,用于向表单添加和验证蜜罐字段。

由James Turk编写,并由Flavio Curella和Daniel Greenfeld贡献。

来源: https://github.com/jamesturk/django-honeypot/

要求

  • python >= 3.8

  • django >= 3.2

用法

settings.py

确保在settings.py中将honeypot添加到INSTALLED_APPS中。

您几乎总是需要定义HONEYPOT_FIELD_NAME,即用于蜜罐字段的名称。一些复杂的机器人会尝试避免名为 honeypot 的字段,因此将字段命名为更现实的名称(如“phonenumber”或“body2”)可能更明智。

HONEYPOT_VALUE是一个选项,您可以使用它来填充蜜罐字段。默认情况下,蜜罐字段将为空,任何输入到其中的文本都将导致POST失败。HONEYPOT_VALUE可以是一个字符串或一个不带参数的可调用对象。

HONEYPOT_VERIFIER 是一个高级选项,您可以通过它来验证蜜罐。默认验证器确保蜜罐字段的内 容与 HONEYPOT_VALUE 匹配。通过结合 HONEYPOT_VALUEHONEYPOT_VERIFIER 的可调用功能,可以实现更高级的技术,例如使用时间戳。

HONEYPOT_RESPONDER 可以用于在蜜罐无效时替换默认的响应。

将蜜罐字段添加到特定表单和视图中

您可以将蜜罐字段添加到特定表单中,并确保特定视图检查 request.POST 中的有效蜜罐。这可以通过使用 render_honeypot_field 模板标签来完成。

在模板文件顶部包含以下行:

{% load honeypot %}

然后在任何表单中包含以下标签:

{% render_honeypot_field "field_name" %}

将渲染一个默认隐藏的蜜罐字段“field_name”。如果未提供,蜜罐字段的名称将默认为 HONEYPOT_FIELD_NAME

为了确保蜜罐字段既存在又正确,您需要使用来自 honeypot.decoratorscheck_honeypot 装饰器。

from honeypot.decorators import check_honeypot

@check_honeypot(field_name='hp_field_name')
def post_comment(request):
    ...

@check_honeypot
def other_post_view(request):
    ...

该装饰器将确保在 request.POST 中存在一个名为“field_name”的字段。@check_honeypot 无参数时将使用默认的 HONEYPOT_FIELD_NAME

将蜜罐字段添加到基于类的视图中

将蜜罐字段添加到特定表单和视图 相同,但将装饰器添加到 post 方法中,使用 django 的 method_decorator

from django.utils.decorators import method_decorator
from honeypot.decorators import check_honeypot

@method_decorator(check_honeypot, name='post')
class MyView(FormView):
    ...

在全局范围内添加蜜罐字段

有时您可能希望将蜜罐添加到网站上的所有表单中。这对于处理渲染自己的表单的应用程序尤其有用。为此,提供了三个中间件,其功能类似于 django 自身的 CSRF 中间件。

所有这些中间件都位于 honeypot.middleware 中。

HoneypotResponseMiddleware 分析所有响应的输出,并将使用 method="POST" 的任何表单重写为包含蜜罐字段,就像它们以 {% render_honeypot_field %} 开始一样。从 django.contrib.csrf.middleware.CsrfResponseMiddleware 中大量借鉴,此中间件仅重写具有内容类型 text/html 或 application/xhtml+xml 的响应。

HoneypotViewMiddleware 确保对于所有传入的 POST 请求到视图,request.POST 包含一个有效的蜜罐字段,该字段由 HONEYPOT_FIELD_NAMEHONEYPOT_VALUEHONEYPOT_VERIFIER 设置定义。结果是,如果每个视图都使用 @check_honeypot 装饰器,效果相同。

HoneypotMiddleware 是一个结合中间件,它应用了 HoneypotResponseMiddlewareHoneypotViewMiddleware,这是在全局范围内获取蜜罐字段的简单方法,可以在许多(如果不是大多数)情况下使用。由于中间件更改了响应,因此需要在中 CommonMiddleware 后列出。如果将其列在 CommonMiddleware 之前,则 Content-Length 标头将不会反映更改。

自定义蜜罐显示

django-honeypot 使用两个模板来控制如何将蜜罐功能呈现给用户的各种方面。

honeypot/honeypot_field.html 用于渲染蜜罐字段。它提供了两个上下文变量 fieldnamevalue,分别对应于 HONEYPOT_FIELD_NAMEHONEYPOT_VALUE 或任何有效的覆盖(例如传递给模板标记的自定义字段名)。

honeypot/honeypot_error.html 是在拦截到恶意请求时渲染的错误页面。它提供了一个表示蜜罐字段名称的上下文变量 fieldname

要完全更改错误页面或在拦截到恶意请求时发生的操作,请将 HONEYPOT_RESPONDER 设置为接受 requestcontext 关键字参数并返回 HttpResponse 的函数。

# mypackage.py
from honeypot.decorators import honeypot_error

def custom_honeypot_error(request, context):
    # custom responder logging the event
    log.warning("gotcha!")
    # call built-in responder to send default HttpResponseBadRequest
    return honeypot_error(request, context)
    # or ...
    # raise Http404
# settings.py
from django.utils.module_loading import import_string

HONEYPOT_RESPONDER = import_string('mypackage.custom_honeypot_error')

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面