Как проверить, что запрос на крючок после получения действительно пришел из github?

Github предлагает путь чтобы URL-адрес знал, когда проект был обновлен с помощью webhooks.

Как проверить, что сообщение, отправленное на мой сервер, действительно пришло из github?

должен ли я проверить IP-адрес отправителя или я могу отправить проверку подлинности где-нибудь? Я хочу убедиться, что кто-то не пытается подделать запрос, притворяясь от github.

один из вариантов-настроить крюк через PubSubHubbub и с помощью hub.secret возможность создания подписи HMAC SHA1 тела сообщения. Однако для этого потребуется, чтобы мой сервер настроил запрос, а не ждал, пока пользователи настроят обратный вызов после получения на мой сайт, когда они захотят. Я бы предпочел просто попросить пользователей вставить URL, который я им даю, в url-адрес сообщения.

5 ответов


вы можете попробовать проверить IP-адрес после запроса Github:207.97.227.253, 50.57.128.197, 108.171.174.178


вы можете ping Meta API GitHub чтобы получить массив IP-адресов (в CIDR обозначение), что входящие крючки службы будут исходить и проверять их на IP-адрес запроса:

https://api.github.com/meta


посмотри документы GitHub по этому вопросу: они предлагают использовать HTTPS и базовую аутентификацию.

в частности, настройте URL-адрес полезной нагрузки в следующем формате:

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

Если у вас есть несколько пользователей, вы бы дали каждому другое имя пользователя и пароль. Предполагая, что они хранят этот пароль в секрете, вы можете доверять, что запрос на аутентификацию действительно поступает от GitHub и от эта учетная запись.

см. также:https://github.com/blog/237-basic-auth-post-receives


в дополнение к ответу @mnml вторым шагом может быть просто вызов API и проверить что данная информация соответствует последней известной фиксации для проекта. Это тот же процесс, который OpenID использует для проверки правильности передаваемых данных.

Итак, сначала я мог бы победить тупые ответные атаки, просто проверив IP. Затем я мог бы спросить github, правильна ли полученная мной информация.

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

вы можете найти свой webhook по трудно угадываемому URL-адресу. Скажи:

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

(Это 128-бит случайных данных - увеличить до любого размера чувствует себя комфортно). Предполагая, что вы можете доверять github, чтобы сохранить этот url-адрес в безопасности, вполне вероятно, что клиенту, попавшему в этот url, можно доверять.

если url-адрес когда-либо будет скомпрометирован, это простой вопрос, чтобы просто создать новый случайный URL и обновить веб-сервер.

просто убедитесь, что вы используете хороший источник энтропия...