ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Midway 安全组件 @midwayjs/security 全解析:从演进历史到配置实战

Midway 安全组件 @midwayjs/security 全解析:从演进历史到配置实战 后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载midwayjs/security 是 Midway 框架内置的通用安全组件适用于midwayjs/faas、midwayjs/web、midwayjs/koa和midwayjs/express多种框架开箱即用地提供csrf、xss、csp、hsts、xframe、nosniff等多种安全策略。本文以 packages/security/CHANGELOG.md 的演进记录为主线结合 packages/security/README.md 与 packages/security/src 的源码实现帮助你完整掌握该组件的安装、配置、防护原理与生产实践。一、从 CHANGELOG 看安全组件的演进脉络CHANGELOG.md记录了midwayjs/security从 3.0 到 3.7 的完整版本轨迹。其中绝大多数条目是 Version bump only仅随主版本号同步递增但透过其中几个关键节点可以清晰还原这个组件的诞生与成长版本时间关键变更3.0.0-beta.172022-01-18组件首次加入仓库PR #1569 security同批还引入了静态文件能力3.0.22022-01-24修复 singleton invoke request scope not valid单例调用时请求作用域失效问题#16223.0.72022-02-17依赖升级nanoid更新至 v3.3.1#17043.1.22022-03-15新增 security helper安全辅助工具#1795提供escape/html/js/json等注入防护能力3.6.02022-10-10新增 guard 能力#2345从时间线可以看出安全组件诞生于 Midway 3.0 大版本阶段随后通过两个里程碑式迭代补全能力3.1.2 引入安全辅助函数3.6.0 引入 guard。其余版本以依赖维护与框架协同为主属于稳定的演进节奏。二、快速上手安装与引入安全组件是一个标准 Midway 组件接入方式与其它组件一致。1. 安装依赖npm i midwayjs/security --save以仓库当前版本为例其运行时依赖包括csrf、escape-html、nanoid、picomatch、platform、xss等库这些正是 CSRF 令牌生成、XSS 过滤、CSP nonce 生成、域名白名单匹配等能力的底层支撑详见 packages/security/package.json。2. 在configuration.ts中引入组件import * as Security from midwayjs/security; import { Configuration } from midwayjs/core; Configuration({ imports: [ // ...other components Security, ], }) export class AutoConfiguration {}组件内部通过Configuration({ namespace: security })声明命名空间并在onReady生命周期中将各安全中间件按配置注入到应用中见 packages/security/src/configuration.tsasync onReady() { this.applicationManager .getApplications([koa, faas, express, egg]) .forEach(app { app.useMiddleware(SecurityHelper); if (this.security.csrf?.enable) { app.useMiddleware(CsrfMiddleware); } if (this.security.csp?.enable) { app.useMiddleware(CSPMiddleware); } // xframe / hsts / noopen / nosniff / xssProtection 同理按 enable 开关注入 }); }这正是 开箱即用 的原理组件启动时自动把启用的安全中间件挂到应用中间件链上开发者无需手动注册。三、默认配置总览所有安全策略的默认配置集中在 packages/security/src/config/config.default.ts与 README 中的示例完全一致export const security { csrf: { enable: true, type: ctoken, useSession: false, cookieName: csrfToken, sessionName: csrfToken, headerName: x-csrf-token, bodyName: _csrf, queryName: _csrf, refererWhiteList: [], }, xframe: { enable: true, value: SAMEORIGIN, }, csp: { enable: false, }, hsts: { enable: false, maxAge: 365 * 24 * 3600, includeSubdomains: false, }, noopen: { enable: false, }, nosniff: { enable: false, }, xssProtection: { enable: true, value: 1; modeblock, }, }注意默认值差异csrf、xframe、xssProtection 默认开启而 csp、hsts、noopen、nosniff 默认关闭需要按业务场景显式开启。所有配置项的类型定义在 packages/security/src/interface.ts 中类型名为SecurityOptions。四、七大安全策略详解4.1 csrf跨站请求伪造防护CSRFCross-Site Request Forgery是最常见的 Web 攻击之一。midwayjs/security的 CSRF 防护默认开启通过校验请求中携带的 token 是否与服务端下发的 secret 匹配来防御攻击。配置项类型作用描述默认值enableboolean是否开启truetypeall / any / ctoken / referercsrf 校验类型all/any 等于 ctoken refererctoken 从 query/header/body 中获取 csrf tokenuseSessionbooleancsrf token 是否存放在 session 中false默认存放在 cookies 中cookieNamestringtoken 在 cookie 中存放的字段csrfTokensessionNamestringtoken 在 session 中存放的字段csrfTokenheaderNamestringtoken 在 header 中存放的字段x-csrf-tokenbodyNamestringtoken 在 body 中存放的字段_csrfqueryNamestringtoken 在 query 中存放的字段_csrfrefererWhiteListArraystring允许的来源白名单[]从源码 packages/security/src/middleware/csrf.middleware.ts 可以确认其完整工作流程注入上下文能力中间件向context挂载assertCsrf()、rotateCsrfSecret()以及只读属性csrf返回基于当前 secret 生成的 token。确保 secret 存在当type为any/all/ctoken时若 cookie或 session中尚无 secret则通过tokens.secretSync()生成并写回。支持cookieName传入数组以平滑迁移 cookie 名称。按请求方法过滤GET、HEAD、OPTIONS、TRACE等只读请求自动跳过校验仅对会改变状态的请求执行assertCsrf()。按类型分发校验ctoken校验 token从queryName → bodyName → headerName依次取输入 token与 secret 比对token ! tokenSecret !tokens.verify(...)则抛出CSRFErrorreferer校验来源域名将Referer头与refererWhiteList加请求 host 组成的域名列表比对白名单支持*通配符见 packages/security/src/utils.ts 的isSafeDomainall/any两者都校验。实践要点前端需要在写操作请求中携带 token可放在自定义 header默认x-csrf-token、body默认_csrf或 query默认_csrf中登录后建议调用context.rotateCsrfSecret()轮换密钥确保每个用户拥有独立 secret源码注释也特别强调 Must call this method when user login to ensure each user has independent secret多域名、跨域场景务必维护好refererWhiteList。4.2 xframe点击劫持防护X-Frame-Options响应头指示浏览器是否允许页面在frame、iframe、embed或object中展示防止站点被嵌入到别人的页面从而引发clickjacking点击劫持攻击。X-Frame-Options有三种取值X-Frame-Options: deny页面不允许在 frame 中展示X-Frame-Options: sameorigin页面可以在相同域名页面的 frame 中展示X-Frame-Options: allow-from https://example.com/页面可以在指定来源的 frame 中展示。配置项类型作用描述默认值enableboolean是否开启truevaluestringX-Frame-Options 值SAMEORIGIN实现上xframe.middleware.ts 在响应阶段直接设置x-frame-options头值为配置项未配置时回退到SAMEORIGIN。4.3 hsts强制 HTTPS 访问HTTP Strict Transport SecurityHSTS告诉浏览器在指定时间内只能通过HTTPS访问当前资源而不是HTTP从而降低中间人攻击与协议降级风险。配置项类型作用描述默认值enableboolean是否开启falsemaxAgenumber浏览器收到该响应后多少秒内访问该域名下所有请求都使用 HTTPS365 * 24 * 3600一年includeSubdomainsboolean此规则是否适用于该网站的所有子域名falsehsts.middleware.ts 的响应头拼装逻辑清晰基础值为max-agemaxAge当includeSubdomains为 true 时追加; includeSubdomains最终写入strict-transport-security头。4.4 csp内容安全策略Content-Security-Policy响应头允许站点管理者控制指定页面可以加载哪些资源是防止跨站脚本攻击XSS的现代核心手段。配置项类型作用描述默认值enableboolean是否开启falsepolicyObjectkey: string, value: string / string[] / boolean策略列表{}reportOnlyboolean是否仅报告不拦截falsesupportIEboolean是否支持 IE 浏览器falsecsp.middleware.ts 的实现细节值得关注为上下文提供context.nonce基于nanoid生成 16 位随机值并在响应中额外写入x-csp-nonce头当policy[script-src]未包含nonce-前缀时自动追加nonce-value方便开发者直接在 HTML 中使用 nonce 放行可信内联脚本以.开头的策略值会被自动转换为*.通配形式sandbox为true时输出裸sandbox指令多策略以;连接reportOnly为 true 时写入content-security-policy-report-only头族通过platform解析 User-Agent在 IE 且supportIE为 true 时改用x-content-security-policy兼容头。4.5 noopen禁用 IE 直接打开下载文件用于指定 IE 8 以上版本的用户不打开文件而直接保存文件在下载对话框中不显示 打开 选项。配置项类型作用描述默认值enableboolean是否开启false对应中间件 noopen.middleware.ts开启后设置X-Download-Options: noopen响应头。4.6 nosniffMIME 类型嗅探防护开启后如果从script或stylesheet读入的文件 MIME 类型与指定类型不匹配浏览器不允许读取该文件用于防御基于 MIME 混淆的 XSS 等攻击。配置项类型作用描述默认值enableboolean是否开启false对应中间件 nosniff.middleware.ts开启后设置X-Content-Type-Options: nosniff响应头。4.7 xssProtection浏览器 XSS 过滤器用于启用浏览器的 XSS 过滤功能。X-XSS-Protection响应头是 IE、Chrome 和 Safari 的特性当检测到跨站脚本攻击时浏览器将停止加载页面。若网站已设置良好的Content-Security-Policy禁用内联 JavaScriptunsafe-inline现代浏览器不太需要这些保护但它仍能为尚不支持 CSP 的旧版浏览器提供保护。X-XSS-Protection可配置四个值0禁止 XSS 过滤1启用 XSS 过滤浏览器通常默认。检测到攻击时浏览器将清除页面删除不安全部分1; modeblock启用 XSS 过滤。检测到攻击时浏览器不清除页面而是阻止页面加载1; reportreporting-URIChromium 专属。启用 XSS 过滤检测到攻击时清除页面并使用 CSP report-uri 指令发送违规报告。配置项类型作用描述默认值enableboolean是否开启falsevaluestringX-XSS-Protection 配置1; modeblock注意 README 表格中 enable 默认值写作 false但实际默认配置config.default.ts中为enable: true以仓库默认配置为准。对应实现 xssProtection.middleware.ts 直接写入配置值。五、match / ignore精细控制中间件作用范围interface.ts中SecurityEnableOptions额外定义了match与ignore两个可选字段类型为IgnoreMatcher可在所有策略中间件上使用export interface SecurityEnableOptions { enable: boolean; match?: IgnoreMatcherany | IgnoreMatcherany[]; ignore?: IgnoreMatcherany | IgnoreMatcherany[]; }base.middleware.ts 的init阶段会读取对应策略如security.csrf.match的动态合并规则。这意味着你可以对特定路径启用或豁免某个安全策略例如只对/admin路径加强 CSRF 校验或对静态资源路径豁免 CSP实现细粒度管控。六、security helper上下文级注入防护工具3.1.2 版本引入的 security helper#1795 中实现它总是被注册不受开关影响向context.security挂载四个工具context.security { escape, // HTML 转义来自 escape-html html: (htmlCode) filterXSS(htmlCode), // XSS 过滤来自 xss 库 js: safeJS, // JavaScript 字符串安全化 json: safeJSON, // JSON 序列化安全化 };其中safeJS将 JS 字符串中易造成注入的 ASCII 字符转义为\x十六进制形式如换行、引号、尖括号等保留常规字母数字与中文字符safeJSON则递归清理对象键名后再对字符串值逐一应用safeJS。在模板渲染或拼接前端代码时用这些工具处理动态内容可以有效降低注入风险。七、设计要点与使用建议声明式配置、自动装配所有策略通过security配置节声明组件启动时按enable开关自动注册中间件无需手工维护中间件顺序。默认值面向安全csrf、xframe、xssProtection 默认开启为应用提供基础防线csp、hsts 等重策略按需开启避免影响既有页面。多框架兼容中间件基类对 express 与 koa/faas 两种上下文做了适配express 走req/res其余走ctx因此可无缝用于midwayjs/web、midwayjs/koa、midwayjs/express、midwayjs/faas。配套测试仓库在 packages/security/test 中为每个策略提供了独立测试csrf.test.ts、csp.test.ts、hsts.test.ts、xframe.test.ts、xss.test.ts等可作为验证行为与排查问题的参考。结语midwayjs/security用一套声明式配置把 Web 安全中最常见的七类防护策略封装成了开箱即用的组件。从 CHANGELOG 可以看到它随 Midway 3.x 稳定演进从最初的安全中间件到 3.1.2 的安全辅助工具再到 3.6.0 的 guard 能力功能不断补全。本文所涉及的所有配置、源码路径与测试均可在仓库的 packages/security 目录下进一步查阅。赞分享后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载相关推荐Midway midwayjs/axios 组件演进与实战从 HTTP 客户端组件诞生到 axios v1 的完整解析Midway midwayjs/axios 组件演进与实战从 HTTP 客户端组件诞生到 axios v1 的完整解析 midwayjs/axios 是后端微服务云原生Midway 认证鉴权实战midwayjs/passport 组件用法、版本演进与源码实现全解析Midway 认证鉴权实战midwayjs/passport 组件用法、版本演进与源码实现全解析 身份验证是绝大多数 Web 应用无法绕开的核心能力。Mid后端微服务云原生Midway 集成阿里云表格存储 Tablestore 组件实战midwayjs/tablestore 的配置、CRUD、搜索索引与演进全解Midway 集成阿里云表格存储 Tablestore 组件实战midwayjs/tablestore 的配置、CRUD、搜索索引与演进全解 导读 mid后端微服务云原生上一篇IRedis与dbcli生态比较pgcli、mycli等数据库交互工具的异同下一篇ComfyUI_TTP_Toolset零基础掌握8K超分辨率图像处理完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表