【发布时间】:2014-12-19 13:50:34
【问题描述】:
我想对网站上的登录和注册表单进行 AJAXify。到目前为止,我一直在使用 WTForms 主要是为了它内置的 CSRF 保护,但对于这个项目,我觉得它不值得——额外的抽象层,因此很沮丧,因为它应该很漂亮很简单。
所以我在 Flask 的安全部分遇到了this snippet:
@app.before_request
def csrf_protect():
if request.method == "POST":
token = session.pop('_csrf_token', None)
if not token or token != request.form.get('_csrf_token'):
abort(403)
def generate_csrf_token():
if '_csrf_token' not in session:
session['_csrf_token'] = some_random_string()
return session['_csrf_token']
app.jinja_env.globals['csrf_token'] = generate_csrf_token
我了解这段代码背后的思考过程。事实上,这一切对我来说都很有意义(我认为)。我看不出有什么问题。
但它不起作用。我对代码所做的唯一更改是将伪函数some_random_string() 替换为对os.urandom(24) 的调用。到目前为止,每个请求都有 403,因为 token 和 request.form.get('_csrf_token') 永远不会相同。当我打印它们时,这变得很明显——通常它们是不同的字符串,但偶尔,并且似乎没有根本原因,一个或另一个将是None 或os.urandom(24) 输出的截断版本。显然有些东西不同步,但我不明白它是什么。
【问题讨论】: