首页 > micolog > 再次升级micolg的留言验证,防止垃圾评论

再次升级micolg的留言验证,防止垃圾评论

2009年10月12日 发表评论 阅读评论

最近发垃圾评论的实在太猖獗了,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
---------------------------------------------------------------

您可能会喜欢:

  1. 修正micolog页码输出从零开始的问题
  2. 为micolog增加随机文章功能
  3. 提供我改过的micolog代码下载
  4. gae micolog 验证码
  5. 为micolog增加阅读次数统计
分类: micolog 标签:

  1. 2009年10月12日15:55 | #1

    自己先留言一把,彩色代码这个还是有问题,代码里面有空行的话,通过live writer粘贴过来后在blog上面就变成空格了,看来还需要整一把。

  2. 2009年10月13日04:18 | #2

    现在测试的结果好吗?

  3. 2009年10月13日11:47 | #3

    恩……代码错位 …… 把加密数据放在cache里面……貌似在本地也可以实现检查,不过估计没有人会再攻击你的micolog,为了我们这些micolog还要改垃圾评论发送软件的代码~

  4. 2009年10月13日13:07 | #4

    哈哈是啊,够用就好了

  5. 2009年10月13日00:33 | #5

    唉,人气旺的后果啊。。。

  6. 2009年10月13日05:46 | #6

    嗯,现在确实是好了,自从昨晚升级后,从来不间断的垃圾评论一直还没出现过。ghs的ip被封了,电信网络连不上,真是郁闷

  7. 2009年10月15日08:22 | #7

    我也改改试试,看看效果怎样。
    访问你的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

  8. 2009年10月15日10:47 | #8

    是啊郁闷,我今天发现有时候会出,但这又不是必出,真是郁闷

  9. 2009年10月15日14:44 | #9

    问题解决了 ,是因为entrycount数目又超过了实际的数目,前两天改出来的bug…
    这次升级后,确实再也没有垃圾评论了

  10. 2009年10月16日12:45 | #10

    照着改了,但我经常发不了评论,不知是不是我的出口ip经常变,还是开启页面cache的缘故?

  11. 2009年10月16日13:40 | #11

    如果我把+self.request.remote_addr去除,还有防攻击的效果吗?

  12. 2009年10月16日12:58 | #12

    估计就是开着cache的问题,把cache关了吧,gae有足够的cpu可用

  13. 2009年10月16日14:13 | #13

    @vvonder

    如果我把+self.request.remote_addr去除,还有防攻击的效果吗?

    不能去掉,去掉之后,如果A和B一前一后都访问blog,B的访问会使A访问的评论失败

  14. 2009年10月17日14:46 | #14

    才好了没几天,新的垃圾评论攻击又来了…
    看来是人家也跟着升级了啊,真是囧
    每次的评论间隔是5s左右,我都怀疑是不是人肉搞的

  15. 2009年10月23日05:47 | #15

    呵呵,好多字符留言啊,你的网站访问出错我刚也遇到了

  1. 2011年9月10日16:00 | #1