用途:当前端仓库自身持有服务端 BFF/API 代理代码(如 Next.js API Routes / Route Handlers、Remix 等)时,用于发布前安全审查或问题整改。核心观点是:前端自有服务端路由同样构成信任边界,危险的形态是“薄中继”——允许浏览器选择目标、方法、请求头或业务动作,并假设上游会拒绝意外请求。应把每个代理路由视为一项小型能力,而不是透明隧道。
与相邻技能的边界:浏览器 XSS、CSP、令牌存储、Cookie、CSRF、重定向和客户端打包密钥使用 frontend-security-baseline;登录/注册/回调/passkey 等 UI 行为使用 frontend-auth-flow-contracts;浏览器内拖放、选择器、粘贴、accept/file.type 与预览 URL 生命周期使用 file-ingest-contracts;本技能负责构建或转发上游 HTTP 请求的前端自有服务端路由,包括上传或 WebView 专用网关端点。本技能不替代上游对象授权、持久化重放/幂等、业务价值权威计量(耗时、额度、用量)或完整后端威胁模型。
默认流程:先清点全部入口,包括普通请求、multipart 上传、流式、回调、WebSocket/SSE、admin/工具、带版本等能触达同一上游操作的端点;仅对 /api/request 设策略,而 /api/upload 仍能触达同一动作时策略无效。改代码前先写能力矩阵,为每个入口记录客户端选择器、服务端自有目标、允许的方法、认证/角色要求、Cookie 认证路由的 CSRF/来源策略、可接受的查询/体/文件形态、转发的请求头、重定向行为、响应处理、超时与大小/速率预算。优先使用服务端自有路由,让客户端选择语义化路由名或必须匹配锚定正向白名单的规范相对路径;目标可预知时不要接受完整 URL。只解析一次并比较精确组件,pin 住 scheme、origin、port、pathname;查询参数与路由选择器分离;不得只用黑名单或正则作为任意 URL 的唯一防御。策略绑定能力而非传输方式,方法、认证、角色、体和响应规则须适用于所有可调用该操作的入口;上传端点只应暴露上传能力。解析前限制 multipart 与流式工作,设定最大文件数、单文件与总量、字段数、总字段字节和请求超时;保留或重新生成正确的 multipart 边界,并在成功、解析错误、中止和上游失败时清理临时文件。最小化转发:使用小型请求头白名单,默认不转发浏览器 Cookie、Authorization、hop-by-hop 头或上游调试元数据;服务端凭据与角色声明必须覆盖而非合并客户端值。失败时关闭且不泄露内部信息:禁用重定向或逐跳校验,返回稳定公开错误,记录关联键加方法、规范路由与状态,不记录凭据、原始体或上游堆栈。把网关缓解与权威业务控制分离:单请求数值上限只能拦截单个超大载荷,无法阻止大量有效请求重放;持久化状态、幂等、计量业务价值检查、配额与分布式速率限制应放在所有实例和入口共享权威之处。
发布前预防门:在外部评估前使用,而非等发现后。从查询、路由参数、请求头、Cookie、JSON/表单体、multipart 元数据追踪到 fetch、Axios、代理中间件、SDK 客户端、重定向或服务端文件传输等出站汇聚点。为每个受保护业务动作查找普通、上传、流式、回调、遗留、带版本、admin/工具与 WebView 路径等兄弟入口;一个受保护的传输不能保护另一个。存在以下情况应阻止发布:请求可选择完整目标、未知同源路径、不支持的方法、可绕过校验或覆盖服务端注入凭据的客户端认证/身份头、无界体/文件形态、验证目标外的重定向跳转,或 Cookie 认证的变更路由缺少 CSRF/来源证据。运行负向证明而非仅源码审查:构造畸形与替代选择器,验证在解析器/出站调用前即被拒绝,用本地带外监听器验证 SSRF,比较禁止变更前后的受保护状态。运行正向兼容证明:跑通每个合法路由族,包括用户文本进入路径时的 Unicode 或空白路径段,确认 multipart 重构使用生成的边界。明确残余责任归属:code-local(本前端自有服务端边界可决定并执行)、upstream(权威归属、计量用量、重放/幂等、共享配额或分布式并发须在共享持久状态处执行)、operational(凭据轮换、历史日志调查、会话/令牌迁移与生产出站策略需部署权限)。不要过度声称完成:请求大小或单请求价值上限只能关闭已公布的载荷,重复有效请求仍可能滥用业务流程;代码修复也不等于证明已轮换暴露凭据或过去未被滥用,这些应标记为发布后续项而非降低门槛。
典型陷阱包括:fetch(base + req.query.url) 或以客户端 URL 调 Axios 会把 BFF 变成 SSRF 原语;认为通用同源路径安全会暴露意外的特权业务动作并绕过逐路由策略;安全中间件只跑在 JSON/表单路由上,multipart、流式、遗留或替代版本端点可绕过规则;上传路由只检查文件大小,可能仍存在文件数、总字节、解析清理或边界重构失败;转发全部请求头会让浏览器可控的认证、Cookie、转发元数据与 hop-by-hop 头跨越信任边界;集群/无服务器部署中加进程内速率限制可被实例选择或重启绕过;回显 error.message 或记录整个 Axios 配置会泄露上游内部、凭据、Cookie 与注入体数据。
快速探针(示例命令,仅供参考,需确认源到汇聚点及每个替代入口): rg -n "req\.(query|body).(url|uri|target|endpoint|cmd)|SERVER_URL.\+|baseURL.\+" src app pages server rg -n "\[\.\.\.|/api/(proxy|request|upload)|multipart|formidable|multer|FormData|WebSocket|EventSource" . rg -n "req\.headers|headers:\sreq\.headers|Authorization|Cookie|maxRedirects|redirect:|error\.message|axiosRequestConfig" src app pages server rg -n "new Map\(|rateLimit|rateLimiter|setInterval|LRU|memoryStore|cluster|serverless" src app pages server
验证阶梯:纯策略测试(已知良好路由/方法对、未知路径、前后缀相似、大小写变体、重复斜杠、点段、编码分隔符、反斜杠、userinfo、fragment、数组与缺失值);处理器测试(确认拒绝先于解析器/上游调用,每个合法能力到达下一预期门);multipart 测试(断言字段/文件预算,出站 Content-Type 使用重新生成的边界而非浏览器原始边界);带外 SSRF 测试(本地监听器验证恶意选择器不产生连接,仅状态码不够);状态不变测试(查询状态、经每个入口尝试禁止变更、再查询比较);重放/并发测试(业务动作授予价值时发送大量单独有效请求;若 BFF 无法权威判定则记为上游/运维后续)。
PR 门槛:同时满足才提交发现或补丁——前端自有服务端路由构建或转发上游请求;客户端可控数据选择或实质性改变目标、方法、认证、请求头、体/文件形态或业务动作;相关规则缺失、fail-open 或跨入口不一致;修复有界(命名路由/能力表、严格白名单、单一共享策略接缝、multipart 预算、请求头最小化、重定向/错误加固或覆盖边界的回归测试)。拒绝弱发现:锚定正向白名单匹配的规范相对路径不等同于正则校验任意 URL;已配置的上游 base URL 本身不受客户端控制;当客户端不能影响 scheme、host、port 且重定向已禁用时,不应要求请求时私有 IP 解析,DNS/出站控制属纵深防御;上游已强制持久配额时,缺少网关速率限制不自动是代码缺陷;无证据表明路由增长或反复漂移时,不要用策略框架替代小型能力白名单。
输出形态:入口/能力(哪个面向浏览器的服务端路由触达哪个上游动作);信任破坏(确切的客户端可控选择器/头/体/文件与缺失规则);跨入口检查(可调用该动作的普通/上传/流式/带版本路径);最小修复(命名路由、锚定路由-方法-认证策略、边界/预算或脱敏错误变更);验证(策略测试、转发前处理器测试、带外连接计数与状态不变);残余责任(code-local、上游/共享基础设施或运维凭据/日志后续);发布结论(PASS、BLOCK 或 PASS 并附明确的上游/运维后续,绝不把未解决的权限或凭据工作折叠为笼统的“已修复”)。
不编造内容:本技能未提供具体收费、价格、平台要求或效果承诺信息。
参考来源包括 OWASP SSRF 预防速查表、OWASP REST 安全速查表、OWASP 授权速查表、OWASP 文件上传速查表、OWASP API6:2023、Next.js BFF 指南、Backstage 代理路由配置、Next.js 严格远程 URL 模式、Grafana 代理路由与请求安全文档。