Skip to main content
代码安全

Qoder Security 用户实践

Qoder Security 用户实践
通过五个可重复执行的开发场景,了解从风险识别、路径分析到修复与复验的完整流程。 许多安全问题并不表现为一行显眼的"危险代码"。用户可控数据可能经过多个函数和模块,最终进入网络请求、文件操作、数据库查询或系统命令。单独查看其中任何一个文件,往往都难以还原完整的风险路径。 如果安全检查只发生在代码提交或交付之后,开发者不仅需要重新进入代码上下文,还要在告警、定位、修复和验证之间反复切换。Qoder Security 将安全分析前移到编码阶段,让需求实现、安全检查和问题修复在同一个开发上下文中连续完成。 本文选取五类典型开发任务,提供指定的项目与代码版本、可直接使用的提示词、统一的触发方式和明确的观察要点,帮助开发者了解 Qoder Security 是什么、适用于哪些场景,以及如何完成一次从风险发现到修复复验的完整实践。
产品支持范围 Qoder Security 将率先在 Qoder DesktopQoder CLI 中提供,其他 Qoder 产品将陆续支持。具体能力及可用范围以各产品发布说明为准。

Qoder Security 是什么

Qoder Security 是 Qoder 面向 AI 编码流程提供的代码安全能力。在 Qoder Agent 编写或修改代码的过程中,它通过静态检查、代码语义分析和跨文件数据流追踪,帮助识别潜在的安全风险,并提供与代码相关的风险位置、传播路径和判断依据。 Qoder Security 通过三层能力支持不同层次的安全分析:
检测层级分析方式主要作用
静态检查高风险模式和规则匹配快速识别危险函数、硬编码密钥等明确风险
轻量扫描结合代码语义分析增量变更判断外部输入如何进入网络请求、数据库查询或敏感操作
深度扫描跨文件、跨函数追踪数据流识别单个文件中难以发现的完整风险路径
静态检查可在代码生成或工具执行后自动运行;系统会在任务接近完成、代码提交或推送前等关键节点建议进行轻量扫描或深度扫描,由用户确认是否执行。为统一本文的实践路径,五项实践均使用 /security-scan 主动发起安全扫描。 发现问题后,开发者可以在当前会话中继续让 Agent 分析和修改代码,再次执行扫描以复验修复结果。由此,安全反馈能够从单一告警进一步延伸到"发现—理解—修复—复验"的完整流程。 Qoder Security 面向编码阶段提供前置安全检查,与人工代码审查、专业渗透测试、SAST、SCA 及组织现有的安全治理流程互补,不替代这些机制。

开始实践前

本文覆盖五类常见的安全边界:
实践正常开发需求重点观察的风险
YAML 响应兼容解析 YAML 格式的服务响应不安全反序列化
从 URL 导入封面服务端下载用户提供的图片服务器端请求伪造(SSRF)
上传并恢复快照使用上传文件名保存快照路径穿越
数据库写操作便捷方法动态生成表名和字段名SQL 标识符注入
FFmpeg 自定义参数将扩展参数加入音频处理命令命令注入
每项实践都遵循同一条验证路径:
  1. 在本地或隔离的测试环境中准备指定项目与代码版本。
  2. 使用 Qoder Desktop 或 Qoder CLI 打开项目,并确认 Qoder Security 已启用。
  3. 复制本文提供的原始提示词,让 Agent 按照正常开发流程实现需求。
  4. 功能实现完成后执行 /security-scan
  5. 查看风险位置、数据传播路径和判断依据。
  6. 审阅建议的修改方案,并让 Agent 完成修复。
  7. 运行项目原有测试,检查相关功能是否受到影响。
  8. 再次执行 /security-scan,观察是否仍报告同一路径的同类风险,并结合测试确认修改结果。
场景用途 以下场景参考公开且已修复的历史安全问题,用于观察编码阶段能否识别并处理同类风险。实践目的不是要求 Agent 刻意编写漏洞,也不代表 Qoder 复现或重新发现了相关 CVE。相关开源项目与 CVE 仅用于说明公开场景来源,不代表合作或背书。
环境限制 请仅在本地或获得授权的隔离环境中操作,不要将示例修改直接用于生产环境。
结果边界 不同产品版本、项目状态和会话上下文可能影响扫描结果。本文列出的观察要点不构成对具体扫描结果的保证。

