[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fkcM4gpFwvChGP0WQxoJP8EIdPc_V6WU3w7r4m4e13UI":3},{"item":4,"related":51},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":43,"seoDescription":44,"canonicalUrl":45,"isFeatured":46,"sno":47,"sortOrder":48,"publishedAt":49,"updatedAt":50,"createdAt":50},"84760e5d-6772-443a-be64-dce3b1420989","article","污点分析：一滴输入如何穿过整个程序","taint-tracking-ai-code-security","用 source、sink 和 sanitizer 解释污点追踪，理解静态分析如何检查用户输入是否流向危险操作。","## 污点分析：一滴输入如何穿过整个程序\n\n安全工具经常使用一个很形象的概念：污点。用户输入、请求参数、环境变量或外部文件，都可以被标记成“可能不可信”。如果这份数据一路流入 SQL 执行、命令执行、文件路径或 HTML 输出等危险位置，工具就会发出提醒。这个过程叫 taint tracking，中文常译为污点追踪或污点分析。\n\n## 三个角色：source、sink 和 sanitizer\n\nSource 是污点的来源，比如 HTTP 参数。Sink 是需要特别谨慎的终点，比如拼接 SQL 的函数。Sanitizer 是清洗或验证步骤，例如参数化查询、路径规范化和输出转义。安全分析要判断的不是“输入有没有出现过”，而是它是否在抵达危险点前经过了足够可靠的处理。\n\n重要的是，数据不一定以原样传播。一个字符串可能被放进对象，再从对象属性取出；也可能经过函数调用、数组拼接和格式转换。优秀的分析器会构建数据流图，尽量跟踪这些传播关系，同时承认某些动态行为无法被静态准确预测。\n\n## 它为什么适合检查 AI 生成代码\n\nAI 很容易生成“看起来合理”的输入处理代码。它可能知道要做校验，却把校验放在了错误位置；也可能只检查了前端，后端仍然把未验证数据交给危险函数。污点分析提供了一条比“模型说已经安全”更机械的检查路径：从输入出发，看是否存在未经过防护的危险流向。\n\n这不是说工具会自动发现所有漏洞。分析器需要知道哪些函数是来源、终点和清洗器；自定义框架、反射、模板和代码生成可能造成漏报。它也可能报告需要人工确认的误报。\n\n## 一个实用的协作方法\n\n让 AI 新增上传、搜索、导出或管理功能时，要求它同时列出所有外部输入和最终使用位置。再用静态分析或安全规则验证这些路径。这样，模型负责解释意图，污点分析负责检查数据是否越过了不该越过的边界。\n\nCodeQL 对 JavaScript 和 TypeScript 的数据流与污点追踪有清晰示例，可阅读[官方指南](https:\u002F\u002Fcodeql.github.com\u002Fdocs\u002Fcodeql-language-guides\u002Fanalyzing-data-flow-in-javascript-and-typescript\u002F)。","\u002Fuploads\u002F2026-09-14\u002Fa4b1ff0a-5dcf-4be5-8582-cd35437a874d.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"0848beb4-db26-4fb8-b391-f852a11be192","AI编程","ai-coding",{"id":28,"name":29,"slug":30},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":32,"name":33,"slug":34},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":36,"name":37,"slug":38},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse","官方资料","CodeQL","https:\u002F\u002Fcodeql.github.com\u002Fdocs\u002Fcodeql-language-guides\u002Fanalyzing-data-flow-in-javascript-and-typescript\u002F","published","污点分析是什么？AI 生成代码如何追踪危险输入","理解污点追踪、数据流、source、sink 和 sanitizer，掌握 AI 代码安全检查的基本思路。",null,false,57,0,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:33.969Z",[52,61,69],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":59,"createdAt":60},"7cc644a5-e0de-4d7b-802e-9e8b69677e12","AI 生成的代码会不会复制开源项目","ai-code-open-source-reference-license","AI 生成代码不等于天然没有来源。本文区分常见写法与高相似片段，解释代码引用、许可证、依赖供应链和轻量来源检查，帮助团队把合规当成代码质量的一部分。","\u002Fuploads\u002F2026-09-13\u002F920327ad-de7f-4caa-a2f4-816d467c9f9c.jpg",40,"2026-09-13T00:00:00.000Z","2026-09-13T11:55:49.911Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"coverUrl":66,"authorName":14,"sno":67,"publishedAt":59,"createdAt":68},"1ff2b0c1-c125-4469-a09c-b8ddbc5bf705","AI 写 SQL 和数据库迁移，为什么必须人工确认","ai-generated-sql-database-migrations","数据库迁移会改变持久数据、锁和应用契约，语法正确不代表上线安全。本文解释 AI 生成 SQL 的风险，介绍扩展、迁移、收缩的兼容策略，以及生产执行前应检查的门槛。","\u002Fuploads\u002F2026-09-13\u002F6e5177d7-f51a-4722-951b-0108e9b7ecae.jpg",41,"2026-09-13T11:55:59.196Z",{"id":70,"type":6,"title":71,"slug":72,"summary":73,"coverUrl":74,"authorName":14,"sno":75,"publishedAt":49,"createdAt":76},"2d59f625-ead9-4cfd-b944-3d56bd9ea19a","AST：AI 为什么不只是在“读代码文本”？","ast-ai-code-understanding","AST 把源代码从一串文本变成一棵结构树，帮助编辑器、静态分析器和 AI 编程工具理解函数、变量、调用与分支之间的关系。","\u002Fuploads\u002F2026-09-14\u002F529ce69d-c781-4f61-9864-0294ae857718.jpg",42,"2026-09-14T15:01:25.949Z"]