亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Django給表單添加honeypot驗(yàn)證增加安全性

Django給表單添加honeypot驗(yàn)證增加安全性

熱門標(biāo)簽:幫人做地圖標(biāo)注收費(fèi)算詐騙嗎 溫州旅游地圖標(biāo)注 遼寧400電話辦理多少錢 荊州云電銷機(jī)器人供應(yīng)商 江蘇房產(chǎn)電銷機(jī)器人廠家 蘇州電銷機(jī)器人十大排行榜 電信營業(yè)廳400電話申請 悟空智電銷機(jī)器人6 外呼不封號系統(tǒng)

如果你的網(wǎng)站中允許匿名用戶通過POST方式提交表單, 比如用戶注冊表, 評論表或者留下用戶聯(lián)系方式的表單,你一定要防止機(jī)器人或爬蟲程序惡意提交大量的垃圾數(shù)據(jù)到你的數(shù)據(jù)庫中。這種情況不是可能會發(fā)生,而是一定會發(fā)生。一種解決這種問題的方式就是在表單中加入人機(jī)交互驗(yàn)證碼(CAPTCHA), 另一種方式就是在表單中加入honeypot隱藏字段,然后在視圖中對隱藏字段的值進(jìn)行驗(yàn)證。兩種驗(yàn)證方式的目的都是一樣,防止機(jī)器人或程序通過偽裝成人來提交數(shù)據(jù)。今天我們就來詳細(xì)介紹下如何在表單中添加honeypot增加安全性。

Honeypot的工作原理

Honeypot又名蜜罐,其實(shí)本質(zhì)上是種陷阱。我們在表單中故意通過CSS隱藏一些字段, 這些字段一般人是不可見的。然而機(jī)器人或程序會以為這些字段也是必需的字段(required), 所以會補(bǔ)全后提交表單,這就中了我們的陷阱。在視圖中我們可以通過裝飾器對用戶提交的表單數(shù)據(jù)進(jìn)行判斷,來驗(yàn)證表單的合法性。比如honeypot字段本來應(yīng)該為空的,現(xiàn)在居然有內(nèi)容了,顯然這是機(jī)器人或程序提交的數(shù)據(jù),我們可以拒絕其請求。

Django中如何實(shí)現(xiàn)表單honeypot驗(yàn)證?

Django表單中添加honeypot,一共分兩步:

1. 編寫模板標(biāo)簽(templatetags),在包含模板的表單中生成honeypot字段。

2. 編寫裝飾器(decorators.py), 對POST請求發(fā)送來的表單數(shù)據(jù)進(jìn)行驗(yàn)證。

由于honeypot的功能所有app都可以用到,我們創(chuàng)建了一個叫common的app。整個項(xiàng)目的目錄結(jié)構(gòu)如下所示。只有標(biāo)藍(lán)色的4個文件,是與honeypot相關(guān)的。

編寫模板標(biāo)簽

我們在common目錄下新建templatetags目錄(包含一個空的__init__.py),然后在新建common_tags_filters.py, 添加如下代碼。

from django import template
from django.conf import settings
from django.template.defaultfilters import stringfilter


register = 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}

我們現(xiàn)在來看下上面這段代碼如何工作的。我們創(chuàng)建了一個名為render_honeypot_field的模板標(biāo)簽,用于在模板中生成honeypot字段。honeypot字段名是settings.py里HONEYPOT_FIELD_NAME,如果沒有此項(xiàng)設(shè)置,默認(rèn)值為name1。honeypot字段的默認(rèn)值是HONEYPOT_VALUE, 如果沒有此項(xiàng)設(shè)置,默認(rèn)值為空字符串''。然后這個函數(shù)將fieldname和value傳遞給如下模板片段。

# common/snippets/honeypot_field.html

div class="form-control" style="display: none;">
        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字段進(jìn)行驗(yàn)證的視圖函數(shù)使用,后者給不需要對honeypot字段進(jìn)行驗(yàn)證的視圖函數(shù)使用。

#common/decorators.py

