在 Bottle 中实现简单的验证码
Implementing Simple CAPTCHA in Bottle
我正在尝试了解使用 python 网络框架瓶实现简单验证码的最佳方法。到目前为止,我所发现的只是人们要求即插即用的验证码库,或者 'actually secure' 复杂的生成图像验证码实现,这使得代码示例难以理解。我很想知道 'best practice' 在 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 的目的。所以这不行。
我需要的是某种服务器端会话存储,供任何获得带有表单的页面的用户使用,我需要以某种方式对其进行跟踪,以便当他们 POST 服务器知道表单时谁发布的。因为框架太抽象了,而且教程也不太擅长解释基本思想,所以我真的不太了解我能做什么或者有什么工具可以实现。
Bottle 甚至可能无法轻松完成这项任务(虽然我对此表示怀疑),因此欢迎提出更简单的 python 解决方案的建议(如果有的话)。
您无需与用户进行任何类型的会话即可完成此操作。只需将答案的哈希值
类似于 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 中准备 "answer"...
我正在尝试了解使用 python 网络框架瓶实现简单验证码的最佳方法。到目前为止,我所发现的只是人们要求即插即用的验证码库,或者 'actually secure' 复杂的生成图像验证码实现,这使得代码示例难以理解。我很想知道 'best practice' 在 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 的目的。所以这不行。
我需要的是某种服务器端会话存储,供任何获得带有表单的页面的用户使用,我需要以某种方式对其进行跟踪,以便当他们 POST 服务器知道表单时谁发布的。因为框架太抽象了,而且教程也不太擅长解释基本思想,所以我真的不太了解我能做什么或者有什么工具可以实现。
Bottle 甚至可能无法轻松完成这项任务(虽然我对此表示怀疑),因此欢迎提出更简单的 python 解决方案的建议(如果有的话)。
您无需与用户进行任何类型的会话即可完成此操作。只需将答案的哈希值
类似于 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 中准备 "answer"...