如果 Webhook 地址已经泄露,最彻底的止血方式是移除旧机器人并重新创建获取新地址;若未泄露,应优先开启加签和 IP 白名单功能。
先说结论:地址泄露无法通过配置修复,必须重置;未泄露时可通过多重验证机制加固。
- 先判断:确认地址是否已公开或在代码库中硬编码
- 优先做:开启加签验证并配置服务器 IP 白名单
- 再验证:使用 curl 或代码发送测试消息确认拦截效果
快速处理思路
Webhook 地址本质上是一个公开接口,一旦泄露,任何持有该地址的人都能发送请求。如果怀疑地址已泄露,不要试图通过修改配置来“修补”,直接删除旧机器人并创建新的是唯一可靠方案。对于未泄露的地址,需要在钉钉群机器人设置中启用安全加固选项。
为什么会这样
钉钉自定义机器人的 Webhook 地址默认仅依靠 URL 本身的随机性作为凭证。如果该 URL 被提交到公共代码仓库、日志文件或被中间人截获,攻击者即可利用该地址调用接口发送消息。钉钉提供的安全设置(加签、IP 白名单、关键词)是为了增加调用门槛,但如果 URL 本身已不可信,这些设置无法阻止持有者利用合法配置发送垃圾消息。
分步处理
1. 检查泄露情况:搜索代码仓库、日志系统,确认 Webhook URL 是否已暴露。如果已暴露,进入钉钉群机器人管理页面,移除旧机器人,创建新机器人获取新 URL。
2. 启用加签(Secret):在机器人设置中选择“加签”安全设置,复制 Secret。发送请求时,需使用 HMAC-SHA256 算法计算签名,并将 timestamp 和 sign 拼接到 URL 参数中。
3. 配置 IP 白名单:在机器人设置中选择"IP 白名单",填入发送消息的服务器公网 IP。注意多服务器环境需填入所有出口 IP。
4. 更新调用代码:根据新的安全设置修改发送请求的代码逻辑,确保签名计算正确且来源 IP 符合白名单。
怎么验证是否生效
1. 正常发送测试:使用配置好签名和白名单的服务器发送一条测试消息,确认能正常收到。
2. 异常拦截测试:尝试从不在白名单的 IP 发送请求,或使用错误的签名参数,观察钉钉群内是否收到消息。若未收到且接口返回错误码,说明拦截生效。
3. 查看返回状态:检查 HTTP 响应状态码,非法请求通常会返回 403 或特定的错误信息。
常见坑
1. 签名计算错误:timestamp 需为毫秒级时间戳,签名字符串拼接顺序和 URL 编码方式需严格符合文档要求,否则会导致签名验证失败。
2. 动态 IP 问题:如果服务器使用 NAT 或云函数,出口 IP 可能不固定,配置白名单时需确认 IP 稳定性,否则会导致合法请求被拦截。
3. 关键词限制:若同时开启关键词过滤,消息内容必须包含设定关键词,否则即使签名和 IP 正确也会发送失败。
参考来源
- 钉钉开放平台 - 自定义机器人接入:https://open.dingtalk.com/document/robots/custom-robot-access