Skip to main content

Django honeypot field utilities

Project description

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

Django application that provides utilities for preventing automated form spam.

Provides template tags, view decorators, and middleware to add and verify honeypot fields to forms.

Written by James Turk with contributions by Flavio Curella and Daniel Greenfeld.

Source: https://github.com/jamesturk/django-honeypot/

Requirements

  • python >= 3.8

  • django >= 3.2

Usage

settings.py

Be sure to add honeypot to INSTALLED_APPS in settings.py.

You will almost always need to define HONEYPOT_FIELD_NAME which is the name to use for the honeypot field. Some sophisticated bots will attempt to avoid fields named honeypot, so it may be wise to name the field something slightly more realistic such as “phonenumber” or “body2”.

HONEYPOT_VALUE is an option that you can specify to populate the honeypot field, by default the honeypot field will be empty and any text entered into it will result in a failed POST. HONEYPOT_VALUE can be a string or a callable that takes no arguments.

HONEYPOT_VERIFIER is an advanced option that you can specify to validate the honeypot. The default verifier ensures that the contents of the honeypot field matches HONEYPOT_VALUE. Using a combination of a callable for HONEYPOT_VALUE and HONEYPOT_VERIFIER it is possible to implement a more advanced technique such as using timestamps.

HONEYPOT_RESPONDER can be used to replace the default response in case of an invalid honeypot.

Adding honeypot fields to specific forms and views

It is possible to add honeypot fields to specific forms and ensure that specific views check for a valid honeypotin request.POST. This can be accomplished by using the render_honeypot_field template tag:

At the top of a template file include the line:

{% load honeypot %}

And then within any form including the tag:

{% render_honeypot_field "field_name" %}

will render a honeypot field named “field_name” that is hidden by default. The name of the honeypot field will default to HONEYPOT_FIELD_NAME if one is not provided.

To ensure that the honeypot field is both present and correct you will need to use check_honeypot decorator from honeypot.decorators:

from honeypot.decorators import check_honeypot

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

@check_honeypot
def other_post_view(request):
    ...

This decorator will ensure that a field exists in request.POST that is named ‘field_name’. @check_honeypot without arguments will use the default HONEYPOT_FIELD_NAME.

Adding honeypot fields to class-based-views

The same as above for Adding honeypot fields to specific forms and views but add the decorator to the post method making use of django’s method_decorator.

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

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

Adding honeypot fields site-wide

Sometimes it is desirable to add honeypots to all forms site-wide. This is particularly useful when dealing with apps that render their own forms. For this purpose three middlewares are provided, similar in functionality to django’s own CSRF middleware.

All of these middleware live in honeypot.middleware.

HoneypotResponseMiddleware analyzes the output of all responses and rewrites any forms that use method="POST" to contain a honeypot field, just as if they had started with {% render_honeypot_field %}. Borrowing heavily from django.contrib.csrf.middleware.CsrfResponseMiddleware this middleware only rewrites responses with Content-Type text/html or application/xhtml+xml.

HoneypotViewMiddleware ensures that for all incoming POST requests to views request.POST contains a valid honeypot field as defined by the HONEYPOT_FIELD_NAME, HONEYPOT_VALUE, and HONEYPOT_VERIFIER settings. The result is the same as if every view in your project were decorated with @check_honeypot.

HoneypotMiddleware is a combined middleware that applies both HoneypotResponseMiddleware and HoneypotViewMiddleware, this is the easiest way to get honeypot fields site-wide and can be used in many if not most cases. The middleware needs to be listed after CommonMiddleware because the middleware changes the response. If you list it before CommonMiddleware then the Content-Length header won’t reflect the changes.

Customizing honeypot display

There are two templates used by django-honeypot that can be used to control various aspects of how the honeypot functionality is presented to the user.

honeypot/honeypot_field.html is used to render the honeypot field. It is given two context variables fieldname and value, corresponding to HONEYPOT_FIELD_NAME and HONEYPOT_VALUE or any overrides in effect (such as a custom field name passed to the template tag).

honeypot/honeypot_error.html is the error page rendered when a bad request is intercepted. It is given the context variable fieldname representing the name of the honeypot field.

To completely change the error page or what happens when a bad request is intercepted set HONEYPOT_RESPONDER to a function accepting request and context kwargs and returning a 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')

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_honeypot-1.2.1.tar.gz (10.2 kB view details)

Uploaded Source

Built Distribution

django_honeypot-1.2.1-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file django_honeypot-1.2.1.tar.gz.

File metadata

  • Download URL: django_honeypot-1.2.1.tar.gz
  • Upload date:
  • Size: 10.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.3 Linux/6.8.0-39-generic

File hashes

Hashes for django_honeypot-1.2.1.tar.gz
Algorithm Hash digest
SHA256 ab5c2aad214d86def2f00f6a79aa14f171db7301ac8712f20dc21a83dd5d6413
MD5 5fbc9bd5ece7f217754cd931c5acdaaa
BLAKE2b-256 e28f0bcf3f10ec08720086ab625dddfa061f8534cf06b16eb7567b0cc9242f4f

See more details on using hashes here.

File details

Details for the file django_honeypot-1.2.1-py3-none-any.whl.

File metadata

  • Download URL: django_honeypot-1.2.1-py3-none-any.whl
  • Upload date:
  • Size: 10.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.3 Linux/6.8.0-39-generic

File hashes

Hashes for django_honeypot-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fdabe4ded66b6db25d04af2446de3bf7cb047cb5db097a864c8c97b081ef736f
MD5 5cca0df82717506fc3d70f8f1cef09ba
BLAKE2b-256 0cc96372492315f3c219c81fb711769bc9522a9bbe90d96eed3114270eec6635

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page