导语:MCP把内容生产工具和网站接口连接起来后,发布动作就不应该只依赖一个简单的URL。接口至少要能确认请求来自可信客户端、请求没有被重放、内容字段符合限制,并且调用者只能执行被允许的操作。

为什么发布接口不能只靠一个Token
固定Token只能证明“调用者知道某个秘密”,但不能证明请求是刚刚生成的。如果请求被日志、代理或调试信息泄露,攻击者可能重复提交同一个发布请求。因此,Token应该作为HMAC密钥,而不是直接作为URL参数或正文内容传输。
签名材料应包含时间戳、随机Nonce和完整请求体。服务端用同样的规则计算签名,再使用安全比较函数校验结果。
HMAC签名应该覆盖哪些内容
一种简单且容易落地的格式是:timestamp + "\n" + nonce + "\n" + raw_json。这里的raw_json必须是客户端实际发送的字节内容,不能先解析成数组再用另一种格式重新编码,否则同样字段可能因为空格、顺序或转义不同而签名不一致。
$message = $timestamp . "\n" . $nonce . "\n" . $rawJson;
$signature = hash_hmac('sha256', $message, $secret);
时间戳和Nonce如何防止重放
服务端应限制请求时间窗口,例如只接受前后几分钟内的请求。Nonce需要满足长度和字符集校验,并在缓存中保存一段时间;同一个Nonce再次出现时直接拒绝。时间窗口解决“过期请求”,Nonce解决“窗口内重复请求”。
- 时间戳不应完全相信客户端时钟,服务器要做绝对时间差判断;
- Nonce不能使用简单递增数字;
- 缓存失败时不要悄悄放行重复请求。
请求体和发布权限也要校验
签名通过不代表内容可以直接入库。服务端还要限制请求体大小、标题长度、HTML长度和图片类型,并拒绝可执行文件。发布接口最好只允许必要字段,分类和标签通过数据库解析,不接受任意SQL或模板字段。
如果网站环境固定,可以再配置允许IP;如果调用端IP经常变化,就应该把重点放在签名、Nonce、限流和日志审计上。
图片上传和OSS要分开处理
图片应先经过类型、大小和真实图片内容检查,再由PHP转存阿里云OSS。文章里保存最终OSS公网地址,避免把本地临时路径、AccessKey或Token写进正文。封面图和正文图都要在发布后检查可访问性。
总结
一个可用的MCP发布接口,至少需要HMAC签名、时间戳、Nonce、请求体限制、权限隔离、限流和审计日志。安全控制要放在PHP服务端,不能只依赖Codex或客户端自己“按约定发送”。
评论 0