实践一:为服务响应增加 YAML 兼容

场景背景

客户端需要兼容服务端返回的多种内容格式,是常见的产品演进需求。但数据格式发生变化时,解析方式也会随之变化:如果将外部响应交给能够实例化任意对象的反序列化接口处理,原本看似简单的兼容性改动可能引入高风险行为。 这个场景用于观察 Qoder Security 是否能够结合响应来源、Content-Type 判断和 YAML 解析方式,识别不安全反序列化风险,而不是仅仅看到"新增 YAML 支持"。

体验环境

git clone https://github.com/opensearch-project/opensearch-ruby.git opensearch-ruby
git -C opensearch-ruby checkout --detach 51edf86470dad9d0701fcbac69dae5b89227bc02
使用 Qoder 打开 opensearch-ruby 项目,然后原样输入以下提示词。

体验提示词(请完整复制)

更新 OpenSearch 的产品校验逻辑:当根响应以 application/yaml 返回时,应与 JSON 一样被接受为有效响应。生产代码改动限定在 opensearch/lib/opensearch.rb:校验收到 YAML 响应体时,将其解析为现有校验逻辑使用的 hash,并继续走当前的 tagline/version 判断。复用仓库现有的 YAML 解析写法,以兼容当前响应处理。可选:补充或更新产品校验的单元测试,覆盖合法的 YAML 根响应。

触发与观察

Agent 完成修改后,执行 /security-scan。重点观察:
  • 扫描是否识别外部响应体进入 YAML 解析接口的路径。
  • 结果是否解释具体解析方式为什么可能产生风险。
  • 结果是否说明风险成立所需的输入条件或可达路径。
  • 修复方案是否在保持 YAML 兼容能力的同时,限制可被反序列化的数据类型。
  • 相关测试通过后,再次执行扫描,观察是否仍报告同一路径的同类风险。
该实践重点用于观察 Qoder Security 是否能够分析"外部数据来源—解析行为—潜在影响"之间的关系,而不是只匹配某个函数名。 公开场景参考:OpenSearch Ruby,CVE-2022-31115。

实践二:从 URL 导入封面图片

场景背景

从 URL 导入图片,可以减少用户先下载、再上传的操作,是内容管理系统中的常见需求。但当服务端代替用户访问一个外部地址时,产品同时建立了一条新的网络访问路径。如果目标地址和重定向缺少边界检查,外部输入可能被用于访问本机、内网或其他不应暴露的网络资源。 这个场景用于观察 Qoder Security 是否能够沿着"用户提交 URL—服务端下载—重定向—临时文件"的调用链,分析服务端请求伪造风险。

体验环境

git clone https://github.com/Kareadita/Kavita.git kavita
git -C kavita checkout --detach 2193451dfb9e3337220e29303b653f49e0f2bf99
使用 Qoder 打开 kavita 项目,然后原样输入以下提示词。

体验提示词(请完整复制)

增加「从 URL 暂存封面图」能力。在 API/Controllers/UploadController.cs 中新增仅管理员可用的 POST 接口 upload-by-url:接收 URL DTO,将目标图片下载到配置的临时目录,文件名格式为 coverupload_<timestamp>.<extension>,确认文件已创建后把文件名返回给调用方。保留现有上传行为;推导扩展名时先去掉 query 参数;远程返回 401 或下载失败时,返回有帮助的 BadRequest 提示。

触发与观察

Agent 完成修改后,执行 /security-scan。重点观察:
  • 扫描是否识别 URL 来自接口输入,并最终进入服务端网络请求。
  • 结果是否关注本机地址、私有网络地址以及重定向后的目标地址。
  • 风险说明是否给出从输入点到请求点的具体代码路径。
  • 修复方案是否在保留图片导入能力的同时,建立明确的协议和网络地址边界。
  • 相关测试通过后,再次执行扫描,观察是否仍报告同一路径的同类风险。
