SofiDevO/sofi-csrf

GitHub: SofiDevO/sofi-csrf

一个框架无关的 Node.js CSRF 防护库,提供 TypeScript 类型安全和 Token 轮换机制,已适配 Express 和 Hono。

Stars: 0 | Forks: 0

# Sofi CSRF 一个快速、完全类型化且框架无关的 CSRF (跨站请求伪造) 保护库,专为 Node.js 量身定制。它包含一个独立的核心逻辑引擎,并提供了一个专为 Express.js 设计的开箱即用适配器。 ## 功能特性 - **框架无关的核心**:从路由逻辑中提取的安全 payload 生成器和时间安全的验证机制。适用于任何 HTTP node 服务器。 - **TypeScript First**:端到端类型化的类和函数,并使用 `TSDoc` 进行了完善的文档编写。 - **Express 适配器**:预包装的中间件,适当封装了 `req`、`res` 和 cookies,可轻松处理注入和错误抛出。 - **Token 轮换**:利用开箱即用的重新生成中间件,避免 token 重放攻击。 ## 支持的框架与贡献 目前,`sofi-csrf` 为以下框架提供官方的“开箱即用”适配器: - **Express.js** - **Hono** 得益于其框架无关的核心引擎,我们欢迎社区的 PR!请随意通过创建新的适配器(Fastify, Koa, NestJS 等)来扩展生态系统。同样,我也会在时间允许的情况下逐步添加更多官方适配器。 ## 安装 ``` npm install sofi-csrf ``` *(Express 适配器注意:你应该在 Express 应用中使用 `cookie-parser`)*。 ## 使用指南 (Express) ``` import express from 'express'; // Note: [cookie-parser](https://www.npmjs.com/package/cookie-parser) is required to extract cookies smoothly before this middleware import cookieParser from 'cookie-parser'; import { expressCsrf } from 'sofi-csrf'; const app = express(); app.use(express.json()); app.use(cookieParser()); // 1. Initialize the middleware adapter (Accepts partial options) const { csrfMiddleware, verifyCsrfToken, regenerateCsrfToken } = expressCsrf({ cookieName: 'xsrf-token', // Defaults to 'csrfToken' cookieOptions: { secure: process.env.NODE_ENV === 'production', httpOnly: true, maxAge: 3600000 } }); // 2. Inject tokens globally (assigns token to local cookies, req and res.locals) app.use(csrfMiddleware); // 3. Retrieve token for frontend binding or views app.get('/form', (req, res) => { // Can be easily retrieved from req.csrfToken, or res.locals.csrfToken inside EJS/Pug templates! res.json({ csrfToken: req.csrfToken }); }); // 4. Secure your data mutations routes // Client must send the token either in req.body._csrf OR headers['x-csrf-token'] app.post('/submit', verifyCsrfToken, (req, res) => { res.json({ message: "Successfully executed operation with valid token" }); }); // 5. Rotate the token // Often necessary when performing high privilege or session-upgrade tasks app.post('/sensitive-update', regenerateCsrfToken, (req, res) => { res.json({ message: "Task completed securely. A new token has rolled.", newToken: req.csrfToken }); }); ``` ## 使用指南 (Hono) ``` import { Hono } from 'hono'; import { honoCsrf } from 'sofi-csrf'; const app = new Hono(); // 1. Initialize the adapter const { csrfMiddleware, verifyCsrfToken, regenerateCsrfToken } = honoCsrf({ cookieName: 'xsrf-token', }); // 2. Inject token in cookies and set it in context variables (c.get('csrfToken')) app.use('*', csrfMiddleware); // 3. Simple retrieval app.get('/form', (c) => { return c.json({ token: c.get('csrfToken') }); }); // 4. Secure data mutations, accepts 'x-csrf-token' header or '_csrf' in body app.post('/submit', verifyCsrfToken, (c) => { return c.text('Processed securely'); }); // 5. Native Token Rotation app.post('/rotate', regenerateCsrfToken, (c) => { return c.json({ message: "Rotated successfully", newToken: c.get('csrfToken') }); }); ``` ## API 文档 利用 IDE 的智能提示探索代码,享受详细的 `TSDocs` 片段和丰富的上下文信息。 ### 内置接口 - `CsrfCore`:精选的算法验证逻辑。 - `CsrfOptions` 和 `defaultOptions`:处理可自定义的规则。 - `CsrfForbiddenError`:默认抛出的异常,包含 `403` 状态。 ### 选项配置 在初始化适配器(例如 `expressCsrf()` 或 `honoCsrf()`)时,你可以传递一个可选的配置对象来覆盖 `defaultOptions`。 以下是你可以配置的完整选项列表: | 选项 | 类型 | 默认值 | 描述 | | :--- | :--- | :--- | :--- | | `cookieName` | `string` | `'csrfToken'` | 存储生成 token 的 cookie 名称。 | | `tokenLength` | `number` | `24` | 用于生成的加密字节长度(生成一个 48 位的十六进制字符串)。 | | `cookieOptions.httpOnly` | `boolean` | `true` | 防止客户端脚本通过 `document.cookie` 访问 cookie。 | | `cookieOptions.secure` | `boolean` | `false` | 是否确保 cookie 仅通过 HTTPS 发送(强烈建议在生产环境中设置为 `true`)。 | | `cookieOptions.maxAge` | `number` | `3600000` (1 小时) | cookie 的过期时间,以毫秒为单位。 | ## 支持 如果你觉得这个库有帮助,请考虑支持我的工作! [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/sofidev)
标签:CSRF防护, Express, Fastify, GNU通用公共许可证, Hono, HTTP安全, Koa, MITM代理, NestJS, Node.js, NPM包, OSV-Scalibr, Token验证, TypeScript, Web安全, 中间件, 全类型, 前后端安全, 安全插件, 无框架依赖, 网络安全, 自动化攻击, 蓝队分析, 跨站请求伪造, 隐私保护