Перейти до вмісту

Основи безпеки

Чи є проблемою ключ API Google у вашому браузері?

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

Vlad Tkachenko6 хв читання

Коротко

  • Ключ API Google, видимий у коді вашої сторінки, зазвичай не є проблемою, бо ключ Google це ідентифікатор для рахунку, а не пароль.
  • Безпечним його робить обмеження за HTTP-referrer: налаштування, яке каже Google, що ключ працює лише з вашого власного сайту.
  • Це безкоштовно, займає близько п’яти хвилин і є тією єдиною справою, яку варто зробити сьогодні.
  • Файл сервісного акаунта Google у вашому застосунку це інший і терміновий випадок. Ось це справжні облікові дані.

Відкрийте свій застосунок у браузері, подивіться код сторінки й пошукайте AIza. Якщо у відповідь з’явиться рядок із сорока символів, вам, найпевніше, уже сказали, що він «у відкритому доступі», і, найпевніше, не сказали, що робити далі.

Ось те, у чому більшість порад на цю тему помиляється: ключ API Google у коді вашої сторінки це не та сама проблема, що й секретний ключ Stripe у коді вашої сторінки, і рішення полягає не в тому, щоб його сховати. Ставитися до них однаково означає або панікувати через свою карту, або, що гірше, звикнути знизувати плечима на слова «у відкритому доступі» саме перед тим днем, коли це матиме значення.

Між 12 і 14 серпня 2026 року ми провели ті самі дев’ять зовнішніх перевірок для 30 998 робочих застосунків, створених у Lovable, Bolt, v0, Replit і Base44. У 1 142 з них знайшовся ключ API Google. У трьох знайшовся секретний ключ Stripe. Повні цифри є в нашому звіті про сканування.

Чи погано, що мій ключ API Google видно в коді сторінки?

Зазвичай ні. Усе залежить від того, чи обмежений цей ключ.

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

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

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

Чому ваш застосунок узагалі віддає ключ

Тому що запит іде з браузера вашого відвідувача, а не з вашого сервера.

Коли хтось завантажує сторінку з картою, цей браузер звертається просто до maps.googleapis.com. Він має вказати, якому проєкту Google належить запит, і цей ідентифікатор має бути на сторінці, бо саме зі сторінки запит і робиться.

Google це знає. Саме тому обмеження існує як окремий елемент керування: ідентифікатор однаково став би публічним, тож те, що вирішує, хто може ним користуватися, живе там, куди публіка не дістанеться.

Ключ в обох рядках однаковий. Різниця лише в тому, чи встановлено на ньому обмеження.

Як обмежити ключ API Google

Це безкоштовно, займає близько п’яти хвилин, і торкатися коду застосунку не потрібно. У консолі Google Cloud:

  1. Перейдіть до API та сервіси → Облікові дані й натисніть на знайдений ключ.
  2. У розділі Обмеження застосунку виберіть Вебсайти.
  3. Додайте свій домен. Для сайту на yourapp.com додайте https://yourapp.com/*. Додайте також домен попереднього перегляду чи тестовий, якщо він у вас є, і згадайте адресу .lovable.app або .vercel.app, на якій ваш застосунок був опублікований до того, як ви під’єднали власний домен.
  4. У розділі Обмеження API виберіть Обмежити ключ і позначте лише ті API, які ваш застосунок справді викликає. Карті з пошуком місць потрібні Maps JavaScript API та Places API, і більше нічого.
  5. Збережіть, зачекайте кілька хвилин, потім завантажте власний сайт і перевірте, чи карта досі малюється.

Якщо крок 3 зроблено неправильно, ви дізнаєтеся про це одразу й наочно: карта падає з RefererNotAllowedMapError у консолі браузера, і це називає проблему точно. Додайте домен, якого бракує, і все знову працює. Ця зміна оборотна, і саме тому її варто зробити ще до того, як ви дочитаєте цю статтю.

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

Якщо ви радше подивилися б, які ключі ваш застосунок насправді віддає, ніж перебирали їх по одному, наше безкоштовне сканування читає ваш робочий сайт ззовні й показує, що воно бачить. Це триває близько 20 секунд і не потребує акаунта: сканувати застосунок.

Які облікові дані Google доречні в браузері

Облікові даніЯкий вигляд маєУ коді сторінки?Що насправді захищає
Браузерний ключ Maps або PlacesAIza…Тут доречноОбмеження за referrer плюс ліміт квоти
Вебключ конфігурації FirebaseAIza…Тут доречноПравила безпеки Firebase та App Check
Ключ, який ви використовуєте на серверіAIza…НіколиНічого, щойно він став публічним
Сервісний акаунтфайл JSON, що містить "private_key"НіколиНічого. Ось це справжні облікові дані

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

Три з них це ті самі сорок символів. Розділяє їх налаштування, якого в коді сторінки не видно.

Ключ Firebase створений, щоб бути публічним

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

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

Що насправді стається, коли витікає необмежений ключ

