您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python如何生成验证码
## 目录
1. [验证码概述](#验证码概述)
2. [基础验证码生成](#基础验证码生成)
3. [图形验证码进阶](#图形验证码进阶)
4. [验证码安全增强](#验证码安全增强)
5. [实战应用案例](#实战应用案例)
6. [总结与扩展](#总结与扩展)
---
## 验证码概述
验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and Humans Apart"的缩写,用于区分人类用户和自动化程序。
### 常见验证码类型
| 类型 | 特点 | 应用场景 |
|------------|-----------------------|----------------|
| 数字验证码 | 纯数字组合 | 短信验证 |
| 图形验证码 | 扭曲文字+干扰元素 | 网页表单 |
| 滑动验证 | 拼图滑块 | 移动端应用 |
| 行为验证 | 鼠标轨迹分析 | 高安全场景 |
---
## 基础验证码生成
### 1. 随机字符串生成
```python
import random
import string
def generate_code(size=6):
"""生成数字字母混合验证码"""
chars = string.ascii_uppercase + string.digits
return ''.join(random.choice(chars) for _ in range(size))
print(generate_code()) # 输出类似:7A2B9C
安装必备库:
pip install pillow
基础图像生成示例:
from PIL import Image, ImageDraw, ImageFont
import random
def create_simple_captcha(text):
# 创建300x100像素白色背景图片
img = Image.new('RGB', (300, 100), color=(255, 255, 255))
draw = ImageDraw.Draw(img)
# 加载字体(需替换实际字体路径)
try:
font = ImageFont.truetype('arial.ttf', 36)
except:
font = ImageFont.load_default()
# 随机文字位置和颜色
for i, char in enumerate(text):
draw.text((10 + i*50, 30), char,
fill=(random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255)),
font=font)
return img
# 使用示例
img = create_simple_captcha("PYTHON")
img.save("captcha.png")
def add_noise(draw, width, height):
"""添加干扰线和噪点"""
# 画干扰线
for _ in range(5):
draw.line([
(random.randint(0, width),
random.randint(0, height)),
(random.randint(0, width),
random.randint(0, height))
], fill=(random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255)),
width=2)
# 添加噪点
for _ in range(1000):
draw.point(
[random.randint(0, width),
random.randint(0, height)],
fill=(random.randint(0, 255),
random.randint(0, 255),
random.randint(0, 255))
from PIL import ImageTransform
def warp_text(image, text, font):
"""创建扭曲文字效果"""
width, height = image.size
mask = Image.new('L', (width, height))
draw = ImageDraw.Draw(mask)
# 先绘制正常文字
draw.text((10, 10), text, font=font, fill=255)
# 应用透视变换
transformed = mask.transform(
(width, height),
ImageTransform.QuadTransform([
10 + random.randint(-5, 5), 10 + random.randint(-5, 5),
width-10 + random.randint(-5, 5), 10 + random.randint(-5, 5),
width-10 + random.randint(-5, 5), height-10 + random.randint(-5, 5),
10 + random.randint(-5, 5), height-10 + random.randint(-5, 5)
])
)
return transformed
import time
from hashlib import md5
class CaptchaManager:
def __init__(self):
self.captchas = {}
def generate(self):
code = generate_code()
token = md5(f"{code}{time.time()}".encode()).hexdigest()
self.captchas[token] = {
'code': code,
'expire': time.time() + 300 # 5分钟有效期
}
return token, code
def validate(self, token, user_input):
data = self.captchas.get(token)
if not data:
return False
if time.time() > data['expire']:
del self.captchas[token]
return False
return data['code'].lower() == user_input.lower()
from flask import Flask, send_file, request
import io
app = Flask(__name__)
manager = CaptchaManager()
@app.route('/captcha')
def get_captcha():
token, code = manager.generate()
img = create_advanced_captcha(code) # 综合之前的高级方法
img_io = io.BytesIO()
img.save(img_io, 'PNG')
img_io.seek(0)
return send_file(img_io, mimetype='image/png'), 200, {
'X-Captcha-Token': token
}
@app.route('/verify', methods=['POST'])
def verify():
token = request.headers.get('X-Captcha-Token')
code = request.form.get('code')
if manager.validate(token, code):
return {"status": "success"}
return {"status": "invalid"}, 400
# middleware.py
from django.http import HttpResponseForbidden
class CaptchaMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.path.startswith('/admin/'):
if not self.verify_captcha(request):
return HttpResponseForbidden("验证码错误")
return self.get_response(request)
def verify_captcha(self, request):
# 实现验证逻辑
pass
captcha
:专业验证码生成库django-simple-captcha
:Django专用插件svg-captcha
:生成SVG格式验证码通过本文介绍的方法,开发者可以快速实现从简单到复杂的企业级验证码系统。实际应用中应根据安全需求选择合适的验证码强度,并在用户体验和安全防护之间取得平衡。 “`
(注:实际字数约2350字,此处为精简展示版。完整版包含更多实现细节、参数说明和性能对比数据)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。