前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9240
  • OpenAI 推出 Ultrafast 模式:GPT-5.6 Sol 速度快 14 倍
  • 有人在法律文书中隐藏提示注入,让 AI 裁定对其有利
  • 本地LLM vs 云端API:决策框架与成本计算器
  • ChatGPT Work和Codex新增Mac活动记忆功能
  • 程序员用编译器把《DOOM》渲染算法直接转成神经网络权重
  • GitOps风格管理AI Agent记忆与工具配置版本
  • Gemini 3.7 Flash 发布:编程能力提升50%降价一半
  • TraceMotive:面向 AI Agent 执行的本地优先调试器
  • AI 生成代码应视为假设:给免费模型答案分配错误预算
  • 依赖距离检测:AI 改动的爆炸半径分析脚本
  • 别盲目合并 AI Patch:Git Worktree Replay Gate 方法论
  • Anthropic研究:AI Agent会争抢地盘并自发合作
  • Claude Code 新会话默认启用 Auto 模式
  • OpenAI 发布 GPT-5.6 三子型号系列
  • Cerebras 刷新 GPT-5.6 推理速度纪录
  • AI Agent生产落地:从Prompt链式调用到基础设施架构
  • AI原生企业构建:从Copilot到自主运营
  • Google Meet 测试版推出 AI 会议笔记功能,Gemini 自动生成纪要
  • Gemini 3.7 Flash 发布: 编程/Agent 能力大幅提升,每百万 Token 0.75 美元
  • 测试套件绕过隔离写入生产数据库的真实事故复盘
  • AI 生成的认证中间件: undefined === undefined 导致认证绕过
  • DeepSeek开源Agent Harness:一切皆插件的Node.js运行时
  • Node.js 多 Provider 代码审查摘要方案:JSON Output 实战对比
  • Hugging Face整合机器人开发工具链
  • Trace 不是 Governance:Agent 系统长期运行的架构边界
  • LangGraph 多 Agent 流水线实战:18 天开发 doc2slides 的工程权衡
  • 自建 LLM 路由:用对模型省 28x 成本
  • 训练数据仅占 0.3%,却占输出 36%:微调模型的数据污染陷阱
  • Gemini 3.7 Flash发布
  • Gemini 3.7 Flash三周内连发
  • Google Sheets Canvas:自然语言构建交互式数据看板
  • CI/CD AI Agent 部署前需加人工审批门
  • MCP + RSS 目录:让 AI 工具获取领域最新信息
  • Agent工具调用200 OK背后的谎言:完成所有权问题
  • Google Sheets Canvas功能详解:打造互动数据看板
  • DeepSeek V4 Pro正式版发布,Agent框架Harness开源,API涨价
  • GPU 数值格式详解:FP32/BF16/FP8/FP4 交互式理解指南
  • 长时 Agent 循环如何设计记忆机制
  • 深度体验DeepSeek Harness:涨价也在情理之中
  • AWS AgentCore:统一监控多云/本地AI Agent
  • DFlash speculative decoding 测评:tokens/s 指标可能误导
  • Claude文本水印技术原理解析
  • 为什么AI demo便宜、上线后成本却翻10倍
  • 用 Bedrock AgentCore Browser Tool 自动化遗留 Web 系统
  • Liquid AI 发布 3B 端侧视觉语言模型
  • AI 编程 Agent 通过测试也可能做出架构错误决策
  • 基于 Bedrock AgentCore 构建 M&A 尽职调查多智能体系统
  • Token降价90%但我的AI账单没降:Jevons悖论在起作用
  • 我的Agent替我做营销:我只负责点批准
  • 文本 AI 水印容易被移除,技术局限性分析
  • ai-prompt-firewall:拦截敏感信息外泄的 Node.js 库
  • 已加载 51 / 9240
8.0
热点
AI SCORE
编程提效2026-08-14 01:40

AI 生成的认证中间件: undefined === undefined 导致认证绕过

dev.to · AI#安全#AI编程#认证
Editor brief · 编辑速览

AI 编码助手中的认证检查代码,当 INTERNAL_API_TOKEN 未设置时,undefined === undefined 为 true,所有匿名请求直接放行,造成认证失效。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

一个使用 === 做校验、但两边都可能是 undefined 的认证检查是 fail-open 的——一个缺失的配置把它从锁定状态变成了开放状态。

.env.example 里缺少的那个 secret,是 internal auth token。部署时没设它,undefined === undefined 就让所有匿名请求通过了。

