二者在结构上高度相似——都是把"可信的指令/代码"与"不可信的数据"混在同一条通道中处理,系统未能将二者分离,导致数据被当作指令执行。SQL 注入把数据拼进 SQL 语句使其被当作代码执行;提示词注入把数据拼进提示词使其被当作指令执行。
SQL 注入之所以相对可控,是因为数据库不"推理"——通过参数化查询(prepared statement)严格分离代码与数据,即可从根本上消除注入。而大语言模型的设计目标恰恰是"理解并遵循自然语言指令",指令与数据在模型内部没有天然边界,只有 next-token prediction。因此 SQL 注入那套"参数化查询式"的根除方案在 LLM 上并不成立。
正因为无法像 SQL 那样彻底分离,提示词注入的防御不能寄望于单一"补丁",而必须依靠分层缓解(约束模型行为、输入输出过滤、最小权限、人工介入等)来降低风险,而非根除。这也是英国 NCSC 将其称为"本质上的混淆代理(confusable deputy)"利用问题的原因。