Vibe Coding 注入防线:分别验证 SQL、XSS 与命令解释器边界
“已做输入校验”无法同时防住三种不同解释器。本文分别固定 SQL 参数/标识符、HTML 输出上下文与进程参数边界,再用结构化 canary 和安全变异证明输入始终只是数据。
本文要点
- 主题聚焦:AI、Vibe Coding、TypeScript
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
让 AI “过滤特殊字符防注入”会把三个问题混成一个:SQL 数据值可能改变查询结构,用户文本可能进入 HTML/属性/URL/脚本等不同输出上下文,进程参数可能被 shell 或目标程序重新解释。不存在一条通用正则能同时正确处理这些语法;黑名单也会漏掉编码、组合字符和新语法。
OWASP Top 10 实战给出应用安全全景。本篇只审查三类解释器边界,目标不是收集攻击字符串,而是证明不可信输入到达解释器时仍被表示为数据。
SQL:数据值参数化,结构选项白名单
查询中的普通值使用数据库驱动或 ORM 的参数绑定,不能先转义再拼接。测试应在真实驱动上捕获执行模板与绑定参数,确认 canary 值没有进入 SQL 结构,并断言只返回本应匹配的行。ORM 的便捷方法通常会参数化值,但 raw query、排序、列名、表名和片段 API 需要逐一审查,不能从“项目用了 ORM”推导全库安全。
标识符通常不能当普通值绑定。排序字段、方向、报表列等动态结构应从外部枚举映射到代码内固定片段;未知值拒绝。动态筛选可由 AST/查询构建器生成,限制操作符、深度和字段,而不是把用户字符串作为 WHERE。数据库账号采用最小权限,降低缺陷影响,但权限不是参数化的替代品。
负向用例包括引号、注释符号、Unicode 与极长输入等无害 canary,检查结果集、不应发生的写入和错误信息。临时把一个参数绑定改成字符串插值,目标测试必须失败;若只断言“接口没有 500”,它无法证明查询语义未被改变。Vibe Coding 测试预言审查可帮助从业务不变量建立 expected,而不是复制实现。
XSS:按最终输出上下文处理
同一段用户文本放在 HTML 文本、属性、URL、CSS 或 JavaScript 中,需要不同规则。模板和 React 等框架的默认转义只覆盖其正常数据绑定路径;原始 HTML API、富文本渲染、服务端模板拼接、第三方组件和客户端 DOM 写入会重新打开边界。不要为了“修复乱码”全局关闭转义。
普通文本坚持框架安全绑定。确需富文本时,在明确入口使用维护中的 sanitizer 和最小 allowlist,固定 URL scheme、属性与嵌入规则;保存原文和安全派生物时记录 sanitizer 版本,策略升级后可重建。CSP 是减少利用面的纵深控制,不是允许未编码输出的许可证。
测试在真实渲染器或浏览器中放入结构化标记 canary,断言它以文本出现或被策略删除,DOM 中没有事件属性、危险 scheme、意外节点和脚本执行信号。存储型路径要让一个用户写入、另一个用户查看,覆盖列表、通知、导出和管理后台,不能只测提交接口。Vibe Coding 集成测试边界可避免把真正的模板/DOM 层全部 mock 掉。
命令:优先不启动 shell
能用语言库完成文件、压缩、HTTP 或 Git 操作时,不调用外部命令。确需启动进程,使用参数数组和固定 executable,关闭 shell,设置固定 cwd、最小环境、超时、输出上限和低权限身份。参数数组能阻止 shell 元字符被 shell 解释,却不能阻止目标程序把以 - 开头的输入当选项;使用工具支持的 -- 分隔、固定选项映射或 stdin,并限制路径和资源规模。
禁止用户控制 executable、整段参数、环境变量、配置搜索路径或工作目录。日志记录命令 ID 和安全参数摘要,不回显秘密。负向测试用带空格、前导连字符、换行和超长值的临时文件名,执行无副作用的测试程序,断言 argv 边界、cwd、env 与退出类别;不需要运行破坏性 payload 才能证明隔离。
用审查表连接三条边界
从Vibe Coding OpenAPI 契约优先集成取得字段类型和长度,但 schema 校验只证明形状,不能替代 sink-specific 防护。代码审查为每个外部输入标出最终 sink:数据库值/结构、HTML 上下文或进程 executable/argv。一个值若经过存储后在另一处被解释,要同时审读写两端。
最后运行安全变异:对 SQL 去掉绑定、对模板改用原始 HTML、对进程打开 shell,确认各自测试独立失败。Vibe Coding 的 AI 生成测试审查可阻止模型在失败后把 canary 或断言一起放宽。验收证据记录真实 sink、采用的结构化 API、拒绝案例与变异结果;扫描器告警只是线索。
注入防线的共同原则是数据与指令分离,但落地必须尊重每个解释器的语法。让 AI 先枚举 sink,再按 SQL、浏览器和进程边界分别生成实现与反例,才能避免一句“已过滤输入”掩盖三种完全不同的执行风险。
Related