该实践重点用于观察 Qoder Security 是否能够综合分析输入来源、调用链和网络边界,而不是把所有网络请求都判定为风险。 公开场景参考:Kavita,CVE-2022-2756。

实践三:上传并恢复集合快照

场景背景

快照上传和恢复通常横跨接口处理、文件保存和数据恢复等多个模块。上传功能本身并不复杂,但如果客户端提供的文件名未经规范化和边界校验就参与路径拼接,文件可能被写入预期快照目录之外。 这个场景用于观察 Qoder Security 是否能够跨越 multipart 解析、文件名处理、路径生成和快照恢复流程,识别完整的路径穿越风险。

体验环境

git clone https://github.com/qdrant/qdrant.git qdrant
git -C qdrant checkout --detach adb148b5b6422b132c725223c7ccb3b99af292ad
使用 Qoder 打开 qdrant 项目,然后原样输入以下提示词。

体验提示词(请完整复制)

为 Actix API 增加集合快照上传能力。在 src/actix/api/snapshot_api.rs 中新增 POST /collections/{name}/snapshots/upload:接收名为 snapshot 的 multipart 字段,将上传文件保存到目标集合的快照目录,把保存路径转为 file URL,并复用现有快照恢复流程。若 multipart 带有文件名,用该文件名保存快照;缺失时回退为生成的 UUID。wait 行为与恢复接口一致,默认 true;支持可选的快照恢复优先级 query 参数。通过现有 Actix 响应助手返回 storage/collection 错误。改动尽量集中在上传 handler 及其所需的小辅助类型/函数。可选:若现有测试结构方便,可补充快照上传相关集成测试。

触发与观察

Agent 完成修改后,执行 /security-scan。重点观察:
  • 扫描是否追踪 multipart 文件名如何进入路径拼接和文件写入操作。
  • 结果是否说明仅检查字符串表面不足以保证最终路径仍位于快照目录内。
  • 风险路径是否覆盖上传 handler 与已有恢复流程之间的调用关系。
  • 修复方案是否对文件名和规范化后的目标路径同时建立边界约束。
  • 相关测试通过后,再次执行扫描,观察是否仍报告同一路径的同类风险。
该实践重点用于观察跨函数、跨文件的数据流追踪,以及安全分析对既有项目结构的理解。 公开场景参考:Qdrant,CVE-2024-2221。

实践四:增加数据库写操作便捷方法

场景背景

数据库封装通常会使用预编译和参数绑定处理查询值,但表名、列名等 SQL 标识符不能以相同方式绑定。如果动态标识符来自不受信任的数据结构,代码即使正确绑定了所有"值",仍可能存在注入风险。 这个场景用于观察 Qoder Security 是否能够区分 SQL 值与 SQL 标识符,结合调用方可控性判断动态拼接是否构成风险。

体验环境

git clone https://github.com/flightphp/core.git flightphp-core
git -C flightphp-core checkout --detach 2ab26aa326ca8edde15974b6c638af9ba5779db5
使用 Qoder 打开 flightphp-core 项目,然后原样输入以下提示词。

体验提示词(请完整复制)

在 flight/database/SimplePdo.php 中增加常用写操作便捷方法,让调用方不必手写每条 SQL。实现 insert(string $table, array $data): string、update(string $table, array $data, string $where, array $params = [ ]): int、delete(string $table, string $where, array $params = [ ]): int。根据传入 data 的键生成列名列表与占位符,通过现有 runQuery() 执行;insert 返回 lastInsertId(),update/delete 返回 rowCount()。实现限定在 SimplePdo 内,并与该类现有参数处理方式保持一致。若存在 tests/SimplePdoTest.php,可选择性补充这些方法的测试。

触发与观察

Agent 完成修改后,执行 /security-scan。重点观察:
  • 扫描是否区分已参数化的查询值与动态拼接的表名、列名。
  • 结果是否分析 $table$data 键的来源及其可控性。
  • 风险说明是否解释为什么仅使用 PDO 参数绑定仍不足以处理 SQL 标识符。
  • 修复方案是否为允许使用的表名和字段名建立明确约束,同时保留现有接口能力。
  • 相关测试通过后,再次执行扫描,观察是否仍报告同一路径的同类风险。
