Как Карты Google защищают свой ключ API? Как сделать нечто подобное?

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

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

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

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


person Vyrotek    schedule 13.02.2010    source источник
comment
Думаю, я нашел ответ.   -  person Tyler Carter    schedule 13.02.2010
comment
Вот как это работает сейчас: developers.google.com/maps/ документация / javascript /   -  person dashambles    schedule 15.11.2019


Ответы (5)


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

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

person Trevor    schedule 13.02.2010
comment
Итак, если клиент должен был сделать AJAX-вызов нашего API через JavaScript, я могу рассчитывать на то, что Referer Domain будет точным и не подделываемым? - person Vyrotek; 13.02.2010
comment
Неа. Это подделка. Я думаю, что Google, скорее всего, полагается на IP-адрес (его нелегко подделать) и поиск в DNS. - person Tyler Carter; 13.02.2010
comment
Ах, поэтому они берут URL-адрес домена, ищут его IP-адрес и ищут DNS, чтобы убедиться, что он совпадает. Хотя вы говорите, что это тоже технически подделка? - person Vyrotek; 13.02.2010
comment
Ссылка, отправленная в запросе, может быть подделана (en.wikipedia.org/wiki/Referrer_spoofing) . - person Trevor; 13.02.2010
comment
Может быть. Не «полностью» уверен в его способности к подделке. Но я предполагаю, что более вероятно, что Google использует IP-адрес, чем REFERER. - person Tyler Carter; 13.02.2010
comment
Адрес API для вызова Ajax - это IP-адрес пользовательского агента клиента, который анализирует документ и выполняет javascript. Таким образом, IP-адрес запроса Ajax не связан с доменом источника документа. Единственная информация в запросе, которая относится к домену документа, - это реферер. Конечно, реферер может быть подделан. Однако в случае API Google именно веб-сайт хочет подделать реферер; однако фактическая подмена может произойти только на стороне клиента в браузере. Таким образом, спуфинг не представляет большой угрозы. - person Franci Penov; 13.02.2010
comment
Проверка выполняется кодом Javascript GMaps на стороне клиента. В этом случае нет необходимости проверять / обманывать реферера ... - person Wim; 16.02.2010
comment
@Wim - это интересно. Итак, чтобы уточнить, когда вы встраиваете javascript GMaps на свой сайт, это пользовательский JS только для вашего сайта? Это означает, что Google возвращает модифицированную версию JS для каждого веб-сайта? Или вы думаете, что js выполняет 2 вызова: один для определения того, на каком сайте он должен быть, и один для отправки данных? - person Brian Armstrong; 02.04.2010
comment
@Brian: взгляните на основной файл JS, который вы включаете для GMaps: maps .google.com / ›Ваш ключ находится где-то там, поэтому вы получаете (слегка) настроенный JS для своего сайта (и я предполагаю, что ключ каким-то образом содержит закодированное значение домена, в котором он должен бежать) - person Wim; 02.04.2010
comment
на основе документации php о $ _SERVER ['HTTP_REFERER'] - это адрес страницы (если есть), которая направила пользовательский агент на текущую страницу. Это устанавливается пользовательским агентом. Не все пользовательские агенты будут устанавливать это, а некоторые предоставляют возможность изменять HTTP_REFERER как функцию. Короче говоря, этому нельзя верить. так как мы можем полагаться на то, чему можно доверять? Спасибо - person Ahmad; 20.10.2011
comment
многие «популярные решения безопасности» по умолчанию удаляют или заменяют реферер. Заблокированы ли эти пользователи для просмотра службы? - person Instine; 20.01.2012
comment
Еще несколько месяцев назад я думал, что знаю ответ на этот вопрос. Тот факт, что запросы от некоторых браузеров поступают без реферера, на самом деле не имеет значения. Google пропускает это. Google может блокировать недействительные источники перехода, и этого достаточно, чтобы злоумышленник не мог создать веб-сайт с украденным ключом API. Однако ... В шаге, который я нахожу удивительным, с этого года новые браузеры теперь поддерживают метатег, который позволяет людям создавать веб-сайт, который предписывает ему не отправлять заголовок реферера. stackoverflow.com/a/28836003/338265 Так что, я думаю, эта идея взорвана - person Harry Wood; 16.08.2016
comment
Злоумышленник может подделать ключ API и использовать модифицированный референт, чтобы украсть квоту компании из своего веб-браузера. Это ограничено веб-браузером (клиентом). Считаете ли вы, что Google каким-то образом ограничивает количество запросов, которые идентифицированный клиент (уникальный IP-адрес) может сделать в заданный период времени? Это могло ограничить влияние кражи квот. - person Nitseg; 21.08.2016

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

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

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

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

