对于我的登录页面,我启用了验证码,用户必须输入图像中显示的 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 令牌冲突?