如何验证post-receive hook请求实际来自github?

Xeo*_*oss 15 authentication github webhooks

Github提供了一种让URL知道何时使用webhook更新项目的方法.

如何验证发送到我服务器的post-receive hook的帖子实际上来自github?

我应该检查发件人的IP地址,还是可以在某处发送身份验证?我想确保有人不会试图欺骗假装来自github的请求.

一种选择是通过PubSubHubbub设置钩子并使用该hub.secret选项创建帖子体的SHA1 HMAC签名.但是,这需要我的服务器设置请求,而不是等待用户在他们想要的时候设置后接收回调到我的网站.我宁愿让用户将我提供的URL粘贴到帖子网址中.

jes*_*sal 10

您可以ping GitHub的Meta API以获取传入服务挂钩将来自的IP地址数组(以CIDR表示法),并根据请求的IP交叉检查它们:

https://api.github.com/meta


Roc*_*och 8

您可以尝试检查Github的请求后IP:207.97.227.253,50.57.1​​28.197,108.171.174.178

  • 这听起来很脆弱.如果github更改了这些IP地址,则必须更新列表.也许您可以执行反向DNS查找并确保生成的域名以"github.com"结尾. (6认同)
  • 根据Github的说法,实际地址是207.97.227.253,50.57.1​​28.197,108.171.174.178. (2认同)

Row*_*wan 8

看看GitHub关于这个主题的文档:他们建议使用HTTPS和基本身份验证.

具体来说,请使用以下格式设置Payload URL:

https://开头yourUser:yourPass@yoursite.net/path

如果您有多个用户,则需要为每个用户分配不同的用户名和密码.假设他们将该密码保密,您可以相信一个身份验证请求确实来自GitHub和该帐户.

另见:https://github.com/blog/237-basic-auth-post-receives


Xeo*_*oss 5

除了@ mnml的答案之外,第二步可能是调用API并验证给定的信息是否与项目的上次已知提交相匹配.这与OpenID用于验证传递的数据是否有效的过程相同.

所以,首先我可以通过检查IP来打败愚蠢的回复攻击.接下来我可以问github我收到的信息是否正确.

GET /repos/:user/:repo/commits/:sha
Run Code Online (Sandbox Code Playgroud)

  • **这不安全** - 每个人都可以通过创建拉取请求向您的仓库添加提交.请参见:https://api.github.com/repos/github/gitignore/git/commits/85be394529d93cb7f29cd758599e7d103dc002f8.部分(未合并!)拉取请求:https://github.com/github/gitignore/pull/542. (5认同)