如果使用Django 自带的csrf_token其实是不安全的,因为它实际上就是在HTML中嵌入一个hidden input,我把它复制下来照样也可以跨站请求,所以我们就需要更加安全的机制,验证码。
代码效果:
(图中蓝色高亮的部分就是csrf_token的实际代码)
以下为具体的实现步骤:
1,准备验证码图片
在views.py中添加如下代码:
from django.http import HttpResponse
import cStringIO
#以下导入内容分别为画布,画笔,字体
from PIL import Image,ImageDraw,ImageFont
import random
def verifycode(request):
bgcolor = (random.randrange(20,100),random.randrange(20,100),255)
width = 100
height = 25
im = Image.new('RGB',(width,height),bgcolor)
draw = ImageDraw.Draw(im)
#随机生成噪点
for i in range(0,100):
xy = (random.randrange(0,width),random.randrange(0,height))
fill = (random.randrange(0,255),255,random.randrange(0,255))
draw.point(xy,fill=fill)
#随机的字符串
str1 = 'ABCD123EFGHI4567OPQR90'
rand_str = ''
#生成随机验证码中的内容
for i in range(0,4):
rand_str += str1[random.randrange(0,len(str1))]
font = ImageFont.truetype('FreeMono.ttf',23)
fontcolor = (255,random.randrange(0,255),random.randrange(0,255))
#用画笔画出这四个字符
draw.text((5,2),rand_str[0],font=font,fill=fontcolor)
draw.text((25,2),rand_str[1],font=font,fill=fontcolor)
draw.text((50,2),rand_str[2],font=font,fill=fontcolor)
draw.text((75,2),rand_str[3],font=font,fill=fontcolor)
del draw
#在session中存入验证码字符串
request.session['verifycode'] = rand_str
#python2中用的是这个,来将图片存入内存中
buf = cStringIO.StringIO()
im.save(buf,'png')
return HttpResponse(buf.getvalue(),'image/png')
模板内容(session1.html):
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script type="text/javascript" >
script>
head>
<body>
{# 由于我实在工程中的app1中写的,所以图片路径要加上app1#}
<form action="/app1/verifycodeValid/" method="post">
{% csrf_token %}
<input type="text" name="Myvcc">
<br>
The picture:
<img src="/app1/verifycode/" alt="" id="verifycode">
<br>
<span id="verifycodeChange">Change itspan>
<br>
<input type="submit" value="Submit">
form>
body>
html>
剩下的验证码页面的显示以及验证码后台验证:
在views.py中添加以下内容:
#验证
def verifycodeValid(request):
ve = request.POST['Myvcc']
if ve.upper() == request.session['verifycode']:
return HttpResponse('ok')
else:
return HttpResponse('no')
# 显示
def show_verify(request):
return render(request,'session1.html')
一些路径的添加在urls.py中:
url(r'^verifycode/$',views.verifycode),
url(r'^verifycodeValid/$',views.verifycodeValid),
url(r'show_verify',views.show_verify),