验证码和CSRF之间的冲突

时间:2018-11-07 10:14:06

标签: python flask csrf captcha

对于我的登录页面,我启用了一个验证码,用户必须输入图片中显示的4位数字。我为此使用flask-session-captcha模块。我遵循了与说明中完全相同的步骤。

在同一登录页面中,我还有一个隐藏的CSRF令牌。

<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>

当我在本地环境(笔记本电脑)中开发和测试它时,它可以正常工作,但是当我在测试服务器中对其进行测试时,它不起作用。它将出现诸如“ CSRF令牌不匹配”之类的错误。或“无效的验证码”(即使我回答正确),有时甚至是“缺少CSRF令牌”。

我已经尝试了很多事情,例如对该特定登录页面使用装饰器@csrf_exempt。我还添加了这个:

@app.after_request
def apply_caching(response):
    response.headers["X-Frame-Options"] = "SAMEORIGIN"
    response.headers["Cache-Control"] = "public, max-age=0, no-cache, no-store, must-revalidate"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "0"
    return response

但是似乎没有任何效果。这真的使我感到困惑,为什么它可以在本地而不在测试服务器上工作。我尝试在登录页面中不使用csrf_token(),但是它给了我缺少csrf令牌的错误。不能使用Google ReCaptcha,因为用户不想使用它。

我想知道是否是因为验证码令牌与csrf令牌冲突了?

1 个答案:

答案 0 :(得分:0)

您可以尝试flask_recaptcha吗?

下面是最小化的示例。

WebDriverWait