from functools import wraps
from django.conf import settings
from django.http import HttpResponseBadRequest, HttpResponseForbidden, HttpResponseRedirect
from django.template.loader import render_to_string
from django.contrib.auth.decorators import user_passes_test


def 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 == expected


def 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函數(shù)了。如果用戶通過POST方式提交的表單里沒有honeypot字段或該字段的值不等于settings.py中的默認(rèn)值,則驗(yàn)證失敗并返回如下錯誤:

# common/snippets/honeypot_error.html

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

定義好裝飾器后,我們對需要處理POST表單的視圖函數(shù)加上@check_honeypot就行了,是不是很簡單?

from common.decorators import check_honeypot


@check_honeypot
def 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, })

參考

本文核心代碼參考了James Sturk的Django-honeypot項(xiàng)目。原項(xiàng)目地址如下所示:

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

以上就是Django給表單添加honeypot驗(yàn)證增加安全性的詳細(xì)內(nèi)容,更多關(guān)于Django 添加honeypot驗(yàn)證的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Django表單外鍵選項(xiàng)初始化的問題及解決方法
  • django表單中的按鈕獲取數(shù)據(jù)的實(shí)例分析
  • Django def clean()函數(shù)對表單中的數(shù)據(jù)進(jìn)行驗(yàn)證操作
  • Django 構(gòu)建模板form表單的兩種方法
  • Django form表單與請求的生命周期步驟詳解
  • Django model.py表單設(shè)置默認(rèn)值允許為空的操作
  • Django表單提交后實(shí)現(xiàn)獲取相同name的不同value值
  • Django框架獲取form表單數(shù)據(jù)方式總結(jié)
  • django之從html頁面表單獲取輸入的數(shù)據(jù)實(shí)例
  • 解決django中form表單設(shè)置action后無法回到原頁面的問題
  • django-xadmin根據(jù)當(dāng)前登錄用戶動態(tài)設(shè)置表單字段默認(rèn)值方式

