我在 Flask 应用程序中发现了一个非常奇怪的问题。我发现在某些情况下可以使用相同的名称创建多个会话 cookie。我附上了一张关于它的图片。它不是特定于浏览器的。
这本身很奇怪,但是当我尝试使用CSRF令牌验证表单时,真正的问题就来了。不幸的是,Flask 选择了错误的会话 cookie,无法成功验证 CSRF 令牌。更奇怪的是,即使提交了多个表单,问题仍然存在。唯一的解决方案是删除 cookie,这对普通用户来说不是一个选项。
是否有任何选项可以防止 Flask 创建同名的 cookie?或者至少有没有从我的应用程序中获取所有 cookie 名称的选项?在这种情况下,至少我可以删除同名的会话 cookie。
我习惯Flask-WTF将其 CSRF 安全功能用于我的 API。正如标题所示,我从 API 获得的响应显示“CSRF 会话令牌丢失”。但是,在检查开发人员工具中的网络选项卡后,最初访问 API 返回的会话出现在 cookie 部分中。此外,CSRF 令牌存在于请求标头中。下面是一些图片来说明我的意思:
请求失败
请求成功
过程
例子
前端是用React开发的,后端是用Python(Flask)开发的。两者均由Heroku托管。域名注册商位于GoDaddy,我使用Cloudflare作为我的 DNS 来重新路由流量并设置正确的域名。
示例请求如下所示:
const headers = {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken
};
...
const handleFormSubmission = async e => {
e.preventDefault();
await axios.post('https://backend.com/add-results', { tokenId: tokenId }, { withCredentials: true, headers: headers })
}
Run Code Online (Sandbox Code Playgroud)
并且后端有以下设置:
...
CORS(app, origins=["https://www.example.com"], expose_headers=["Content-Type", "X-CSRFToken"], …Run Code Online (Sandbox Code Playgroud)