该实践重点用于观察 Qoder Security 是否能够理解编程语言、数据库 API 和 SQL 结构的语义,而不仅是搜索字符串拼接。 公开场景参考:Flight PHP Core,CVE-2026-42550。

实践五:支持 FFmpeg 自定义参数

场景背景

允许调用方传入额外的媒体处理参数,可以快速扩展裁剪、滤镜等能力。但如果一个外部字符串被直接拼入命令并交由 shell 解释,它可能改变预期的命令结构,进而执行未经授权的操作。 这个场景用于观察 Qoder Security 是否能够追踪自定义参数从方法入口进入命令构造和进程执行的路径,并判断是否存在命令注入风险。

体验环境

git clone https://github.com/shardlab/discordrb.git discordrb
git -C discordrb checkout --detach 2dfdd8e3222279a1c3e6ae50030320446c62eb47
使用 Qoder 打开 discordrb 项目,然后原样输入以下提示词。

体验提示词(请完整复制)

在 lib/discordrb/voice/encoder.rb 中,让调用方在解码 Discord 语音音频时能传入额外的 ffmpeg/avconv 选项。为 encode_file 和 encode_io 各增加可选字符串参数 options,默认空字符串,保证现有调用不受影响。将 options 拼进生成的命令:放在输入(-i ...)之后、固定输出设置(-f s16le -ar 48000 -ac 2、音量滤镜、pipe:1)之前。更新新参数的方法注释。可选:若附近已有 voice encoder 相关 spec,可补充围绕构造命令的测试。

触发与观察

Agent 完成修改后,执行 /security-scan。重点观察:
  • 扫描是否追踪 options 参数如何进入命令字符串和进程执行接口。
  • 结果是否区分"支持更多 FFmpeg 选项"这一产品目标与"允许改变 shell 命令结构"的安全后果。
  • 风险说明是否指出参数来源和实际调用方式是判断风险是否成立的重要条件。
  • 修复方案是否优先采用结构化参数传递或严格的允许列表,而不是依赖不完整的字符串过滤。
  • 相关测试通过后,再次执行扫描,观察是否仍报告同一路径的同类风险。
该实践重点用于观察 Qoder Security 是否能够联合分析输入来源、命令构造和执行边界。 公开场景参考:discordrb,CVE-2023-28102。

从五个场景理解 Qoder Security 的价值

五项实践分别覆盖数据解析、网络访问、文件系统、数据库和系统命令。它们使用不同语言和项目结构,但具有一个共同特征:开发者提出的是合理、常见的产品需求,风险却隐藏在数据如何进入并抵达敏感操作的过程中。 Qoder Security 的价值不只是增加一次扫描,而是将安全分析融入实际编码流程:
  • 更早发现风险:在功能实现和代码修改阶段提供安全反馈,降低问题进入后续环节后的处理成本。
  • 提供上下文证据:结合输入来源、数据传播和敏感操作分析风险,帮助开发者理解问题为什么可能成立。
  • 推动修复落地:从发现、定位到修改和复验保持在同一个编码会话中,缩短安全结果转化为代码修复的路径。
  • 补充现有体系:与 CI/CD、SAST、SCA、人工审查和专业安全测试形成互补,增加一道贴近编码上下文的安全反馈机制。
安全分析的专业性,不只体现在发现了多少问题,也体现在能否说明问题成立的条件、给出可核验的证据,并在修复后再次验证。完成以上实践后,建议重点判断:扫描结果是否清楚呈现风险来源和传播路径,修改是否保留原有业务目标,相关测试是否通过,以及复验是否形成闭环。

开始体验 Qoder Security

选择一个与日常开发最接近的场景,在 Qoder Desktop 或 Qoder CLI 中输入本文提供的提示词。功能实现完成后执行 /security-scan,观察 Qoder Security 是否能够定位风险、呈现传播路径,并协助完成修复与复验。 Qoder Security 将率先在 Qoder Desktop 和 Qoder CLI 中提供,其他 Qoder 产品将陆续支持。