再次升级micolg的留言验证,防止垃圾评论
最近发垃圾评论的实在太猖獗了,gae提供的图片模块又没法支撑captcha的能力,个人又不太喜欢直接删除所有纯英文评论的做法,其它的验证码服务搭建起来会使micolog依赖性增强,再加上我懒…
一系列原因,导致我今天做了个小升级,看是否有效果。原理是根据文章id与访客的ip地址生成一个随机数加在网页中,访客通过网页留言的话是正常的,但如果通过工具进行留言,就必须每次重新获取一下随机数。为了增加工具的门槛,以后需要在页面上增加一个js来对随机数混淆,先放上这个简单的看看效果如何:)
blog.py中把这两个类列出来,就不多说了
[code lang='python' style='vs']
class SinglePost(BasePublicPage):
@cache()
def get(self,slug=None,postid=None):
if postid:
entries = Entry.all().filter("published =", True).filter('post_id =', postid).fetch(1)
else:
slug=urldecode(slug)
entries = Entry.all().filter("published =", True).filter('link =', slug).fetch(1)
if not entries or len(entries) == 0:
return self.error(404)
entry = entries[0]
addReadTime(entry)
makeHighlight(entry)
comments = Comment.all().filter("entry =",entry)
commentuser = ['','','']
checknum = random.randint(1, 100000)
memcache.set(str(entry.key())+self.request.remote_addr, str(checknum), 900)
tpl_vars = {
'entry':entry,
'relateposts':entry.relateposts,
'comments':comments,
'user_name':commentuser[0],
'user_email':commentuser[1],
'user_url':commentuser[2],
'checknum':checknum
}
if entry.entrytype=='post':
self.render('single', tpl_vars)
else:
self.render('page', tpl_vars)
class Post_comment(BaseRequestHandler):
#@printinfo
def post(self,slug=None):
useajax=self.param('useajax')=='1'
name=self.param('author')
email=self.param('email')
url=self.param('url')
key=self.param('key')
content=self.param('comment')
checknum=self.param('checknum')
saved_checknum = memcache.get(key+self.request.remote_addr)
if (not saved_checknum) or (str(saved_checknum) <> checknum):
if useajax:
self.write(simplejson.dumps((False,-102,_('Checknum not correct .'))))
else:
self.error(-102,_('Checknum not correct .'))
return
memcache.delete(key+self.request.remote_addr)
content=content.replace('\n','<br>')
content=myfilter.do_filter(content)
name=cgi.escape(name)[:20]
url=cgi.escape(url)[:100]
if not (name and email and content):
if useajax:
self.write(simplejson.dumps((False,-101,_('Please input name, email and comment .'))))
else:
self.error(-101,_('Please input name, email and comment .'))
else:
comment=Comment(author=name,
content=content.replace('^~','<img src="http://' + g_blog.domain + "/static/images/icons/icon_").replace('~^','.gif" />'),
email=email,
entry=Entry.get(key))
if url:
try:
comment.weburl=url
except:
comment.weburl='http://'+url
#name=name.decode('utf8').encode('gb2312')
info_str='#@#'.join([urlencode(name),urlencode(email),urlencode(url)])
logging.info("info:"+info_str)
#info_str='#@#'.join([name,email,url.encode('utf8')])
60; cookiestr='comment_user=%s;expires=%s;domain=%s;path=/'%(info_str,(datetime.now()+timedelta(days=100)).strftime("%a, %d-%b-%Y %H:%M:%S GMT"),'')
comment.save()
memcache.delete("/"+comment.entry.link)
self.response.headers.add_header('Set-Cookie', cookiestr)
if useajax:
comment_c = self.get_render('comment',{'comment':comment})
self.write(simplejson.dumps((True,comment_c.decode('utf8'))))
else:
self.redirect(self.referer)
[/code]
最后,要记得更新你的comments.html文件,提交的form里面带上checknum
---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2009/10/12/upgrade-again-micolg-message-authentication-to-prevent-spam-comments.html
---------------------------------------------------------------
您可能会喜欢:
自己先留言一把,彩色代码这个还是有问题,代码里面有空行的话,通过live writer粘贴过来后在blog上面就变成空格了,看来还需要整一把。
现在测试的结果好吗?
恩……代码错位 ……
把加密数据放在cache里面……貌似在本地也可以实现检查,不过估计没有人会再攻击你的micolog,为了我们这些micolog还要改垃圾评论发送软件的代码~
哈哈是啊,够用就好了
唉,人气旺的后果啊。。。
嗯,现在确实是好了,自从昨晚升级后,从来不间断的垃圾评论一直还没出现过。ghs的ip被封了,电信网络连不上,真是郁闷
我也改改试试,看看效果怎样。
访问你的blog有时会有如下错误:
Traceback (most recent call last):
File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 507, in __call__
handler.get(*groups)
File "/base/data/home/apps/yanpblog/1.337007200942554545/base.py", line 60, in _wrapper
method(*args, **kwargs)
File "/base/data/home/apps/yanpblog/1.337007200942554545/blog.py", line 177, in get
self.render(‘single’, tpl_vars)
File "/base/data/home/apps/yanpblog/1.337007200942554545/base.py", line 185, in render
html=self.get_render(template_file,values)
File "/base/data/home/apps/yanpblog/1.337007200942554545/base.py", line 177, in get_render
html = template.render(sfile, self.template_vals)
File "/base/python_lib/versions/1/google/appengine/ext/webapp/template.py", line 81, in render
return t.render(Context(template_dict))
File "/base/python_lib/versions/1/google/appengine/ext/webapp/template.py", line 121, in wrap_render
return orig_render(context)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 168, in render
return self.nodelist.render(context)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 705, in render
bits.append(self.render_node(node, context))
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 718, in render_node
return(node.render(context))
File "/base/python_lib/versions/third_party/django-0.96/django/template/loader_tags.py", line 82, in render
return compiled_parent.render(context)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 168, in render
return self.nodelist.render(context)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 705, in render
bits.append(self.render_node(node, context))
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 718, in render_node
return(node.render(context))
File "/base/python_lib/versions/third_party/django-0.96/django/template/loader_tags.py", line 23, in render
result = self.nodelist.render(context)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 705, in render
bits.append(self.render_node(node, context))
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 718, in render_node
return(node.render(context))
File "/base/python_lib/versions/third_party/django-0.96/django/template/loader_tags.py", line 96, in render
return self.template.render(context)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 168, in render
return self.nodelist.render(context)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 705, in render
bits.append(self.render_node(node, context))
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 718, in render_node
return(node.render(context))
File "/base/python_lib/versions/third_party/django-0.96/django/template/defaulttags.py", line 93, in render
values = self.sequence.resolve(context, True)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 563, in resolve
obj = resolve_variable(self.var, context)
File "/base/python_lib/versions/third_party/django-0.96/django/template/__init__.py", line 656, in resolve_variable
current = current()
File "/base/data/home/apps/yanpblog/1.337007200942554545/model.py", line 161, in randposts
result.append(entries.fetch(1, offset = id)[0])
IndexError: list index out of range
是啊郁闷,我今天发现有时候会出,但这又不是必出,真是郁闷
问题解决了
,是因为entrycount数目又超过了实际的数目,前两天改出来的bug…
这次升级后,确实再也没有垃圾评论了
照着改了,但我经常发不了评论,不知是不是我的出口ip经常变,还是开启页面cache的缘故?
如果我把+self.request.remote_addr去除,还有防攻击的效果吗?
估计就是开着cache的问题,把cache关了吧,gae有足够的cpu可用
@vvonder
不能去掉,去掉之后,如果A和B一前一后都访问blog,B的访问会使A访问的评论失败
才好了没几天,新的垃圾评论攻击又来了…
。
看来是人家也跟着升级了啊,真是囧
每次的评论间隔是5s左右,我都怀疑是不是人肉搞的
呵呵,好多字符留言啊,你的网站访问出错我刚也遇到了