fastify/csrf

GitHub: fastify/csrf

为Node.js/Fastify提供CSRF令牌生成与验证的底层安全工具库。

Stars: 17 | Forks: 4

# CSRF [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/700538b5ce154929.svg)](https://github.com/fastify/csrf/actions/workflows/ci.yml) [![NPM version](https://img.shields.io/npm/v/@fastify/csrf.svg?style=flat)](https://www.npmjs.com/package/@fastify/csrf) [![neostandard javascript style](https://img.shields.io/badge/code_style-neostandard-brightgreen?style=flat)](https://github.com/neostandard/neostandard) CSRF token 创建与验证背后的逻辑。 阅读 [Understanding-CSRF](https://github.com/pillarjs/understanding-csrf) 以获取关于 CSRF 的更多信息。使用此模块来创建自定义 CSRF 中间件。 正在为你喜欢的框架寻找使用此模块的 CSRF 框架? * Express/connect: [csurf](https://www.npmjs.com/package/csurf) 或 [alt-xsrf](https://www.npmjs.com/package/alt-xsrf) * Koa: [koa-csrf](https://www.npmjs.com/package/koa-csrf) 或 [koa-atomic-session](https://www.npmjs.com/package/koa-atomic-session) 此模块是 https://github.com/pillarjs/csrf 在 f0d66c91ea4be6d30a03bd311ed9518951d9c3e4 处的分叉。 ### 安装 ``` $ npm i @fastify/csrf ``` ### TypeScript 此模块包含一个 [TypeScript](https://www.typescriptlang.org/) 声明文件,以便在兼容的编辑器中启用自动补全,并为 TypeScript 项目提供类型 信息。 ## API ``` const Tokens = require('@fastify/csrf') ``` ### new Tokens([options]) 创建一个新的 token 生成/验证实例。`options` 参数是 可选的,如果缺失将直接使用所有默认值。 #### Options Tokens 在 options 对象中接受这些属性。 ##### algorithm 用于生成 token 的哈希算法。默认为 `sha256`。 ##### saltLength 使用的内部盐值的长度,以字符计。在内部,盐值是一个 base 62 字符串。默认为 `8` 个字符。 ##### secretLength 生成的密钥的长度,以字节计。请注意,密钥在传递时是 base-64 编码的,此长度指的是底层 字节,而不是 base-64 字符串的长度。默认为 `18` 个字节。 ##### userInfo 要求在 `tokens.create()` 和 `tokens.verify()` 中包含特定于用户的信息。 ##### hmacKey 设置后,`hmacKey` 将用于生成加密 HMAC 哈希,而不是默认的哈希函数。 ##### validity 生成的 token 的最大有效期,以毫秒计。请注意,epoch 在传递时是 base-36 编码的。默认为 `0` 毫秒(禁用)。 #### tokens.create(secret[, userInfo]) 创建一个新的 CSRF token 并附加到给定的 `secret` 上。`secret` 是一个 字符串,通常通过 `tokens.secret()` 或 `tokens.secretSync()` 方法生成。此 token 是你应该添加到 HTML `
` 块中的内容,并且 期望用户的浏览器将其发回。 ``` const secret = tokens.secretSync() const token = tokens.create(secret) ``` `userInfo` 参数可用于在应用程序部署不受信任的 子域时防止 Cookie Tossing 攻击(及类似攻击)。它将在 token 中编码一些特定于用户的信息。仅当在构造函数中传入 `userInfo: true` 时才会使用它。 #### tokens.secret(callback) 异步创建一个新的 `secret`,它是一个字符串。密钥应 保存在服务器上,通常存储在用户的服务器端会话中。密钥至少应该是每个用户一个。 ``` tokens.secret(function (err, secret) { if (err) throw err // Do something with the secret }) ``` #### tokens.secret() 异步创建一个新的 `secret` 并返回一个 `Promise`。请参阅 `tokens.secret(callback)` 文档以获取完整详细信息。 **注意**:要在 _0.12 之前_ 的 Node.js 中使用 promises,必须使用 `global.Promise = require('bluebird')` 进行 "polyfilled"。 ``` tokens.secret().then(function (secret) { // Do something with the secret }) ``` #### tokens.secretSync() `tokens.secret(callback)` 的同步版本。请参阅 `tokens.secret(callback)` 文档以获取完整详细信息。 ``` const secret = tokens.secretSync() ``` #### tokens.verify(secret, token[, userInfo]) 检查 CSRF token 对于给定的 `secret` 是否有效,返回一个 布尔值。 ``` if (!tokens.verify(secret, token)) { throw new Error('invalid token!') } ``` 如果在初始化期间配置了 `userInfo: true`,则必须提供 `userInfo` 参数。特定于用户的信息必须与传递给 `tokens.create()` 的内容相匹配。 ## 许可证 依据 [MIT](./LICENSE) 授权。
标签:CSRF, Fastify, GNU通用公共许可证, MITM代理, Node.js, NPM包, OSV-Scalibr, SHA-256, TypeScript, Web安全, 令牌生成, 令牌验证, 加密, 后端开发, 安全中间件, 安全插件, 开发库, 数据可视化, 漏洞扫描器, 自定义脚本, 蓝队分析, 跨站请求伪造, 防护工具