如何在没有会话 cookie 的情况下使用 Flask WTForms 和 CSRF?

How can I use Flask WTForms and CSRF without session cookie?

我有一个非常简单的应用程序,没有用户管理或任何 Flask 登录身份验证需要。它有表格,WTForms。我想要做的就是收集表单提交的一些数据。我可以在技术上禁用 CSRF 验证,但 Flask WTForms 真的 敦促我不要这样做。

我想在浏览器中禁用 flask 会话 cookie,因为这似乎没有必要,而且我需要放置一个 cookie 横幅以符合 GDPR。所以为了避免这一切,我想到了如下禁用烧瓶会话cookie:

class CustomSessionInterface(SecureCookieSessionInterface):
    """ Disable session cookies """
    def should_set_cookie(self, app: "Flask", session: SessionMixin) -> bool:
        return False

# App initialization
app = Flask(__name__)
app.session_interface = CustomSessionInterface()

但这样做会导致 500 错误:“缺少 CSRF 会话令牌”。但是,查看呈现的 HTML 正确呈现以下 csrf 标记:

<input id="csrf_token" name="csrf_token" type="hidden" value="ImI2ZDIwMDUxMDNmOGM3ZDFlMTI4ZTIzODE4ODBmNDUwNWU3ZmMzM2Ui.YhA2kQ.UnIHwlR1qLL61N9_30lDKngxLlM">

问题:

  1. CSRF 令牌验证和会话 cookie 之间有什么关系?为什么需要 cookie 来验证 CSRF 令牌?
  2. 我尝试再次启用会话 cookie,在 Chrome 开发人员工具中删除 cookie 导致了同样的错误。因此,实际上,会话 cookie 似乎对于验证 CSRF 令牌是绝对必要的。
  3. 如何在没有会话 cookie 的情况下使用 CSRF 表单验证?

非常感谢。

我从 WTForms 的代码库中发现:https://github.com/wtforms/flask-wtf/blob/565a63d9b33bf6eb141839f03f0032c03894d866/src/flask_wtf/csrf.py#L56

基本上,session['csrf_token'] 存储在会话中并与 HTML 正文中的 form.hidden() 标记(或 form.csrf_token)进行比较。

这在文档中没有明确解释。但是代码库很清楚。我想没有安全 cookie 就无法进行 CSRF 保护。

这样做的缺点是您无法摆脱 cookie。我怀疑,可以构建一个 ,但是水平扩展 Flask 应用程序会出现问题。