我试图了解使用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解决方案(如果有的话)是受欢迎的。
答案 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中准备“回答”......