person Franci Penov    schedule 13.02.2010
comment
К сожалению, это звучит как наиболее разумный ответ. Спасибо за ваш вклад. - person Vyrotek; 13.02.2010
comment
они могли бы предложить анонимный доступ - обратите внимание, что некоторые функции ограничены количеством запросов в день и ключом API (и были, когда это было опубликовано), например обратная геолокация. - person Piskvor left the building; 21.10.2011
comment
Также обратите внимание, что использование HTTPS не является бесплатным. - person Arjan; 08.09.2012
comment
Фрэнси, не могли бы вы объяснить во втором абзаце, как javascript может проверить, что javascript, вызвавший вызов Ajax API, исходит от целевого сервера? - person Govind Rai; 03.03.2018

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

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

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

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

Из FAQ

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

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

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

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

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

person Tyler Carter    schedule 13.02.2010
comment
Заголовок Host может содержать адрес при запросе страницы, но как я могу гарантировать, что это значение также будет передано в новый запрос AJAX, сделанный этой страницей к моему API? Я думал, что это в основном то, что содержит «реферер», который, как мы знаем, можно подделать. - person Vyrotek; 13.02.2010
comment
Что ж, поскольку ВЫ пишете вызов AJAX (потому что вы предоставили библиотеку Javascript), ВЫ можете убедиться, что он будет отправлен. - person Tyler Carter; 13.02.2010
comment
Причина, по которой Google может потребовать ключ API, заключается в том, что они предоставляют библиотеку Javascript, а затем могут запускать Javascript на странице. - person Tyler Carter; 13.02.2010
comment
Верно, но любой может увидеть код, загруженный в клиент, и внести изменения для отправки любого URL-адреса домена, который он хочет. Так что это все еще не безопасно. - person Vyrotek; 13.02.2010
comment
Как IP-адрес вызывающего абонента (являющегося веб-браузером) связан с веб-сайтом, который отображается в браузере? Кроме того, Host установлен на домен Google (к которому выполняется запрос), а не на домен сайта, который включает скрипт Google (из которого сделан запрос)? - person Arjan; 08.09.2012
comment
Это неверный ответ. Как только что сказал Арджан, заголовок Host для вызова API Google будет установлен на google.com, так что никакого толку. IP-адрес - это IP-адрес клиента (компьютера, на котором запущен веб-браузер). Также бесполезно. Единственный полезный заголовок, исходящий от браузеров, - это реферер, который указывает веб-сайт, на который смотрит браузер. Всегда ли браузеры отправляют это на 100% надежно? Нет. Может ли злой человек сломать один браузер, чтобы отправлять разные рефереры? да. Может ли плохой человек создать веб-сайт, который инструктирует все браузеры делать это? Нет. Так что это работает как информация для отслеживания. - person Harry Wood; 22.04.2015

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

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

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

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

person mar    schedule 16.02.2010

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

person Jeffrey Aylesworth    schedule 13.02.2010
comment
Однако есть способы обойти это (JSONP). Я не думаю, что вы не можете позвонить, вы просто обычно не можете обработать возврат. - person Ryan Elkins; 13.02.2010
comment
Рассмотрим несколько примеров и особенно econym.org.uk/gmap/example_map12.htm (указан как хороший учебник), похоже, что типичный пользователь открывает ключ, когда скрипт src maps api. Исходный js перезаписывает страницу (карта - это набор img). Маркеры размещаются путем загрузки данных json с помощью GDownloadUrl () - это просто создает XMLHttpRequest и возвращается на его сервер. JSONP требует поддержки со стороны сервера Google, верно? - person mar; 16.02.2010
comment
Если бы это было правдой, то, например, jQuery, размещенный в CDN, не мог бы выполнять вызовы Ajax в любой другой домен, кроме CDN. - person Arjan; 08.09.2012