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


76

В даний час Google вимагає від вас створення ключа API, який відповідає домену, звідки карта буде обслуговуватися. Як Google застосовує це? Я хочу зробити те саме.

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

Я завжди розумів, що ця концепція неможлива, але Google якимось чином добре виконує її завдання.

Редагувати - Здається, Google все-таки не зробив нічого дивовижного. Їх API, швидше за все, призначений лише для відстеження, а не насправді для того, щоб гарантувати, що їх API використовує особа, що має ключ.


Я вважаю, що знайшов відповідь.
Тайлер Картер

1
Ось як це працює зараз: developers.google.com/maps/documentation/javascript/…
dashambles

Відповіді:


30

Я цілком впевнений, що вони використовують URL-адресу REFERER, щоб визначити, звідки надходить дзвінок. Якщо домен не відповідає призначеному ключу, це недійсний запит.

Для практичного прикладу, використовуючи PHP, ви можете перевірити домен за допомогою $_SERVER['HTTP_REFERER']перевірки реферала. Якщо домен збігається, поверніть дійсну відповідь. Якщо цього не сталося, ви можете повернути 401 несанкціоновану або іншу відповідь.


2
Ні. Це підмінна. Я думаю, що Google, швидше за все, покладається на IP-адресу (неможливо легко її підробити) та пошук DNS.
Тайлер Картер

29
Адреса API для виклику Ajax - це IP-адреса користувацького агента клієнта, який аналізує документ і виконує javascript. Таким чином, IP-адреса запиту Ajax не пов'язана з доменом джерела документа. Єдина інформація у запиті, яка стосується домену документа, - це реферал. Звичайно, реферал може бути підроблений. Однак у випадку з Google API це веб-сайт, який хоче підробити реферала; однак фактичне спуфінг може відбуватися лише на стороні клієнта в браузері. Таким чином, підробка не така велика загроза.
Franci Penov

1
Перевірка здійснюється за допомогою коду GMaps Javascript на стороні клієнта . Не потрібно перевіряти / підробляти реферала в цьому випадку ...
Вім

5
багато "популярних рішень безпеки" за замовчуванням видаляють або замінюють референт. Чи блокують цих користувачів бачення послуги?
Інстин

2
Зловмисник може підробляти ключ API і використовувати модифікований референт для викрадення квоти компанії зі свого веб-браузера. Це обмежено веб-браузером (клієнтом). Чи вважаєте ви, що Google певним чином обмежує кількість запитів, які ідентифікований клієнт (унікальна IP-адреса) може зробити за певний проміжок часу? Це може обмежити вплив розкрадання квот.
Ніцег,

65

Сам ключ API - це, швидше за все, односторонній хеш домену, з яким пов’язаний ключ, і секрет, про який знає лише сервер Google API. Він може містити деякі інші відомі (для Google, звичайно,) відомості. Коли ви робите запит із цього домену, сервер API бере домен, з якого надходить запит, і робить той самий односторонній хеш-розрахунок і порівнює ці два значення.

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

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

І, звичайно, є також стурбованість можливими атаками XSS через їх API. Але я не вірю, що їх ключ API занадто прив'язаний до будь-якого анти-XSS-коду, який у них є.


На жаль, це звучить як найбільш розумна відповідь. Дякуємо за ваш внесок.
Виротек

2
"вони могли запропонувати анонімний доступ" - Зверніть увагу, що деякі функції обмежені кількістю запитів на день та ключем API (і були, коли це було опубліковано), наприклад, зворотне геолокація.
Пісквор залишив будівлю

1
Також зверніть увагу, що використання HTTPS не є безкоштовним.
Arjan

Franci, чи не могли б ви далі пояснити у другому абзаці, як javascript може перевірити, чи javascript, який викликав виклик API Ajax, походить з цільового сервера?
Govind Rai

3

Як сказано в моєму коментарі:

REFERER можна підміняти, тому, мабуть, малоймовірно, що Google використовуватиме його як засіб перевірки. Дивіться цей запис у Вікіпедії.

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

Але навіть у цього є свої проблеми, оскільки якщо сервер використовує налаштування DNS з ІР-адресою Round-Robin, Google буде перенаправлено на іншу IP-адресу під час пошуку DNS.

З поширених запитань

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

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

Моє припущення підтверджується тим фактом, що він не працює для IP-адрес або псевдонімів, а це означає, що він не робить перевірку DNS.

ЦЕЙ метод не може бути підроблений, оскільки він повинен бути правильним заголовком для доступу до сторінки. Однак це означає, що будь-які псевдоніми домену не працюватимуть.

Однак це також означає, що ви ПОВИННІ надати бібліотеку Javascript для доступу до коду, оскільки ви не можете перевірити цю сторону сервера, я вважаю.


Заголовок "Хост" може містити адресу під час запиту сторінки, але як я можу гарантувати, що значення також передається в новий запит AJAX, зроблений цією сторінкою до мого API? Я думав, що це в основному те, що містить "Referrer", що, як ми знаємо, може бути підроблено.
Виротек

Ну, оскільки ВИ пишете дзвінок AJAX (оскільки ви надали бібліотеку Javascript), ВИ можете переконатися, що він надійде.
Тайлер Картер

Причина, по якій Google може вимагати ключ API, полягає в тому, що вони надають бібліотеку Javascript, а потім можуть запускати Javascript на сторінці.
Тайлер Картер

1
Правильно, але кожен може бачити код, завантажений на клієнт, і вносити зміни для надсилання будь-якої URL-адреси домену, яку хоче. Отже, це все ще не безпечно.
Виротек

5
Ця відповідь неправильна. Як Arjan щойно сказав, для заголовка Host для виклику google API буде встановлено значення "google.com", тому ніякої користі взагалі не використовуйте. IP-адреса - це IP-адреса клієнта (комп'ютера, на якому працює веб-браузер). Також ніякої користі. Єдиним корисним заголовком, що надходить від браузерів, є реферал, який надає веб-сайту, який браузер переглядає. Чи завжди браузери надсилають це на 100% надійно? Ні. Чи може погана людина зламати один браузер, щоб надіслати іншого реферала? Так. Чи може погана людина створити веб-сайт, який вказує всім браузерам робити це? Ні. Отже, це працює як інформація про відстеження.
Гаррі Вуд,

3

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

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

  2. Друга спроба - злий зловмисник копіює Google Javascript для ключа API із mysite.comджерела сторінки, а потім вбудовує змінений javascript у anothersite.com. Тепер Google не може нічого перевірити (віддалений IP буде комп’ютером користувача, і ви не можете багато чого зробити ви або Google).

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


-6

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


2
Хоча це можна обійти (JSONP). Я не думаю, що ви не можете зателефонувати, ви просто не можете обробити повернення.
Ryan Elkins

Переглядаючи кілька прикладів, особливо econym.org.uk/gmap/example_map12.htm (перерахований як хороший навчальний посібник), виявляється, що типовий користувач виставляє ключ, коли він виконує скрипт src maps api. Джерело js перезаписує сторінку (карта - це набір img). Маркери розміщуються шляхом завантаження даних JSON за допомогою GDownloadUrl () - це просто робить XMLHttpRequest і повертається на його сервер. JSONP вимагає підтримки сервера Google, так?
бер.

4
Якби це було правдою, наприклад, розміщений у CDN jQuery не міг здійснювати виклики Ajax до будь-якого іншого домену, крім CDN.
Arjan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.