协议连接不是授权
发现一个工具并不意味着当前用户有权执行它。MCP 连接层和业务服务仍需分别验证身份、资源归属与操作范围。用户 ID 应来自服务端会话,不能使用模型提供的 userId 覆盖会话身份。
工具返回的数据也可能包含恶意指令。将工具结果交给模型时,应保留来源并标记为数据;实际写操作仍由程序校验。提示词可以指导模型,但不能代替数据库的所有权条件。
可运行的业务授权示例
import assert from "node:assert/strict";
function authorize(session, resource, operation) {
if (!session || !session.scopes.includes(operation)) return false;
return resource.ownerId === session.userId;
}
const user={userId:"alice",scopes:["notes:read"]};
assert.equal(authorize(user,{ownerId:"alice"},"notes:read"),true);
assert.equal(authorize(user,{ownerId:"bob"},"notes:read"),false);
assert.equal(authorize(user,{ownerId:"alice"},"notes:write"),false);请求生命周期
接收请求后先校验结构与大小,再确认会话权限,再查资源归属,最后执行动作。写入需要幂等键与事务;失败不能返回成功。对外部 URL 访问,应另设目的地范围和重定向校验,避免将网关变成任意地址代理。
审计记录可以保存工具名称、结果状态和追踪 ID,不应默认保存密码、访问令牌或完整私人正文。OAuth 场景中需要核对令牌受众和权限范围,不应将收到的令牌未经验证地透传给其他服务。
原始资料
- MCP Security Best Practices:协议相关安全边界。示例是业务授权逻辑,不是 MCP 服务端实现。
感谢阅读本文
如果你觉得内容有帮助,欢迎点赞支持或分享给同行开发者。
579 次阅读65 人赞过