为micolog添加图形验证码
micolog带的算法验证码似乎太弱了,容易引来垃圾评论。我把它改成了图形验证码,并加入了session机制。图形验证码的实现来自SDBlog,使用的是pngcanvas库绘制;session实现来自gmemsess库,基于memcache。
原理是访客访问/checkimg/获得生成的图形验证码,同时服务器使用session保存验证码值,并在处理提交评论表单时检查。
先测试一下效果,代码以后再整理。
部分代码如下:
safecode.py,gmemsess.py,pngcanvas.py放到app目录
blog.py添加CheckImg类,并在主函数添加路径映射,用于生成验证码图片:
('/checkimg/', CheckImg),from app.safecode import Image
from app.gmemsess import Session
class CheckImg(BaseRequestHandler):
def get(self):
img = Image()
imgdata = img.create()
sess=Session(self,timeout=180)
if not sess.is_new():
sess.invalidate()
sess=Session(self,timeout=180)
sess['code']=img.text
sess.save()
self.response.headers['Content-Type'] = "image/png"
self.response.out.write(imgdata)
Post_comment主要修改如下,验证输入的验证码和session中的是否一致:
sess=Session(self,timeout=180)
if not self.is_login:
if not (self.request.cookies.get('comment_user', '')):
try:
logging.info(checkret)
logging.info(sess['code'])
if sess.is_new() or (int(checkret) != sess['code']):
sess.invalidate()
if useajax:
self.write(simplejson.dumps((False,-102,('Your check code is invalid .'))))
else:
self.error(-102,('Your check code is invalid .'))
return
except:
sess.invalidate()
if useajax:
self.write(simplejson.dumps((False,-102,('Your check code is invalid .'))))
else:
self.error(-102,('Your check code is invalid .'))
return
sess.invalidate()
为了使验证码显示(默认首次访问检查验证码),可以点击这里清除cookie。
转载请注明:来自vvonder's blog
本文地址:http://vvonderblog.appspot.com/2009/11/25/add-micolog-image-checkcode.html
37 条评论
我要留言云在天边 发表于 2009-11-25 at 21:27 回复 引用
vvonder 发表于 2009-11-25 at 21:37 回复 引用
我这样设定的,因为验证码有过期时间(3分钟),而且不是每个访客都要留言,还可以节省流量
云在天边 发表于 2009-11-25 at 21:42 回复 引用
哦,我刚下了你的代码,有时间我也去弄弄
云在天边 发表于 2009-11-25 at 23:23 回复 引用
vvonder 发表于 2009-11-26 at 12:14 回复 引用
inove主题可以参照5style主题改,comments.html文件里加入个if else即可。等下我再发一个主题调整过的版本。
yanpeng 发表于 2009-11-26 at 15:05 回复 引用
云在天边 发表于 2009-11-26 at 18:07 回复 引用
你是怎么留言的呢?出来的就是图形啊
vvonder 发表于 2009-11-26 at 18:11 回复 引用
默认只验证一次,就记住用户身份(不过ie好像无效),如果效果不好再改为每次验证。点上面的清除cookie后刷新可以看到验证码。
ooaixt 发表于 2009-11-26 at 23:52 回复 引用
vvonder 发表于 2009-11-27 at 12:31 回复 引用
人肉很难防的,这个主要是防机器,当然带上cookie是可以绕过的。为了用户体验,这里暂时不搞太高强度。
hysia 发表于 2009-11-27 at 17:02 回复 引用
yishanhe 发表于 2009-11-28 at 00:33 回复 引用
vvonder 发表于 2009-11-28 at 09:44 回复 引用
appspot没有被封啊,如果有自己的域名的话可以找ghs的反向代理绑定,看看www.you8g.com还有没有名额去要一个。
蓝冰 发表于 2009-11-28 at 11:13 回复 引用
zhy 发表于 2009-12-09 at 15:15 回复 引用
Shen 发表于 2010-02-07 at 17:48 回复 引用
cho 发表于 2010-02-13 at 22:21 回复 引用
我现在改模板时都遇到验证码的麻烦了,现在验证码形同虚设,无需填写也能发表评论了,有时间帮帮忙行吗?
主题:http://www.cho.org.ru/media/agdibG9nc3Rocg0LEgVNZWRpYRiJ0AIM/journalist.zip
知秋 发表于 2010-04-14 at 20:50 回复 引用
vvonder 发表于 2010-04-20 at 14:31 回复 引用
这段时间比较忙,博客和主题也好久没更新了,有时间我再更新一个micolog0.7的主题
bezetek 发表于 2010-04-20 at 20:29 回复 引用
news updates 发表于 2010-04-24 at 20:33 回复 引用
chenzaichun 发表于 2010-05-08 at 12:52 回复 引用
默认官方主题没有验证码了!
Leyond 发表于 2010-05-09 at 14:20 回复 引用
Leyond 发表于 2010-05-09 at 15:13 回复 引用
非常感谢,用上了
Leyond 发表于 2010-05-10 at 22:59 回复 引用
vvonder 发表于 2010-05-11 at 19:30 回复 引用
我的博客还没更新到0.7,那个主题是for 0.7的
Crisiel 发表于 2010-05-21 at 23:53 回复 引用
vvonder 发表于 2010-05-23 at 16:55 回复 引用
这里下载最新版的micolog,里面有文中提到的3个py库文件和实现
Crisiel 发表于 2010-05-23 at 20:24 回复 引用
Thanks~
yi_tian 发表于 2010-05-31 at 12:53 回复 引用
enki 发表于 2010-07-13 at 12:36 回复 引用
美国优洛 发表于 2010-07-19 at 18:27 回复 引用
jerry 发表于 2010-09-27 at 18:45 回复 引用
gg 发表于 2010-10-15 at 20:20 回复 引用
testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
wefgew 发表于 2010-10-22 at 18:27 回复 引用
xhliu 发表于 2011-04-08 at 22:33 回复 引用
链接
js部分:
xhliu 发表于 2011-04-08 at 22:43 回复 引用
链接:
js: