Как Карты Google защищают свой ключ API? Как сделать что-то похожее? - PullRequest
73 голосов
/ 13 февраля 2010

В настоящее время Google требует, чтобы вы создали API-ключ, специфичный для домена, из которого будет обслуживаться карта. Как Google обеспечивает это? Я хочу сделать то же самое.

Я предоставляю API для своего сервиса, но хочу разрешить клиентам встраивать вызовы в API через JavaScript, а не только с сервера. Я мог бы защитить его с помощью случайного токена, но, конечно, его мог легко подделать любой, кто просматривает код на клиентском компьютере.

Я всегда понимал, что эта концепция невозможна, но каким-то образом Google хорошо справляется с ней.

Редактировать - Похоже, Google действительно ничего удивительного не сделал. Их API, скорее всего, просто для отслеживания и не гарантирует, что их API использует человек с ключом.

Ответы [ 5 ]

65 голосов
/ 13 февраля 2010

Ключ API, скорее всего, является односторонним хешем домена, с которым связан ключ, и секретом, о котором знает только сервер API Google. Он может содержать некоторые другие части хорошо известной (для Google, конечно) информации. Когда вы делаете запрос из этого домена, сервер API берет домен, из которого поступил запрос, и выполняет те же однонаправленные вычисления хеша и сравнивает два значения.

Для вызовов Ajax они, скорее всего, используют реферер для получения домена узла документа. Несмотря на то, что реферер может быть подделан, в конечном счете, чтобы использовать API, вам нужно заставить Google javascript выполнить в документе. На этом этапе этот javascript может проверить, что действительно документ, который вызвал вызов API Ajax, возник с целевого сервера. Конечно, это также можно подделать, если у вас есть собственная реализация DOM или модификация скрипта на лету. Однако такая подделка должна происходить на стороне клиента, и вероятность того, что веб-сайт, который хочет использовать Google API, сможет подделать клиентское программное обеспечение, весьма мала.

Обратите внимание, что, поскольку API по сути бесплатен, они могли бы также предложить анонимный доступ к своему API. Очевидно, что целью Google является не защита от несанкционированного доступа к нему, а обеспечение того, чтобы они могли собирать как можно больше данных об использовании этих данных и иметь возможность связать это использование с другими данными, которые они собрали о целевом домене. Таким образом, я не ожидал бы, что проверка ключа API будет намного более сложной, чем та, что я описал выше - рентабельность инвестиций при более продвинутом подходе слишком низкая.

И, конечно же, существует проблема возможных XSS-атак через их API. Но я не верю, что их ключ API слишком сильно связан с любым кодом анти-XSS, который у них есть.

29 голосов
/ 13 февраля 2010

Я вполне уверен, что они используют URL REFERER, чтобы определить, откуда поступил звонок. Если домен не соответствует назначенному ключу, это неверный запрос.

Для практического примера, используя PHP, вы можете проверить домен, используя $_SERVER['HTTP_REFERER'], чтобы проверить реферер. Если домен совпадает, верните правильный ответ. Если это не так, вы можете вернуть 401 Несанкционированный или другой ответ.

3 голосов
/ 16 февраля 2010

Я согласен со всеми пунктами , которые перечислил Франци Пенов. Я хотел бы немного подробнее рассказать об использовании чужого API-ключа. Допустим, вы зарегистрировали key1 с example.com.

  1. Первая попытка & ndash; Если anothersite.com имеет <script src="http://www.google.com/jsapi?key=key1">, Google может проверить своего реферера (упомянутая схема хеширования), и в этом случае существует несоответствие. Как злой злоумышленник преодолевает это, так как многие люди упоминали, что реферер может быть подделан? Это не совсем применимо здесь. Конечно, вы можете отправлять произвольные заголовки, если делаете запрос, но как злой хакер подделывает реферер для пользователей на anothersite.com? Это вообще не просто. В IE 6 были старые версии flash, которые позволяли злоумышленнику устанавливать произвольные заголовки при выполнении междоменных запросов, но в целом это не работает для сценария src. Я не уверен, что включенный Javascript выполняет какую-либо проверку document.location, чтобы предотвратить это (вероятно, нет).

  2. Вторая попытка & ndash; Злой злоумышленник копирует Google Javascript для ключа API из источника страницы mysite.com, а затем встраивает модифицированный javascript в anothersite.com. Теперь Google не может ничего проверять (удаленный IP-адрес будет компьютером пользователя, и вы или Google не сможете многое сделать).

Итак, если вы хотите по какой-то причине сохранить ваш ключ API в секрете (одна из причин, по которой злоумышленник может получить ваш ключ в черном / заблокированном виде), не вставляйте ключ в запросы клиента и прокси через ваш сервер (код вашего приложения). теперь есть ключ).

3 голосов
/ 13 февраля 2010

Как говорится в моем комментарии:

REFERER подделан, поэтому вряд ли Google будет использовать его как средство проверки. См. эту запись в Википедии.

Я предполагаю, что Google, вероятно, использует IP-адрес звонящего вместе с поиском DNS. DNS на самом деле не подделывается, так как ваши DNS-записи должны быть правильными, чтобы веб-сайт даже попадал к вам.

Но даже у этого есть свои проблемы, потому что, если сервер использует настройку DNS IP-адреса Round-Robin, при поиске DNS Google будет перенаправлен на другой IP-адрес.

Из FAQ

Обратите внимание, что ключ для http://www.mygooglemapssite.com/ будет принят только тогда, когда сайт доступен по этому адресу. Он не будет принят, если доступ к сайту осуществляется по IP-адресу (например, http://10.1.2.3/) или по имени хоста, имеющего псевдоним www.mygooglemapssite.com с использованием записи DNS CNAME.

Я предполагаю, что он может использовать заголовок Host, отправляемый при запросе страницы, который будет работать, как обычно, Google просит вас включить его API-скрипт непосредственно на страницу. Затем этот скрипт имеет доступ к заголовкам для текущей страницы и может использовать его для проверки.

Мое предположение подтверждается тем фактом, что он не работает для IP-адресов или псевдонимов, что означает, что он не выполняет проверку DNS.

ЭТОТ метод нельзя подделать, так как для доступа к странице должен быть указан правильный заголовок. Однако это означает, что любые псевдонимы домена не будут работать.

Однако это также означает, что вы ДОЛЖНЫ предоставить библиотеку Javascript для доступа к коду, так как, я полагаю, вы не можете проверить эту сторону сервера.

0 голосов
/ 13 февраля 2010

Причина, по которой это работает, заключается в том, что вы не можете делать вызовы API с помощью JavaScript. Безопасность браузера не позволяет javascript отправлять запросы где-либо, кроме домена, из которого был создан javascript. Из-за этого любые вызовы API из javascript необходимо перенаправлять через ваш сервер, где хранится ключ API (ключ api никогда не виден в javascript).

...