如何验证Telegram Webhook请求的来源合法性?
Telegram Webhook 来源校验相关问题解答
额外的校验方案
你提到的两种是官方文档里最常被提及的基础方案,还有一个官方原生提供、容易被忽略的可信令牌校验方案:
- 你调用
setWebhook接口配置webhook地址时,可以额外传入secret_token参数,参数值设置为你自己生成的足够复杂的随机字符串。Telegram后续向你的webhook地址发送所有请求时,都会在请求头中携带X-Telegram-Bot-Api-Secret-Token字段,值就是你设置的这个令牌。你收到请求后先校验该请求头的值和你预设的是否一致,不一致直接拒绝即可。这个方案和GitHub webhook的可信令牌机制逻辑完全一致,能完美解决URL泄露后的伪造请求问题。
关于官方未提供RSA签名校验的原因
实际上官方已经提供了上述的令牌校验能力,完全可以满足绝大多数场景的安全需求。没有选择非对称加密签名方案,主要是出于性能层面的考量:Telegram平台的活跃bot数量过亿,每日需要处理的webhook请求量是千亿级的,非对称加密的签名/验签计算开销远高于对称的令牌校验,对服务端和开发者的接入端都会带来不必要的性能负担,投入产出比很低。
仅靠私密URL的安全性评估
如果满足以下条件,仅靠私密URL足以保障普通场景的webhook安全:
- URL的随机部分长度不低于16位,使用大小写字母、数字、特殊符号混合生成,不存在被暴力破解的可能
- 你严格管控该URL的知情范围,仅在调用Telegram接口配置webhook时使用,不会出现在公开日志、代码仓库、对外文档等可能泄露的场景
如果你的bot会处理敏感用户数据、涉及资产相关操作,建议在私密URL的基础上叠加上述secret_token校验,必要时也可以同步Telegram公开的官方IP段做三层校验,Telegram的IP段调整频率极低,且调整前会提前发布公告,只要定期同步就不会出现服务中断的问题。
内容的提问来源于stack exchange,提问作者amirhosein bidar
相关产品推荐
相关产品推荐

