在瓶子

时间:2016-01-19 21:48:31

标签: python web captcha bottle

我试图了解使用python web框架瓶实现简单CAPTCHA的最佳方法。到目前为止,我发现所有人都要求使用即插即用的验证码库,或者实际上是安全的#39;复杂的生成图像CAPTCHA实现,使代码示例难以理解。我有兴趣知道什么是最佳实践'在Flask / Bottle这样的框架中实现CAPTCHA的基础知识:

  • 向用户表单发送特定且唯一的人类可解决问题。
  • 跟踪这些问题及其对每个用户的正确答案。
  • 在收到表单后验证分配给该用户的问题是否有正确答案。

这不需要是一个健壮的实现,例如它可以像发送简单的算术问题一样简单,如3 + 2 = ?.在这一点上,我并没有掌握如何正确实现这一点的基础知识。

到目前为止,我已经实现了一个非常基本的验证码,它只适用于文本,虽然我说我不需要它是安全的理解原理,但我现在的方法无法变得安全。

模板:

<form action='/form' method='post'>
    {{ints[0]}} + {{ints[1]}}
    <input name='answer' value='{{ints[0] + ints[1]}}' type='hidden'>
    <input type='text' name='captcha'>
    <input type='submit' value='Submit'>
</form>

python bottle web app:

from bottle import default_app, route, template, post, request
import random


@route('/')
def test_display():
    ints = random.randint(0,9),random.randint(0,9)
    formhtml = template("temp", ints=ints)

    return formhtml

@route('/form', method='POST')
def print_form():
    value = request.forms.get('answer')
    if value != request.forms.get('captcha'):
        return 'Wrong.'
    else:
        return 'Correct.'

application = default_app()

我只是将每个生成的验证码的答案存储在用户表格的隐藏输入字段中。这可以解决任何服务器端存储问题,但我直观地知道,在客户端上存储问题的确切解决方案完全违背了CAPTCHA的目的。所以这不会做。

我需要的是某种服务器端会话存储,用于获取带有表单的页面的任何用户,我需要以某种方式跟踪它,因此当他们POST表单时,服务器知道谁发布了它。因为框架是如此抽象,教程不是很擅长解释基本的想法,我不能很好地掌握我能做什么或者我可以用什么工具来实现它。

瓶子可能甚至不能轻易完成这项任务(我对此表示怀疑),所以建议更简单的python解决方案(如果有的话)是受欢迎的。

1 个答案:

答案 0 :(得分:1)

您可以在没有与用户进行任何类型的会话的情况下执行此操作。只需输入答案的HASH值

像HASH(ANSWER + CURRENT_TIME)之类的东西。当您检查答案时,检查时间是否最近并且您可以继续

@route('/form', method='POST')
def print_form():
    value = request.forms.get('answer')
    time_given_by_server =  request.forms.get('time_given_by_server')#also hidden

    captcha = hashlib.sha1("%s%s"% (request.forms.get('captcha'), time_give_by_server)).hexdigest()
    if value != catcha or time.time()-time_given_by_server > (60*5):#5 mintues is ok i guess...
        return 'Wrong.'
    else:
        return 'Correct.'

当然你必须使用哈希等在test_display中准备“回答”......