我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Django怎么给表单添加honeypot验证

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Django怎么给表单添加honeypot验证

这篇文章给大家介绍使用Django怎么给表单添加honeypot验证,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Honeypot的工作原理

Honeypot又名蜜罐,其实本质上是种陷阱。我们在表单中故意通过CSS隐藏一些字段, 这些字段一般人是不可见的。然而机器人或程序会以为这些字段也是必需的字段(required), 所以会补全后提交表单,这就中了我们的陷阱。在视图中我们可以通过装饰器对用户提交的表单数据进行判断,来验证表单的合法性。比如honeypot字段本来应该为空的,现在居然有内容了,显然这是机器人或程序提交的数据,我们可以拒绝其请求。

Django中如何实现表单honeypot验证?

Django表单中添加honeypot,一共分两步:

编写模板标签(templatetags),在包含模板的表单中生成honeypot字段。

 编写装饰器(decorators.py), 对POST请求发送来的表单数据进行验证。

由于honeypot的功能所有app都可以用到,我们创建了一个叫common的app。整个项目的目录结构如下所示。只有标蓝色的4个文件,是与honeypot相关的。

使用Django怎么给表单添加honeypot验证

编写模板标签

我们在common目录下新建templatetags目录(包含一个空的__init__.py),然后在新建common_tags_filters.py, 添加如下代码。

from django import templatefrom django.conf import settingsfrom django.template.defaultfilters import stringfilterregister = template.Library()# used to render honeypot field@register.inclusion_tag('common/snippets/honeypot_field.html')def render_honeypot_field(field_name=None):    """        Renders honeypot field named field_name (defaults to HONEYPOT_FIELD_NAME).    """    if not field_name:        field_name = getattr(settings, 'HONEYPOT_FIELD_NAME', 'name1')    value = getattr(settings, 'HONEYPOT_VALUE', '')    if callable(value):        value = value()    return {'fieldname': field_name, 'value': value}

我们现在来看下上面这段代码如何工作的。我们创建了一个名为render_honeypot_field的模板标签,用于在模板中生成honeypot字段。honeypot字段名是settings.py里HONEYPOT_FIELD_NAME,如果没有此项设置,默认值为name1。honeypot字段的默认值是HONEYPOT_VALUE, 如果没有此项设置,默认值为空字符串''。然后这个函数将fieldname和value传递给如下模板片段。

# common/snippets/honeypot_field.html

<div class="form-control" >        <label><input type="text" name="{{ fieldname }}" value="{{ value }}" />    </label></div>

在Django模板的表单中生成honeypot字段只需按如下操作:

{% load common_tags_filters %}{% load static %}<form method="post" action="">     {% csrf_token %}    {% render_honeypot_field %}    {% form.as_p %}</form>

编写装饰器

在common文件下新建decorators.py, 添加如下代码。我们编写了check_honeypot和honeypot_exempt两个装饰器,前者给需要对honeypot字段进行验证的视图函数使用,后者给不需要对honeypot字段进行验证的视图函数使用。

#common/decorators.py

from functools import wrapsfrom django.conf import settingsfrom django.http import HttpResponseBadRequest, HttpResponseForbidden, HttpResponseRedirectfrom django.template.loader import render_to_stringfrom django.contrib.auth.decorators import user_passes_testdef honeypot_equals(val):    """        Default verifier used if HONEYPOT_VERIFIER is not specified.        Ensures val == HONEYPOT_VALUE or HONEYPOT_VALUE() if it's a callable.    """    expected = getattr(settings, 'HONEYPOT_VALUE', '')    if callable(expected):        expected = expected()    return val == expecteddef verify_honeypot_value(request, field_name):    """        Verify that request.POST[field_name] is a valid honeypot.        Ensures that the field exists and passes verification according to        HONEYPOT_VERIFIER.    """    verifier = getattr(settings, 'HONEYPOT_VERIFIER', honeypot_equals)    if request.method == 'POST':        field = field_name or settings.HONEYPOT_FIELD_NAME        if field not in request.POST or not verifier(request.POST[field]):            response = render_to_string('common/snippets/honeypot_error.html',                                    {'fieldname': field})            return HttpResponseBadRequest(response)def check_honeypot(func=None, field_name=None):    """        Check request.POST for valid honeypot field.        Takes an optional field_name that defaults to HONEYPOT_FIELD_NAME if        not specified.    """    # hack to reverse arguments if called with str param    if isinstance(func, str):        func, field_name = field_name, func    def wrapper(func):        @wraps(func)        def inner(request, *args, **kwargs):            response = verify_honeypot_value(request, field_name)            if response:                return response            else:                return func(request, *args, **kwargs)        return inner    if func is None:        def decorator(func):            return wrapper(func)        return decorator    return wrapper(func)def honeypot_exempt(func):    """        Mark view as exempt from honeypot validation    """    # borrowing liberally from django's csrf_exempt    @wraps(func)    def wrapper(*args, **kwargs):        return func(*args, **kwargs)    wrapper.honeypot_exempt = True    return wrapper

