【问题标题】:Implementing Simple CAPTCHA in Bottle在瓶中实现简单的验证码
【发布时间】:2016-04-25 13:31:26
【问题描述】:

我正在尝试了解使用 python web 框架瓶实现简单验证码的最佳方法。到目前为止,我所发现的只是人们要求即插即用验证码库,或“实际上安全”的复杂生成图像验证码实现,这使得代码示例难以理解。我很想知道在像 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 瓶网络应用:

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 的目的。所以这行不通。

我需要某种服务器端会话存储,供任何获取带有表单的页面的用户使用,我需要以某种方式对其进行跟踪,以便当他们发布表单时服务器知道是谁发布了它。因为框架太抽象了,教程也不太擅长解释底层的想法,我真的不知道我能做什么,或者我可以用什么工具来实现它。

Bottle 甚至可能无法轻松完成这项任务(尽管我对此表示怀疑),因此欢迎提供更简单的 python 解决方案的建议(如果有的话)。

【问题讨论】:

    标签: python web captcha bottle


    【解决方案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 中准备“答案”...

    【讨论】:

    • 我将基本上使用您在此处向我展示的内容。时间门很有趣,尽管如果表格超过 5 分钟,我不确定您拒绝表格的目的是什么。难道我们不想检查一下是否已经过了一些最短时间来过滤即时填写表单的机器人,即使答案是正确的?
    • @MylesGallagher - 最短时间很好,但五分钟限制是为了防止回复攻击
    • 哦,我明白了,以防止一遍又一遍地向同一个表单发送垃圾邮件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多