L02 参考解:把工具调用变成受控能力,而非任意函数调用
这是可讨论的参考设计,不是唯一架构。先完成实验题面,再对照本解。
关键推导
能力边界应放在执行动作的层,而不只放在提示词。参考Gateway仅提供两个只读工具;退款服务通过显式方法调用演示审批语义,不自动暴露给模型。这样正常查询不会因模型提出“refund”而获得额外权限。
针对同名订单,正确SQL要包含租户与所有者条件。只检验order_id格式,再SELECT by order_id,是典型的跨租户漏洞。MCP可以帮助标准化工具连接与发现,但不替业务应用决定某个用户能看哪个订单。课程不要求你自己写一个完整OAuth服务器;选修接入时使用成熟库并测错误受众、过期凭据与权限收缩。
参考算法与实现位置
untrusted tool request
→ strict schema
→ allowlisted handler
→ authenticated principal from host
→ object-level authorization
→ domain invariant
→ bounded result + evidence reference
任何一层失败都不能继续执行下一层;对用户返回稳定错误码,对审计保留内部原因并脱敏。可运行实现:Gateway.dispatch、Store.get_order、Store.commit_refund。
应当得到的可检查结果
| 案例 | 结果 |
|---|---|
| Alice查自己的A100 | paid=10000 |
| Bob查自己的A100 | paid=33000,不读到Alice订单 |
| Alice查A111(同租户其他人) | NOT_FOUND |
| 模型添加tenant_id=shop-b | INVALID_ARGUMENTS |
| 参数order_id=true | INVALID_ARGUMENTS |
| 任意未知工具名 | UNKNOWN_TOOL,无代码执行 |
| 未审批直接提交退款 | APPROVAL_REQUIRED,账本仍0 |
怎样判断替代实现是否等价
替代实现必须保留题面中的身份来源、状态归属和失败语义。数据库/框架可以更换,但应把相同故障窗口重新跑一遍。只在正常路径输出一致,不足以证明恢复与授权等价。异步或并发实现还必须解释取消传播、竞争窗口和资源回收。
常见错误与修正
第一类错误是把协议或框架提供的局部保证放大成业务保证:格式正确不等于授权,执行结束不等于业务成功,持久化不等于外部副作用恰好一次。修正方式是找到事实源并把不变量放在拥有该事实的层。
第二类错误是用演示数据替代证据。已有fixture可以检查确定性公式与状态机,但真实模型、网络或容器的结论需要实际运行。报告同时写出“已验证”“仅模拟”“未验证”,比宣称全部完成更有工程价值。
实现范围与限制
参考项目没有实现MCP网络服务器或OAuth。MCP部分是实现任务与验收规格,不是假装已经交付的服务。
开放题评分要点
授权35;Schema/白名单25;错误与信息最小化15;测试15;协议与业务边界解释10。 正确的反例、失败分析和替代方案论证应获得分数;框架堆叠、只报最终成功截图、删除失败成本不应获得同等评价。