上面代码最重要的就是verify_honeypot_value函数了。如果用户通过POST方式提交的表单里没有honeypot字段或该字段的值不等于settings.py中的默认值,则验证失败并返回如下错误:

# common/snippets/honeypot_error.html

<!DOCTYPE html><html lang="en">    <body>    <h2>400 Bad POST Request</h2>    <p>We have detected a suspicious request. Your request is aborted.</p>    </body></html>

定义好装饰器后,我们对需要处理POST表单的视图函数加上@check_honeypot就行了,是不是很简单?

from common.decorators import check_honeypot@check_honeypotdef signup(request):    if request.method == "POST":        form = SignUpForm(request.POST)        if form.is_valid():            user = form.save()            login(request, user)            return HttpResponseRedirect(reverse('users:profile'))    else:        form = SignUpForm()    return render(request, "users/signup.html", {"form": form, })

关于使用Django怎么给表单添加honeypot验证就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Django怎么给表单添加honeypot验证

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Django怎么给表单添加honeypot验证

这篇文章给大家介绍使用Django怎么给表单添加honeypot验证,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Honeypot的工作原理Honeypot又名蜜罐,其实本质上是种陷阱。我们在表单中故意通过CSS隐藏一
2023-06-14

django中只使用ModleForm的表单验证

这篇文章主要介绍了django中只使用ModleForm的表单验证的相关资料,需要的朋友可以参考下
2022-12-25

怎么给wordpress添加双因素身份验证

本篇内容介绍了“怎么给wordpress添加双因素身份验证”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  不管你是使用 WordPress
2023-06-25

jQuery表单验证插件怎么使用

要使用jQuery表单验证插件,你需要按照以下步骤进行操作:1. 引入jQuery库和jQuery表单验证插件的源文件。在HTML文件的标签中添加以下代码:html请注意,path/to/jquery-validation-plugin.j
2023-10-18

Vue Validator表单验证插件怎么使用

这篇“Vue Validator表单验证插件怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue Validator
2023-07-04

Swift怎么给应用添加3D Touch菜单

要给Swift应用添加3D Touch菜单,可以按照以下步骤进行操作:在你的应用的 Info.plist 文件中添加一个新的键值对,键为 "UIApplicationShortcutItems",值是一个数组。UIApplicationSh
2023-10-22

怎么使用vue实现表单验证功能

这篇文章主要讲解了“怎么使用vue实现表单验证功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用vue实现表单验证功能”吧!具体代码如下:
2023-07-04

使用css怎么实现一个表单验证功能

这期内容当中小编将会给大家带来有关使用css怎么实现一个表单验证功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设计
2023-06-08

django怎么使用ajax提交表单

在Django中使用Ajax提交表单,你需要进行以下步骤:1. 在你的HTML文件中,使用JavaScript编写一个函数来处理表单的提交事件。在该函数中,使用`$.ajax()`方法发送异步请求。```javascriptfunction
2023-09-26

使用shell脚本怎么给mysql添加索引

本篇文章为大家展示了使用shell脚本怎么给mysql添加索引,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。用shell脚本来给mysql加索引#! /bin/bashtb_base=tb_stud
2023-06-09

怎么使用PHP正则对表单数据进行验证

这篇文章主要介绍了怎么使用PHP正则对表单数据进行验证,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如何使用PHP正则对表单数据进行验证?首先,我们先布局我们的HTML的表单
2023-06-15

使用Java怎么给PPT添加动画效果

使用Java怎么给PPT添加动画效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java程序代码1. 添加预设动画效果a. 新建PPT文档,添加形状,设置动画效果impo
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录