【发布时间】: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 解决方案的建议(如果有的话)。
【问题讨论】: