Skip to main content
Bun.CSRF 生成和验证 CSRF(跨站请求伪造)令牌。Bun 使用 HMAC 对令牌签名。每个令牌都包含签发时间戳和过期时长。
csrf.ts
始终将 sessionId(请求者的会话标识符或用户 ID)传递给 generate() 和 verify()。如果不传递,令牌只会与密钥绑定,因此服务器签发过的任何令牌都能对所有用户通过验证。因此,攻击者可以在自己的会话中获取令牌,然后在受害者的浏览器中通过伪造的跨站请求重放该令牌。

Bun.CSRF.generate()

生成一个 CSRF 令牌。令牌包含一个加密随机数、签发时间戳、expiresIn 时长和 HMAC 签名,并编码为字符串。
generate.ts
参数:
  • secret(string,可选)— 用于签署令牌的密钥。如果未提供,Bun 会生成一个随机的内存中默认密钥(每个线程唯一)。
  • options(object,可选):
返回: string — 编码后的令牌。
generate-options.ts

Bun.CSRF.verify()

验证 CSRF 令牌。如果令牌有效且未过期,返回 true,否则返回 false。
verify.ts
参数:
  • token(string,必需)— 要验证的令牌。
  • options(object,可选):
返回: boolean
verify-options.ts

在 Bun.serve() 中使用

一种典型模式是在渲染表单时生成令牌,将其嵌入隐藏字段,并在表单提交时验证它。将请求者的会话标识符作为 sessionId 传递给这两次调用,这样令牌只对签发给它的用户有效。
server.ts

默认密钥

如果在 generate() 和 verify() 中都省略 secret 参数,Bun 会使用每个线程生成一次的随机密钥。默认密钥适用于单线程应用,但令牌无法跨服务器或 worker 验证,也无法在重启后验证。
default-secret.ts
对于生产环境,请始终提供跨基础设施共享的显式密钥。

TypeScript

types.ts