如何在没有会话 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">
问题:
- CSRF 令牌验证和会话 cookie 之间有什么关系?为什么需要 cookie 来验证 CSRF 令牌?
- 我尝试再次启用会话 cookie,在 Chrome 开发人员工具中删除 cookie 导致了同样的错误。因此,实际上,会话 cookie 似乎对于验证 CSRF 令牌是绝对必要的。
- 如何在没有会话 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 应用程序会出现问题。
我有一个非常简单的应用程序,没有用户管理或任何 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">
问题:
- CSRF 令牌验证和会话 cookie 之间有什么关系?为什么需要 cookie 来验证 CSRF 令牌?
- 我尝试再次启用会话 cookie,在 Chrome 开发人员工具中删除 cookie 导致了同样的错误。因此,实际上,会话 cookie 似乎对于验证 CSRF 令牌是绝对必要的。
- 如何在没有会话 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。我怀疑,可以构建一个