為了防止機器人頻繁登錄網站或者破壞分子惡意登錄,很多用戶登錄和注冊系統都提供了圖形驗證碼功能。
驗證碼(CAPTCHA)是一種區分用戶是計算機還是人的公共全自動程序。
可以防止惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試。
圖形驗證碼的歷史比較悠久,到現在已經有點英雄末路的味道了。因為機器學習、圖像識別的存在,機器人已經可以比較正確的識別圖像內的字符了。
但不管怎么說,作為一種防御手段,至少還是可以抵擋一些低級入門的攻擊手段,抬高了攻擊者的門檻。
在Django中實現圖片驗證碼功能非常簡單,有現成的第三方庫可以使用。這個庫叫做django-simple-captcha
。
一、安裝captcha
在Pycharm的terminal中,首先進入mysite_env虛擬環境,然后安裝第三方庫:
pip install django-simple-captcha
Django自動幫我們安裝了相關的依賴庫six
、olefile
和Pillow
,其中的Pillow是大名鼎鼎的繪圖模塊。
二、注冊captcha
在settings中,將‘captcha’注冊到app列表里:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'login', 'captcha', ]
captcha需要在數據庫中建立自己的數據表,所以需要執行migrate命令生成數據表:
python manage.py migrate
三、添加url路由
在根目錄下的urls.py文件中增加captcha對應的網址:
from django.conf.urls import url from django.conf.urls import include from django.contrib import admin from login import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^login/', views.login), url(r'^register/', views.register), url(r'^logout/', views.logout), url(r'^captcha', include('captcha.urls')) ]
由於使用了二級路由機制,需要在頂部from django.conf.urls import include
四、修改forms.py
如果上面都OK了,就可以直接在我們的forms.py文件中添加CaptchaField了。
from django import forms from captcha.fields import CaptchaField class UserForm(forms.Form): username = forms.CharField(label="用戶名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'})) password = forms.CharField(label="密碼", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'})) captcha = CaptchaField(label='驗證碼')
注意需要提前導入from captcha.fields import CaptchaField
,然后就像寫普通的form字段一樣添加一個captcha字段就可以了!
五、修改login.html
由於我們前面是手動生成的form表單,所以還要修改一下,添加captcha的相關內容,如下所示:
{% extends 'login/../base.html' %} {% load staticfiles %} {% block title %}登錄{% endblock %} {% block css %}<link href="{% static 'css/login.css' %}" rel="stylesheet"/>{% endblock %} {% block content %} <div class="container"> <div class="col-md-4 col-md-offset-4"> <form class='form-login' action="/login/" method="post"> {% if message %} <div class="alert alert-warning">{{ message }}</div> {% endif %} {% csrf_token %} <h2 class="text-center">歡迎登錄</h2> <div class="form-group"> {{ login_form.username.label_tag }} {{ login_form.username}} </div> <div class="form-group"> {{ login_form.password.label_tag }} {{ login_form.password }} </div> <div class="form-group"> {{ login_form.captcha.errors }} {{ login_form.captcha.label_tag }} {{ login_form.captcha }} </div> <button type="reset" class="btn btn-default pull-left">重置</button> <button type="submit" class="btn btn-primary pull-right">提交</button> </form> </div> </div> <!-- /container --> {% endblock %}
這里額外增加了一條{{ login_form.captcha.errors }}
用於明確指示用戶,你的驗證碼不正確。
六、查看效果
重啟服務器,進入登錄頁面,嘗試用用戶名錯誤、密碼不對、驗證碼不對、全對的不同情況,看看我們新增的四位驗證碼的效果如何。
就是這么簡單!
我們加入了一個防止機器人或者惡意登錄的圖形驗證碼功能,雖然界面難看了點,但底子是好的,你可以根據需要進行美化。
其中驗證圖形碼是否正確的工作都是在后台自動完成的,只需要使用is_valid()
這個forms內置的驗證方法就一起進行了,完全不需要在視圖函數中添加任何的驗證代碼,非常方便快捷!
關於captcha的功能,當然絕不僅限於此,你可以設置六位、八位驗證碼,可以對圖形噪點的生成模式進行定制,這些就留待你自己學習和研究了。