赞
踩
Django项目要上线运行,加一些安全措施。比如其一:验证码
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写。
原想着有些难度的,实际操作起来很简单,就简单的几步操作:
- pip install django-simple-captcha -i https://pypi.tuna.tsinghua.edu.cn/simple
-
-
- # 用下面这个直接安装没成功,提示版本不匹配 不知道为啥
- pip install django-simple-captcha
- # settings.py
- INSTALLED_APPS = [
- ...
- 'captcha',
- ]
- from django.urls import path, include
-
- urlpatterns = [
- ...
- path('captcha/',include('captcha.urls')), # 验证码
- ]
- # 同步captcha数据表
- python manage.py migrate
-
- # 生成表 captcha_captchastore
- >>>
- Applying captcha.0001_initial... OK
- Applying captcha.0002_alter_captchastore_id... OK
- # 插曲
- # 因为报错 django.db.utils.OperationalError: (1050, "Table 'yunbo_category' already exists")
- # 又重温了一下的命令
- python manage.py migrate myapp --fak # 忽略
- python manage.py migrate --fake yunbo
- <div class="form-group">
- {{ login_form.captcha.errors }}
- {{ login_form.captcha.label_tag }}
- {{ login_form.captcha }}
- </div>
- # 官方语句
- from django import forms
- from captcha.fields import CaptchaField
-
- class CaptchaTestForm(forms.Form):
- myfield = AnyOtherField()
- captcha = CaptchaField()
-
-
- # 实际我加的语句
- from captcha.fields import CaptchaField
- captcha = CaptchaField(
- label='验证码',
- required=True,
- error_messages={
- 'invalid': '验证码错误', # 报错改到view的登录函数了,这里本语句已无效
- }
- )
- # 官方语句
- if form.is_valid(): # 如果form有效
- human = True # 是真人操作,不是机器
但是,我的form验证 已经有这个语句,就不用加验证语句了。
但是我把验证码的验证报错 和 用户登录的验证报错 合到一块了。
结果:
显示位置和项目统一起来,更加完美。
当前已经部署完了,能正常运行了。但最好还要加上鼠标点击验证码刷新功能。
- #login.html 加入scriptdaima 实现验证码刷新
-
- <script type="text/javascript" charset="utf8" src="/static/js/jquery-1.4.4.min.js">
- </script>
- <script>
- $('.captcha').click(function () {
- $.getJSON("/captcha/refresh/", function (result) {
- $('.captcha').attr('src',result['image_url']);
- $('#id_captcha_0').val(result['key'])
- });
- });
- </script>
over,运行看结果,如图:
1、输入错误也会显示验证码错误。
2、点击验证码可以刷新。
3、3项输入都正确能登录系统。
到此就算完成任务了,大功告成,该拜拜了!
但是,测试输入字母的验证码时,总感觉难度有点大,总是输入错误,所以想改为算术加减乘除验证码。
在setting文件末尾加入如下代码:
- #不加本段代码,默认已有字符验证码,不影响项目运行
-
- # 字母验证码
- # CAPTCHA_IMAGE_SIZE = (80, 45) # 设置 captcha 图片大小
- # CAPTCHA_LENGTH = 4 # 字符个数
- # CAPTCHA_TIMEOUT = 1 # 超时(minutes)
-
-
-
-
- # 加减乘除验证码
- CAPTCHA_OUTPUT_FORMAT = '%(image)s %(text_field)s %(hidden_field)s '
- CAPTCHA_NOISE_FUNCTIONS = (
- 'captcha.helpers.noise_null', # 没有样式
- # 'captcha.helpers.noise_arcs', # 线
- 'captcha.helpers.noise_dots', # 点
- )
- # CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
- # 图片中的文字为随机英文字母
-
- CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'
- # 图片中的文字为数字表达式,如1+2
- CAPTCHA_TIMEOUT = 1
-
至此,已修改完毕,查看运行结果:
现实的难易程度可以在刚才的代码 CAPTCHA_NOISE_FUNCTIONS 里设置,为了减低识别度,只用了点,没用线,就容易识别使用了,但是也降低了被破解的几率,无所谓了,又不是啥重要内容,测试而已。
到此完美结束!!!
%python_path%\Lib\site-packages\captcha\conf\settings.py 或 %project_path%\venv\Lib\site-packages\captcha\conf\settings.py
同时可以修改 captcha\templates\captcha 下的 HTML 文件,更改页面显示格式
- # 设置验证码字符旋转角度
- CAPTCHA_LETTER_ROTATION = getattr(settings, "CAPTCHA_LETTER_ROTATION", (-35, 35))
-
- # 设置验证码前后背景色
- CAPTCHA_BACKGROUND_COLOR = getattr(settings, "CAPTCHA_BACKGROUND_COLOR", "#fff000")
- CAPTCHA_FOREGROUND_COLOR = getattr(settings, "CAPTCHA_FOREGROUND_COLOR", "#000000")
-
- # 设置验证码干扰线,降低被机器识别的风险
- CAPTCHA_NOISE_FUNCTIONS = getattr(
- settings,
- "CAPTCHA_NOISE_FUNCTIONS",
- ## ("captcha.helpers.noise_arcs", "captcha.helpers.noise_dots"),
- ("captcha.helpers.noise_null", "captcha.helpers.noise_null"),
- )
-
- # 设置验证码字符长度
- CAPTCHA_LENGTH = int(getattr(settings, "CAPTCHA_LENGTH", 5)) # Chars
-
- # 设置验证码 输入 与 验证码 显示顺序
- CAPTCHA_OUTPUT_FORMAT = getattr(settings, "CAPTCHA_OUTPUT_FORMAT", None)
- -->
- CAPTCHA_OUTPUT_FORMAT = getattr(settings, "CAPTCHA_OUTPUT_FORMAT", u'%(text_field)s %(hidden_field)s %(image)s')
-
- # 超时时间
- CAPTCHA_TIMEOUT = getattr(settings, "CAPTCHA_TIMEOUT", 1) # Minutes
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。