#6831·hedgedoc

会话存储在更新现有会话时会丢弃 CSRF 密钥

作者: lisboarocha创建于 2026年9月12日更新于 2026年9月12日

KnexSessionStore.set () ' 写出一段会议,其中插入.关于冲突(id.)',csrfToken ' 不在合并清单中(后端/src/sessions/knex-session-store.ts:120-132',develop' atf99a28';名单以8f4c1ae17 ' 运出)。 因此,中国SRF的秘密只有在会话行被先插入时才被写入. 为已存在**的会话生成的符号从未持续过,向私人API提出的下一个更改状态的请求失败了403失踪csrf secret'.

□再现.

f199a28 ' 的开发 ' 上测量,从源头制成后端,Sqlite,一个OIDC供应商配置:

Get / api/ private/auth/oidc/<id> 302 保存会话(待用用户),没有 CSRF 秘密
Get / api/ private/ csrf/ token 200 为当前会话生成一个秘密
DELETE / api/ 私人/ auth/ 等待- user 403 {"状态代码":403,"消息":"错过csrf秘密"]
(带有Csrf-token标题中前一步的符号).

第一个请求只需到达方向;没有涉及身份提供者的往返。 同样的403出现在"PUT/api/private/auth/deving-user"上,在登录开始后,第一个完整的OIDC登录结束,请求该代号. 在数据库中,受影响的会话行将 " csrf token " 设置为 " NULL " 。

∮当它被咬了∮

会话使用"save Unirstized: false",因此一行只在某事修改会话后才存在. 如果先请求一个符号,则该行会被插入其秘密并被后期更新而留下它,这也是大多数流量工作的原因. 失败需要先保存一个会话,** 然后再保存第一个象征性请求,而`GET /api/private/auth/oidc/:id'是这样做的一种途径。

** 我没有测量到的:** 一个真正的浏览器。 前端请求符号懒散(前端/src/redux/csrf-token/methods.ts'),并登录或注册负载上的来宾(组件/应用程序-装入器/初始器/日志-或注册器-grester-guest.ts'),这通常在任何OIDC登录开始前创建有秘密的会话行. 因此,我期望有访客访问功能的浏览器不能看到这个功能,我无法告诉你没有访客访问功能的配置是否如此.

□ 修补

在合并列表中添加 “ FieldNamesession.csrfToken” 。 需要跟随.

内容来源: hedgedoc/hedgedoc