用途:在代码库中集中查找 SQL 注入(SQLi)漏洞。SQLi 指用户输入经字符串拼接或插值进入 SQL 查询而非参数化绑定,可导致查询逻辑被改写、认证绕过、数据泄露或篡改,部分配置下还能执行系统命令。
前置条件:必须已存在 sast/architecture.md,否则需先运行分析类技能。
主要能力与流程:
- 侦察阶段:在代码库中搜索以拼接、插值或格式化动态构造 SQL 的位置,写入 sast/sqli-recon.md。此阶段只标出动态构造点,不判断变量是否来自用户。若发现 0 个构造点,则直接输出“No vulnerabilities found.”到 sast/sqli-results.md 并结束。
- 验证阶段:读取侦察结果,把构造点按每批最多 3 个分批,并行启动子代理做污点分析,追踪插入变量是否来自用户输入,各批写入 sast/sqli-batch-N.md。追踪范围包括直接输入(查询参数、路径参数、请求体、头部、Cookie)、间接输入(经函数返回、参数传递、类属性等派生)与二次注入(数据库读出但原本由用户写入)。服务器端或硬编码值通常不算。
- 合并阶段:把各批报告整合为单一文件。
识别要点:动态 ORDER BY、GROUP BY、表名/列名等标识符无法靠参数化防护,只能用允许列表校验;ORM 的 raw/unsafe 方法(如 objects.raw、$queryRawUnsafe、FromSqlRaw)与字符串插值同样属于风险点。
不视为 SQLi 的情况:IDOR、批量赋值、经数据库触发的 XSS、NoSQL 注入,以及参数化 ORM 查询(如 filter、find、$queryRaw 标签模板)。
安全写法参考:多数语言使用占位符绑定或预处理语句(如 cursor.execute 传元组、db.query 传数组、PreparedStatement、PDO 命名参数、SqlCommand 参数),并配合允许列表处理动态标识符。
限制:资料未提供安装命令、价格、支持语言清单之外的平台或性能数据;检测结果依赖代码库结构与架构摘要的准确性。