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

  介绍

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

蜜罐的工作原理

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

Django中如何实现表单蜜罐验证?

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

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

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

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

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

编写模板标签

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

得到django  import 模板   得到django.conf  import 设置   得到django.template.defaultfilters  import  stringfilter         时间=register  template.Library ()         #,used 用render  honeypot 字段   @register.inclusion_tag(& # 39;常见/片段/honeypot_field.html& # 39;)   def  render_honeypot_field (field_name=None):   ,,,,,,   ,,,,,,,Renders  honeypot  field  named  field_name  (defaults 用HONEYPOT_FIELD_NAME)。   ,,,,,,   ,,,if  not  field_name:   ,,,,,,,field_name =, getattr(设置,,& # 39;HONEYPOT_FIELD_NAME& # 39;,, & # 39; name1& # 39;)   ,,,value =, getattr(设置,,& # 39;HONEYPOT_VALUE& # 39;,, & # 39; & # 39;)   ,,,if 可调用的(值):   ,,,,,,,value =,值()   ,,,return  {& # 39; fieldname # 39;:, field_name,, & # 39;价值# 39;:,价值}

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

#常见//honeypot_field片段。html

& lt; div 类=癴orm-control",在   ,,,,,,,& lt; label> & lt; input 类型=皌ext", name=皗{, fieldname }}“, value=https://www.yisu.com/zixun/" {{value}} "/>   标签   

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

{%, load  common_tags_filters  %}   {%,load  static  %}      & lt; form 方法=皃ost", action=啊氨?   ,,,,{%,csrf_token  %}   ,,,{%,render_honeypot_field  %}   ,,,{%,form.as_p  %}   & lt;/form>

编写装饰器

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

#常见/修饰符。py

得到functools  import 包装   得到django.conf  import 设置   得到django.http  import  HttpResponseBadRequest, HttpResponseForbidden, HttpResponseRedirect   得到django.template.loader  import  render_to_string   得到django.contrib.auth.decorators  import  user_passes_test         def  honeypot_equals (val):   ,,,,,,   ,,,,,,,Default  verifier  used  if  HONEYPOT_VERIFIER  is  not 指定。   ,,,,,,,Ensures  val ==, HONEYPOT_VALUE 或是HONEYPOT_VALUE (), if 这# 39;s  a 可调用的。   ,,,,,,   ,,,expected =, getattr(设置,,& # 39;HONEYPOT_VALUE& # 39;,, & # 39; & # 39;)   ,,,if 可调用(预计):   ,,,,,,,expected =,预期()   ,,,return  val ==,预期         def  verify_honeypot_value(请求,,field_name):   ,,,,,,   ,,,,,,,Verify  that  request.POST [field_name], is  a  valid 蜜罐。   ,,,,,,,Ensures  that 从而field  exists 以及passes  verification  according    ,,,,,,HONEYPOT_VERIFIER。   ,,,,,,   ,,,verifier =, getattr(设置,,& # 39;HONEYPOT_VERIFIER& # 39;,, honeypot_equals)   ,,,if  request.method ==, & # 39;文章# 39;:   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

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