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

时间:2012-01-25 17:18:09

标签: authentication github webhooks

Github offers a way让URL知道何时使用webhooks更新项目。

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

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

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

5 个答案:

答案 0 :(得分:10)

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

https://api.github.com/meta

答案 1 :(得分:8)

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

答案 2 :(得分:8)

看看GitHub's docs on the subject:他们建议使用HTTPS和基本身份验证。

具体而言,请使用以下格式设置有效负载网址:

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

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

另请参阅:https://github.com/blog/237-basic-auth-post-receives

答案 3 :(得分:5)

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

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

GET /repos/:user/:repo/commits/:sha

答案 4 :(得分:2)

您可以在难以猜测的网址上找到您的webhook。说:

https://my-host.com/webhooks/E36006BE2C4BABDEEF307C77E34F415B/my-hook

(这是128位随机数据​​ - 增加到任何尺寸感觉舒服)。假设您可以信任github以保证此网址的安全,那么很可能是客户端可以信任该网址。

如果网址遭到破坏,只需生成新的随机网址并更新您的网络服务器就很简单。

请确保您使用的是良好的熵源......