UNPKG

nsgm-cli

Version:

A CLI tool to run Next/Style-components and Graphql/Mysql fullstack project

93 lines (92 loc) 3.21 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createCSPMiddleware = exports.securityMiddleware = exports.getCSRFToken = exports.csrfProtection = void 0; const lusca_1 = __importDefault(require("lusca")); // Lusca CSRF 配置 const luscaConfig = { // CSRF 保护 - 修正配置格式 csrf: { header: 'x-csrf-token', // 从 header 中读取 token cookie: '_csrf', // cookie 名称 key: 'csrf', // session key secret: process.env.CSRF_SECRET || 'your-csrf-secret-change-in-production', }, // 内容安全策略 csp: { policy: { 'default-src': "'self'", 'script-src': "'self' 'unsafe-inline'", 'style-src': "'self' 'unsafe-inline'", 'img-src': "'self' data: https:", 'font-src': "'self' https:", 'connect-src': "'self'", }, }, // 其他安全设置 xframe: 'SAMEORIGIN', nosniff: true, xssProtection: true, referrerPolicy: 'same-origin', }; // 条件性 CSRF 保护中间件 const csrfProtection = (req, res, next) => { // 跳过 GET 请求和某些不需要 CSRF 保护的路径 if (req.method === 'GET' || req.path.startsWith('/static') || req.path === '/csrf-token' || req.path.startsWith('/_next') || // Next.js 内部资源 req.path.startsWith('/__next') // Next.js 开发模式内部端点 ) { return next(); } // 对其他请求应用 Lusca CSRF 保护 return lusca_1.default.csrf(luscaConfig.csrf)(req, res, next); }; exports.csrfProtection = csrfProtection; // 获取 CSRF token 的路由处理器 const getCSRFToken = (req, res) => { try { // 尝试从 session 中获取已有的 token const csrfToken = req.session._csrf || req.session[luscaConfig.csrf.key]; if (!csrfToken) { // 如果没有 token,先生成一个 lusca_1.default.csrf(luscaConfig.csrf)(req, res, () => { const newToken = req.session._csrf || req.session[luscaConfig.csrf.key] || req.csrfToken?.(); res.json({ csrfToken: newToken, }); }); } else { res.json({ csrfToken: csrfToken, }); } } catch (error) { console.error('获取 CSRF token 错误:', error); res.status(500).json({ error: 'Failed to generate CSRF token', message: '生成 CSRF 令牌失败', }); } }; exports.getCSRFToken = getCSRFToken; // Lusca 安全中间件配置 exports.securityMiddleware = { // 基本的安全头 basicHeaders: (0, lusca_1.default)({ xframe: luscaConfig.xframe, nosniff: luscaConfig.nosniff, xssProtection: luscaConfig.xssProtection, referrerPolicy: luscaConfig.referrerPolicy, }), }; // CSP 中间件 const createCSPMiddleware = () => { return lusca_1.default.csp(luscaConfig.csp); }; exports.createCSPMiddleware = createCSPMiddleware;