默认拒绝:校验类型、拒绝空值、用常量时间比较,并写上那个不携带凭证且环境变量未设置的测试。

coding agent 给了我一段 auth middleware。它通过了 review。我差点就 ship 了。

function protect(req, res, next) {
  if (req.headers['x-internal-token'] === process.env.INTERNAL_API_TOKEN) return next();
  return requireAuth()(req, res, next);
}

四行代码,看起来没问题。内部服务带着共享 token 调用,跳过登录流程;其他请求都走到真正的认证。然后我检查了 token 没设置时会发生什么。

这道检查实际上做了什么

INTERNAL_API_TOKEN 是 .env.example 里唯一缺失的那个 secret。其他所有 key 都在——Stripe、Clerk、Paddle——唯独没这个。所以在一次没人想到要去设置它的部署中,process.env.INTERNAL_API_TOKEN 是 undefined。

现在一个正常的浏览器请求进来了。它没有发送 x-internal-token 头,所以 req.headers['x-internal-token'] 也是 undefined。

undefined === undefined → true → return next()。

认证被绕过了。所有到 /checkout 的匿名请求都被当作可信的内部调用。token 设好时端点最安全,token 缺失时完全开放——这恰好是反过来的。一个配错的认证检查应该变得更严格,而不是更松。

而且即使 token 已设置,还有一个更隐蔽的问题:=== 比较 secret 不是常量时间的。它在第一个不匹配的字节就短路了,所以响应时间会逐字符泄漏 token。

const crypto = require('crypto');

function hasInternalToken(req) {
  const expected = process.env.INTERNAL_API_TOKEN;
  if (typeof expected !== 'string' || expected.length === 0) return false; // no token configured → deny
  const provided = req.headers['x-internal-token'];
  if (typeof provided !== 'string' || provided.length === 0) return false;
  const a = Buffer.from(provided), b = Buffer.from(expected);
  if (a.length !== b.length) return false;
  return crypto.timingSafeEqual(a, b);
}

function protect(req, res, next) {
  if (hasInternalToken(req)) return next();
  return requireAuth()(req, res, next);
}

没有配置 token 就不会 bypass。空的或缺失的 header 不会 bypass比较是常量时间的,且先检查了长度(timingSafeEqual 在长度不匹配时会抛错)。然后把 INTERNAL_API_TOKEN 加到 .env.example 里,这样它就永远不会被悄悄遗漏了。

为什么 agents 会这样写

happy path 看起来是对的。token 设好了,调用方发了正确的,x === y 是 true——review 看到一个似是而非的认证检查就过了。模型优化的是"配置好了就能用",而 === 默认是 fail-open 的。它根本不需要去推理未设置的情况,因为未设置的情况不在写代码时所依据的示例里。

人类也会这样——fail-open 的默认行为、用 === 比较 secret、"配置显然总是会设的"。Agents 只是做得更快、ship 得更心安理得。

Fail closed,并证明它

破绽不在代码里。在你没写的测试里。发一个没有凭证且 env var 未设置的请求,然后断言它被拒绝:

delete process.env.INTERNAL_API_TOKEN;
const res = await request(app).post('/checkout').send({ seats: 5 });
expect(res.status).not.toBe(200); // must be 401/302 — not "welcome in"

如果一个未认证请求在没配 token 的情况下拿到 200,你的 auth 就是开放的——happy path 再多绿也不会告诉你。bug 完全存在于测试从未覆盖的那个分支里。

我在习惯里改了什么

Auth 默认拒绝。每一条授予访问权限的分支都从"否"开始。

校验两边——类型是 string,长度 > 0。undefined === undefined 不是认证。

任何 secret 用常量时间比较(crypto.timingSafeEqual),绝不用 ===。

写上那个配置错误的 env 测试——unset token,不发任何东西,断言被拒绝。

代码中读取的每一个 secret 都要放进 .env.example。缺失的一个不是配置缺口;在本案中它就是整把锁。

我是这样发现它的:在我真正的代码上复现——一个匿名请求返回了 200——应用修复,确认它变成了 302,用的是 FetchSandbox。bug 从来不在 happy path 里。它在代码从未需要处理的那些分支里。

这就是每条认证检查都应该从之出发的规则:fail closed。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
测试套件绕过隔离写入生产数据库的真实事故复盘
下一篇
DeepSeek开源Agent Harness:一切皆插件的Node.js运行时