Рахунок, простій або і те, і те. Не витік даних.

Автоматичні збирачі обходять публічні сторінки, вишукуючи рядки AIza, а необмежений ключ працює звідусіль, тож ваш зрештою обслуговує фрагменти карти й пошук місць для чужого проєкту. Google називає це прямо у власній документації для початківців: причина встановлювати обмеження полягає в тому, щоб запобігти крадіжці квоти.

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

І те, і те виправно. Ані те, ані те не розкриває дані ваших користувачів, бо ключ Maps не може прочитати вашу базу даних. Це чесна різниця між цією знахідкою та витеклим ключем від бази, і саме тому наш сканер повідомляє про ключ API Google як про те, що варто перевірити, а не як про надзвичайну ситуацію.

Єдині облікові дані Google, які справді поводяться як надзвичайна ситуація, це сервісний акаунт. Якщо ваш застосунок віддає файл JSON із "type": "service_account" і блоком "private_key" усередині, то це справжні облікові дані зі справжніми правами у вашому хмарному проєкті. Видаліть ключ у консолі, а потім подивіться, до чого він міг дістатися.

Що зробити просто зараз

Що робити

  • Пошукайте AIza в коді свого робочого сайту. Кожен збіг це ключ, за який треба відповісти.
  • Обмежте кожен із них у консолі Google Cloud: Вебсайти в обмеженнях застосунку, ваш домен і тільки ті API, якими ви користуєтесь. Безкоштовно, близько п’яти хвилин, без змін у коді.
  • Заразом установіть денний ліміт квоти на ключ. Обмеження зменшує трафік, а ліміт визначає стелю того, у скільки це може обійтися.
  • Залиште ключ конфігурації Firebase там, де він є. Натомість перевірте, чи ваші правила безпеки роблять свою роботу, і тримайте Gemini API поза списком дозволених для цього ключа.
  • Якщо ви знайшли файл JSON service_account у коді сторінки, вважайте це терміновим. Видаліть ключ у консолі, а не просто заберіть файл, бо в історії версій старе значення лишається.

Якщо вам зручніше пройти це списком, 10-хвилинний чекліст безпеки охоплює це разом з іншим, що варто вимкнути у щойно запущеному застосунку. А щодо ширшого питання, які ключі взагалі доречні в браузері, у нас є посібник, як відрізнити публічні ключі від секретних.

Поширені запитання

Хтось знайшов мій ключ Google Maps у коді сторінки. Чи треба його міняти?

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

Хіба не можна просто сховати ключ, щоб ніхто його не знайшов?

Ні. Браузер вашого відвідувача має надіслати ключ до Google, щоб завантажити карту, тож усе, чим може скористатися браузер, відвідувач може прочитати. Мініфікація чи перейменування затримають когось лише на кілька секунд. Обмеження ключа це те рішення, яке справді працює, і воно працює незалежно від того, чи знайде хтось ключ.

Мій ключ обмежено моїм доменом. Чи може хтось усе одно ним скористатися?

Заголовок referrer можна підробити, тож наполеглива людина може надсилати запити, які видають себе за запити з вашого сайту. Обмеження прибирає простий випадок: автоматичний збирач, який знаходить ключі на публічних сторінках і використовує їх просто зі свого сервера. Саме цей трафік і створює несподівані рахунки, тому обмеження варте того, навіть якщо це не стіна. Додайте ще й денний ліміт квоти на ключ, і ви матимете стелю для того, у скільки все це може вам обійтися.

Firebase записав ключ API у мій файл конфігурації. Це помилка?

Ні, і Firebase це документує. Вебключ API Firebase позначає ваш проєкт, а не надає доступ, і про доступ вирішують правила безпеки Firebase та App Check. Він створений для того, щоб бути у вашому коді. Уникати слід лише одного: додавати Gemini Developer API до списку дозволених API цього ключа, бо так навмисно опублікований ключ стає ключем, який може витрачати гроші.

А якщо я знайду файл із "type": "service_account" у своєму застосунку?

Це інша ситуація, і вона термінова. Ключ сервісного акаунта це справжні облікові дані з приватним ключем усередині, і його місце на сервері. Видаліть ключ у консолі Google Cloud у розділі IAM і адміністрування, далі Сервісні акаунти, приберіть файл із коду сторінки та перевірте свої рахунки й журнали аудиту. Видалення лише з коду не зачиняє двері, бо старе значення далі лишається в історії версій.

Автор

Vlad Tkachenko

Засновник Reeve

Я щодня дивлюся на застосунки, зібрані в Lovable, Bolt, v0, Cursor і Replit, і на короткий список помилок, які трапляються в них знову і знову.

Більше про автора

Читати далі

Не впевнені, як справи у вашому застосунку?

Запустіть безкоштовне сканування й отримайте зрозумілу оцінку від A до F приблизно за 20 секунд. Без облікового запису й без картки.

Сканувати безкоштовно

Автоматична зовнішня перевірка, а не повний аудит. Відсутність знахідок не є гарантією безпеки.