当 Codex 或其他 AI Agent 可以自动创建分类、上传图片并发布文章时,真正需要优先解决的不是“接口能不能调用”,而是“接口被误用或密钥泄露后,损失能否被限制”。一个安全的 MCP 发布链路,应当把模型能力约束在少量明确工具内,再由服务端完成身份验证、字段校验、数据库写入和对象存储处理。
为什么不能让 AI Agent 直接连接数据库
数据库账号通常具备远超“发布一篇文章”所需的权限。一旦把连接字符串、管理员账号或通用 SQL 能力交给自动化 Agent,提示词注入、错误指令和第三方内容污染都可能演变为批量修改或删除数据。更稳妥的方式是只暴露 list_taxonomy、ensure_taxonomy、publish_article 等受控工具,每个工具仅接受固定字段,并在 PHP 服务端执行白名单操作。
HMAC签名如何验证请求没有被篡改
客户端先把时间戳、随机 Nonce 与原始 JSON 请求体按固定顺序拼接,再使用共享密钥计算 HMAC-SHA256。服务端使用相同规则重新计算签名,并采用恒定时间比较函数验证结果。只要请求体中的标题、正文或分类被中间节点修改,服务端计算出的签名就会不同。
signature = HMAC_SHA256(timestamp + "\n" + nonce + "\n" + rawBody, publishToken)
签名必须覆盖原始请求体,而不是解析后重新序列化的对象,否则字段顺序或字符转义差异可能造成验签失败。生产环境还必须使用 HTTPS,HMAC 不能替代传输层加密。
时间戳与Nonce怎样阻止重放攻击
攻击者即使截获了一次合法请求,也不应能够反复提交。服务端可以只接受五分钟内的时间戳,并将近期使用过的 Nonce 写入短期缓存;相同 Nonce 再次出现时立即拒绝。服务器和发布电脑的时间必须同步,否则合法请求也会被判定为过期。
- 限制请求最大允许时间差,例如 300 秒。
- Nonce 使用安全随机数生成,不能用递增 ID。
- Nonce 缓存时间至少覆盖请求有效期。
- 签名错误、过期和重复 Nonce 分别记录审计日志。
最小权限还需要哪些服务端限制
安全控制不能只依赖一个 Token。接口还应限制请求体大小、图片大小、每分钟调用次数和允许的图片类型;有固定出口地址时,可增加 IP 白名单。图片下载必须拒绝内网地址和重定向到内网的请求,避免 SSRF。分类和标签要经过长度限制与去重,正文应防止危险脚本进入前台模板。
密钥和OSS凭据应该放在哪里
发布 Token 只保存在服务器配置中,提示词、文章正文、调度日志和 Git 仓库都不应出现真实值。阿里云 OSS 使用独立 RAM 子账号,仅授予目标 Bucket 所需的上传和删除权限。MCP 客户端只负责提交图片,最终上传动作由 PHP 完成,这样 Codex 无需接触 AccessKey Secret。
上线前的安全检查清单
- 确认 MCP 只暴露必要工具,没有通用 SQL 或任意文件读取。
- 确认 HTTPS、证书校验、HMAC、时间戳和 Nonce 全部启用。
- 确认同标题重复发布会返回冲突,而不是创建第二条记录。
- 确认图片类型、大小、本地目录和远程地址均有白名单。
- 确认失败日志不记录 Token、签名原文和 OSS Secret。
- 使用草稿文章完成一次端到端测试,再开放定时发布。
总结
MCP 的价值不是让 AI 获得无限权限,而是把能力封装成可以验证、审计和限制的工具。采用签名请求、防重放、最小权限、图片校验与失败停止策略后,自动发布才能从一次性演示变成可长期运行的生产流程。
评论 0