標(biāo)簽:三沙 黃山 臺灣 宿遷 景德鎮(zhèn) 濟(jì)南 喀什 欽州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Django給表單添加honeypot驗(yàn)證增加安全性》,本文關(guān)鍵詞  Django,給,表單,添加,honeypot,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Django給表單添加honeypot驗(yàn)證增加安全性》相關(guān)的同類信息!
  • 本頁收集關(guān)于Django給表單添加honeypot驗(yàn)證增加安全性的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产一级强片在线观看| 黄色免费网站在线| 国产精品自拍一区| 999精品在线| 欧美激情一区二区三区视频 | 日韩女人做爰大片| 国产不卡高清在线观看视频| 成人a大片在线观看| 九九干| 亚洲wwwwww| 精品视频在线观看一区二区三区| 亚洲女初尝黑人巨高清在线观看| 九九精品久久| 四虎影视久久久| 精品国产三级a| 麻豆网站在线看| 中文字幕一区二区三区精彩视频| 久久99中文字幕| 超级乱淫黄漫画免费| 欧美18性精品| 亚洲www美色| 国产一区二区精品| 国产麻豆精品免费视频| 精品久久久久久中文字幕2017| 久草免费在线观看| 国产网站免费在线观看| 日韩专区在线播放| 成人免费观看的视频黄页| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 青草国产在线| 午夜激情视频在线播放| 久久精品店| 99热精品在线| 精品国产一区二区三区久| 国产精品自拍亚洲| 国产国语在线播放视频| 午夜欧美成人久久久久久| 久草免费资源| 国产一区精品| 日本伦理片网站| 九九免费高清在线观看视频| 可以免费看毛片的网站| 精品国产三级a| 日韩男人天堂| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产成人精品一区二区视频| 国产视频一区二区三区四区| 午夜在线影院| 黄视频网站免费看| 亚洲爆爽| 国产一区免费观看| 成人影院一区二区三区| 国产91丝袜高跟系列| 99久久精品国产片| 午夜欧美成人久久久久久| 精品国产一区二区三区久| 国产伦久视频免费观看视频| 人人干人人草| 亚欧成人毛片一区二区三区四区| 黄视频网站在线观看| 日本免费乱人伦在线观看 | 黄视频网站在线看| 九九久久99| 日韩字幕在线| 99色视频在线观看| 黄视频网站在线看| 一级片免费在线观看视频| 精品国产三级a| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 青青青草影院| 国产a免费观看| 人人干人人草| 免费一级生活片| 可以免费看污视频的网站| 精品毛片视频| 人人干人人插| 99久久精品费精品国产一区二区| 欧美激情一区二区三区视频| 在线观看导航| 精品国产一区二区三区久久久蜜臀| 日韩在线观看网站| 人人干人人草| 日韩欧美一二三区| 日韩欧美一二三区| 97视频免费在线观看| 亚洲精品影院| 欧美爱色| 精品久久久久久中文字幕一区| 国产高清在线精品一区二区| 91麻豆tv| 精品视频免费看| 亚洲 国产精品 日韩| 黄色短视屏| 四虎影视库国产精品一区| 国产国语对白一级毛片| 久久国产影院| 国产网站麻豆精品视频| 国产高清视频免费观看| 成人免费网站久久久| 九九精品在线播放| 九九九在线视频| 日韩字幕在线| 国产精品免费久久| 国产精品自拍一区| 国产91精品系列在线观看| 日韩欧美一二三区| 美国一区二区三区| 国产亚洲免费观看| 成人免费一级毛片在线播放视频| 精品视频在线观看一区二区| 国产a网| 亚洲精品影院一区二区| 午夜在线观看视频免费 成人| 欧美另类videosbestsex| 日本特黄特色aa大片免费| 你懂的日韩| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产麻豆精品hdvideoss| 欧美激情在线精品video| 日韩欧美一及在线播放| 欧美激情一区二区三区视频高清| 可以在线看黄的网站| 韩国毛片| 日本特黄特黄aaaaa大片| 九九九国产| 日本免费看视频| 精品国产香蕉在线播出| 午夜久久网| 天天色成人网| 精品视频在线观看视频免费视频| 九九干| 国产一区二区精品久| 九九国产| 亚洲天堂一区二区三区四区| 久久久成人网| 免费国产在线观看不卡| 亚洲女初尝黑人巨高清在线观看| 国产综合91天堂亚洲国产| a级毛片免费观看网站| 欧美另类videosbestsex| 国产精品1024永久免费视频| 黄色短视屏| 精品视频一区二区三区免费| 国产伦精品一区三区视频| 久久99青青久久99久久| 美女免费精品高清毛片在线视| 午夜激情视频在线播放| 麻豆网站在线看| 麻豆系列国产剧在线观看| 一a一级片| 久久国产精品自由自在| 午夜在线影院| 精品国产一区二区三区久| 91麻豆精品国产高清在线| 日韩中文字幕在线亚洲一区| 成人a大片高清在线观看| 精品美女| 亚洲不卡一区二区三区在线| 国产亚洲精品成人a在线| 成人高清视频免费观看| 国产伦理精品| 国产不卡在线观看| 国产美女在线一区二区三区| 韩国毛片| 成人免费网站久久久| 天天做人人爱夜夜爽2020| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 午夜在线影院| 日韩免费在线观看视频| 久久国产精品只做精品| 久久精品欧美一区二区| 欧美国产日韩精品| 欧美a级片免费看| 国产精品自拍在线观看| 青青久久精品| 可以在线看黄的网站| 亚洲女人国产香蕉久久精品 | 国产综合91天堂亚洲国产| 美国一区二区三区| 日本在线不卡视频| 青草国产在线观看| 国产91精品系列在线观看| 国产精品1024永久免费视频 | 沈樵在线观看福利| 99久久网站| 精品久久久久久中文字幕一区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品在线视频播放| 九九精品久久| 一级女性全黄久久生活片| 国产伦精品一区三区视频| 九九精品在线播放| 一级片片| 日韩一级精品视频在线观看| 精品视频一区二区三区免费| 国产激情视频在线观看| 亚洲第一页乱| 亚洲不卡一区二区三区在线| 青青久久精品| 亚洲wwwwww|