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

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

Чи безпечний Bolt? Що показали 1 123 застосунки Bolt

Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.

Vlad Tkachenko13 хв читання
Застосунок у вигляді вітрини з логотипом Bolt замість вивіски, червоний ключ усередині, замкнена база даних позаду й відвідувач надворі.

Коротко

  • Чи безпечний Bolt? У всьому, що вирішує сам Bolt, так. Серед 1 123 живих застосунків Bolt ми знайшли 13, що публікують свої source maps, один, що дозволяв будь-якому сайту викликати його API, і жодного поганого сертифіката.
  • 75 із цих застосунків віддавали щось схоже на ключ у коді, який завантажує відвідувач. Здебільшого це були ключі Google, і з ними зазвичай усе гаразд. Десять були ключами OpenAI, і хто знайде такий, може ним витрачати ваші гроші.
  • Із 35 баз даних Bolt, які ми справді змогли запитати, 27 віддали рядки на запит без входу. Обидві проблеми є налаштуваннями у вашому власному проєкті.

Ви збудували щось на Bolt, натиснули Publish, і тепер воно живе за адресою, що закінчується на bolt.host. Перш ніж надіслати це посилання справжнім клієнтам, ви набрали «чи безпечний bolt» у пошуку, і повернувся список із п’яти вразливостей, які нібито є майже в кожному застосунку Bolt, а внизу сторінки продається сканер.

Ось у чому ці списки помиляються: вони ставлять кожен ризик на один рівень, а в живих застосунках Bolt більшість цих ризиків ледве трапляється. Source maps, відкриті cross-origin заголовки й незахищені API-маршрути стоять там нарівні з ключами, що витекли, і відкритими таблицями. У наших даних перші три трапилися на 13, 1 і 4 застосунках із понад тисячі. Інші два якраз там, де були знахідки.

З 12 по 14 серпня 2026 року ми прогнали ті самі дев’ять зовнішніх перевірок, які будь-хто може безкоштовно запустити на нашій головній сторінці, через 30 998 живих застосунків, і 1 123 з них були опубліковані на власному хостингу Bolt. Ось що повернулося для них, і ось де закінчується наш погляд.

Чи безпечний Bolt?

У всьому, що вирішує сам Bolt, так. Його хостинг вийшов таким самим чистим, як у Lovable, а все, що знижувало оцінку, сиділо в застосунку, який збудував його власник.

Уявіть застосунок Bolt як крамницю. Bolt зводить будівлю: адресу, сертифікат, хостинг. Ви наповнюєте вітрину, тобто кожну сторінку, зображення й скрипт, які ваш застосунок віддає відвідувачу, і будь-хто, хто проходить повз, може прочитати все, що в ній лежить. За крамницею є склад, ваша база даних, зі своїми дверима й своїм замком. «Чи безпечний Bolt» насправді містить три запитання, по одному про кожне з них.

  1. Будівля. Чи публікує Bolt ваш застосунок як слід: дійсний сертифікат, домен, що не спливе, нічого забутого за публічною адресою. Це робота Bolt.
  2. Вітрина. Те, що завантажує браузер відвідувача. Ключ, залишений там, може прочитати кожен, хто подивиться, хоч би як він туди потрапив.
  3. Склад. Чи відповідає ваша база даних незнайомцю, який обійшов будинок і спитав із чорного ходу. Це залежить від замка, який ставите ви, таблиця за таблицею.

Наші перевірки читають усі три ззовні. Жодна з них не читає код, який написав агент Bolt, так, як ви читали б його в редакторі, і ця стаття не вгадує за неї.

Що ми знайшли в 1 123 застосунках Bolt

Дев’ять перевірок, ззовні, без входу й без доступу до чийогось акаунта. Коли база даних відповідала, ми питали, скільки рядків вона віддасть, і на цьому зупинялися; жодного ми не прочитали. Жоден застосунок не названо ні тут, ні деінде в наших публікаціях. Кожна частка нижче рахується від застосунків, на яких ця перевірка відповіла, бо перевірка, що не змогла завершитися, є невідомою, а не пройденою, і саме тому знаменники рухаються. Методика й дані є у звіті.

Що ми перевірялиЗастосунки BoltХто це вирішує
Бракує заголовків безпеки браузера1 121 з 1 123Хостинг Bolt
Щось схоже на ключ у коді, який завантажує відвідувач75 з 1 123 (7 %)Ваш застосунок
Таблиця бази даних, яку можна прочитати без входу27 з 35Ваш застосунок
Опублікований оригінальний код (source maps)13 з 1 123 (1 %)Налаштування збірки
Бакет сховища, що показує список своїх файлів6 з 901Ваш застосунок
API-маршрут, що віддав дані незнайомцю4 з 1 120Ваш застосунок
Будь-якому сайту дозволено викликати ваш API1 з 1 120Ваш застосунок
Приватний файл на кшталт .env чи .git/config за публічною URL0 з 1 109Ваш застосунок
Сертифікат прострочений або недовірений0 з 1 119Bolt
Домен ось-ось спливе0 з 1 123Bolt

Оцінки: 1 051 A, 33 B, 24 C, 15 D і жодної F.

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

Перший рядок визначає те, що віддає ваші сторінки, а на yourapp.bolt.host це Bolt, тож 1 121 застосунок отримав однакову відповідь. Заголовки варто мати, і не через них ставлять D. Приберіть цей рядок, і 1 008 із 1 123 застосунків Bolt більше нічого не мали. Решта 115 і є темою цієї статті далі.

Що Bolt робить правильно

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

Source maps. 13 із 1 123 застосунків Bolt публікують оригінальні файли, що стоять за застосунком, разом із коментарями. Це трохи більше одного на сотню, приблизно той самий рівень, що й 225 із 18 553 у Lovable, і map видає більше, ніж зазвичай думають.

Cross-origin заголовки. Один застосунок із 1 120 повідомляв кожному сайту у світі, що той може викликати його API. Це знахідка, яка найлегше дає іншому сайту діяти від імені вашого користувача, і на Bolt вона трапилася один раз.

Сама будівля. Сертифікат був дійсним на всіх 1 119 застосунках, де ми змогли його прочитати, жоден домен із 1 123 не був близьким до завершення, і жоден застосунок не віддавав файл .env чи .git/config за звичайною адресою.

Ніщо з цього нічого від вас не вимагало, а на деяких інших конструкторах вимагає.

З чого складалися 75 ключів

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

75 із 1 123 застосунків Bolt мали щось схоже на ключ у коді, який завантажує відвідувач. Якщо рахувати за формою, це 7 % застосунків Bolt, що «зливають секрети». Якщо рахувати за тим, що може кожен ключ, вони діляться так, і кожен застосунок пораховано один раз, за найсерйознішою знахідкою в ньому:

Що ми знайшли в бандліЗастосункиЩо це означає
Ключ API Google, і більше нічого38Зазвичай усе правильно, якщо обмежити його вашим доменом
Секрет, який ми не змогли атрибутувати26Ми не змогли сказати, якому постачальнику він належить
Ключ OpenAI10Списує гроші з вашого акаунта, напряму
Ключ Anthropic1Списує гроші з вашого акаунта, напряму

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

Десять ключів OpenAI є протилежним випадком. Ключ OpenAI є bearer-токеном: хто його має, той і може ним витрачати, звідки завгодно, і OpenAI не пропонує жодного налаштування, яке прив’язало б ключ до вашого сайту. Усі десять цих застосунків отримали D, бо одна критична знахідка обмежує оцінку, хоч би що застосунок зробив правильно в іншому. Що робити з таким ключем, по порядку починається з того, щоб ротувати його сьогодні.

Ось число, яке робить цю знахідку знахідкою саме про Bolt. Застосунки Bolt становили менше 4 зі 100 просканованих, і на них припало 10 із 33 ключів OpenAI, які ми взагалі знайшли. У розрахунку на застосунок це приблизно один застосунок Bolt із 110, проти 18 із 18 554 застосунків Lovable, приблизно одного з тисячі. Десять застосунків є малою вибіркою, і кілька більше чи менше сильно зсунули б це співвідношення. Bolt однаково лишився б попереду всіх інших конструкторів, які ми виміряли.

Bolt був тонким відрізком просканованих застосунків і майже третиною знайдених ключів OpenAI. Числа малі, тому показані обидва, а не перетворені на частку.

Чому застосунки Bolt зливають API-ключі?

Ззовні ми не бачимо, як туди потрапив кожен із цих десяти ключів, а власні інструкції Bolt кажуть, що жодного з них там не мало бути.

Документація Bolt описує передбачений шлях. Попросіть агента інтегрувати OpenAI, і, словами документації, він «завершить код, а потім покаже повідомлення з проханням додати ваш секрет». Цей секрет іде в панель Secrets, де його може прочитати лише серверна функція. Серверна функція працює на боці Bolt, тож браузер відвідувача ключа ніколи не отримує. Якщо збудувати так, ключ лишається на складі.

Обхідний шлях, який ми можемо назвати, пролягає через змінну середовища. Вступ Bolt до баз даних каже, що змінні середовища тримають ці значення приватними, і дві з трьох назв, які він наводить, VITE_SUPABASE_URL і VITE_SUPABASE_ANON_KEY, починаються з VITE_. Цей префікс належить Vite, інструменту збирання, і документація Vite каже про нього протилежне: змінна VITE_ записується в код, який завантажує браузер, і ніколи не повинна містити API-ключ. Для цих двох назв це нешкідливо, бо адреса проєкту й публічний ключ створені бути публічними. Перенесіть той самий шаблон на VITE_OPENAI_API_KEY, і ключ лежить у вітрині.

Ключ, вставлений у чат, поки ви лагодили щось інше, теж може опинитися записаним просто в сторінку. Так чи так результатом є той самий файл. Як працює префікс пояснює, які значення можна ставити за ним, а які ніколи.

27 із 35: бази Bolt, які ми змогли запитати

Із баз даних Bolt, що дали нам придатну відповідь, 27 із 35 віддали рядки на запит без жодного входу. Це кількість, а база замала, щоб друкувати її як відсоток.

Знаменники тут важать більше, ніж будь-де в цій статті. 266 із 1 123 застосунків Bolt називали проєкт Supabase у коді, який вони віддають. Лише 35 з них відповіли достатньо добре, щоб ми могли судити. Решту 231 оцінити не вдалося, тож вони невідомі, і ми не зарахували їх ні до чистих, ні до відкритих.

Чотири знаменники. 27 рахується від 35, а 231, які ми не змогли оцінити, намальовано як невідомі, а не пропущено.

У 4 із 27 таблиця, що відповіла, мала таку назву, які зазвичай дають таблицям про людей, наприклад users чи profiles. Ці чотири разом з одинадцятьма застосунками з ключем OpenAI або Anthropic дають усі 15 оцінок D. В інших 23 це була таблиця, яку ми не могли розпізнати ззовні: можливо, список товарів, що завжди мав бути публічним, а можливо, щось зовсім інше.

Чому все впирається в базу даних

Бо адреса складу надрукована у вітрині, і так має бути.

Коли застосунок Bolt читає свої дані зі сторінки, сторінці потрібна адреса бази даних і публічний ключ, тож обидва їдуть до кожного відвідувача. Те, що цей ключ публічний, правильно; саме ним заходить ваш власний застосунок. Що він отримає у відповідь, вирішує налаштування на рівні таблиці, яке називається Row Level Security. Коли воно увімкнене й policy написана, публічний ключ читає лише ті рядки, які дозволяє policy. Коли вимкнене, він читає таблицю.

Supabase вмикає Row Level Security за замовчуванням для таблиць, які ви створюєте мишкою в його Table Editor. Таблиці, створені виконанням SQL, її не отримують, а виконання SQL якраз і є тим способом, яким конструктор створює для вас таблиці. До того ж увімкнення є лише першим кроком, бо policy, яку пише асистент, щоб позбутися помилки доступу, часто має вигляд using (true): вона пропускає всіх, поки панель показує таблицю як захищену. RLS увімкнено, а ваша таблиця досі публічна розповідає цю історію повністю.

Власна перевірка бази даних у Bolt шукає саме це: документація описує її як таку, що знаходить «відсутню policy Row Level Security (RLS) або надто відкритий дозвіл». Пояснення простою мовою для цієї платформи є в статті чи безпечний ваш застосунок Bolt.

Що перевіряє власний аудит безпеки Bolt

Він читає ваш проєкт зсередини і запускається, коли ви натискаєте кнопку.

Bolt анонсував аудит 30 липня 2026 року. На платному тарифі він є в меню Publish як Run security audit: переглядає ваш код і вашу базу даних, сам виправляє більшість проблем, позначає решту й не витрачає ваші токени. На кожному тарифі, зокрема безкоштовному, налаштування бази даних Bolt мають розділ Security, який запускає описану вище перевірку Row Level Security.

Наше сканування відбулося через два тижні після появи цієї кнопки, тож цифри вище не можуть сказати, наскільки вона все змінила відтоді. Що ми можемо сказати, так це як поєднуються два погляди. Аудит бачить ваш проєкт зсередини, включно з таблицями, яких ваші сторінки ніколи не згадують, а сканування ззовні цього ніколи не може. Сканування ззовні бачить те, що незнайомець отримує від опублікованого застосунку. Коли аудит завершується, на кнопці з’являється Security audit up to date, а наступна зміна, яку ви опублікуєте, буде такою, якої він не бачив.

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

Як перевірити власний застосунок Bolt

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

  1. З’ясуйте, яка у вас база даних. Нові проєкти Bolt за замовчуванням використовують базу даних Bolt. Якщо ви вибрали Supabase під час створення проєкту або під’єднали його пізніше, ваші таблиці живуть у проєкті Supabase, у який ви можете увійти.
  2. Прочитайте замок на кожній таблиці. З базою Bolt відкрийте розділ Security в налаштуваннях бази й запустіть перевірку. З Supabase відкрийте Authentication → Policies і перегляньте список: таблицю з вимкненою Row Level Security може прочитати будь-хто, хто має адресу вашого проєкту, а ця адреса є у вашому застосунку. Policy, що пропускає всіх, вважається вимкненою.
  3. Пошукайте VITE_ у своєму проєкті. Кожне значення за цим префіксом лежить у вітрині. Адреса проєкту й публічний ключ мають бути там. Ключ, за який вам виставляють рахунок, має жити в панелі Secrets, і читати його має серверна функція. Якщо такий ключ колись стояв за префіксом, спершу ротуйте його в постачальника, бо старе значення працює, доки ви цього не зробите.
  4. Перегляньте сховище. Бакет, позначений як публічний, показує список усіх своїх файлів кожному, хто спитає, включно з тими, яких ваш застосунок ніколи не показує.
  5. Або доручіть це скануванню. Воно робить це ззовні разом із п’ятьма іншими перевірками, займає приблизно 20 секунд, не потребує акаунта й показує оцінку та те, що її спричинило: просканувати застосунок безкоштовно.

Щоб так і лишалося після публікації

Перевірка минулого місяця описує застосунок минулого місяця. На Bolt публікація є однією кнопкою, тож таблиця, додана сьогодні вранці, чи ключ, вставлений опівночі, з’являються наживо, щойно ви її натиснете.

Reeve Monitor проганяє дев’ять перевірок знову за вас:

  • усі дев’ять перевірок щогодини, для трьох застосунків максимум
  • чи працює застосунок, кожні 60 секунд
  • повідомлення, коли результат змінюється, щоб нова знахідка не чекала, поки ви глянете
  • місячний звіт про те, що він побачив

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

Якщо ваш застосунок Bolt тримає дані у вашому власному проєкті Supabase, Reeve Care зберігає їх копію. Це стосується і проєкту, під’єднаного з самого початку, і бази даних Bolt, яку ви перенесли до Supabase.

  • зашифрована копія вашої бази Supabase щоночі, у місці, до якого ваш проєкт не дотягнеться
  • кожна копія перевірена, перш ніж її зарахувати, з підрахунком рядків у кожній таблиці
  • відновлення в один клік, коли воно знадобиться
  • ваші завантажені файли теж, щойно ви під’єднаєте облікові дані Storage
  • усе, що робить Monitor

Care коштує $49 на місяць за прайсом за один застосунок, із тими самими сімома безкоштовними днями.

Відкрита таблиця є тим, що може прочитати незнайомець. Міграція, що пішла не в той бік, або агент із доступом до бази є тим, що може її спорожнити, і жодна з дев’яти перевірок у цій статті не повернула б рядки. День, коли ШІ-агент видалив продакшн-базу даних показує, як це виглядає зсередини.

Що зробити цього тижня

Що робити

  • Пошукайте VITE_ у своєму проєкті Bolt і прочитайте кожне значення за ним. Ключ, за який вам виставляють рахунок, має жити в панелі Secrets, і читати його має серверна функція.
  • Якщо ключ OpenAI чи будь-який інший платний ключ колись був у цьому списку, ротуйте його в постачальника, перш ніж прибирати з коду.
  • Запустіть перевірку безпеки бази даних або відкрийте Authentication → Policies у Supabase і прочитайте замок на кожній таблиці. Policy, що пропускає всіх, лишає таблицю відкритою.
  • Запускайте аудит Bolt перед публікацією, а потім перевіряйте опублікований застосунок ззовні.
  • Тримайте копію своєї бази там, куди не дотягнуться ні ваш проєкт, ні ваш агент, і перевірте, що ця копія відновлюється.

Почніть із пошуку VITE_, бо це єдина знахідка на Bolt, яка сама по собі коштує грошей. Якщо ви ще обираєте між конструкторами, який ШІ-конструктор застосунків найбезпечніший ставить усі п’ять поруч.

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

Чи безпечно користуватися Bolt?

У тій частині, яку контролює Bolt, наші цифри кажуть так. Серед 1 123 живих застосунків на bolt.host ми не знайшли жодного поганого сертифіката чи домену, що ось-ось спливе, 13 застосунків публікували source maps і один дозволяв будь-якому сайту викликати його API. Те, що вирішує долю вашого застосунку, лежить усередині нього: чи потрапив ключ, за який вам виставляють рахунок, у код, який завантажують відвідувачі, і чи відповідають ваші таблиці незнайомцю. Обидва ці налаштування ви можете перевірити самі.

Чи безпечні застосунки Bolt за замовчуванням?

Те, що Bolt публікує за вас, вийшло чистим у нашому скануванні. Решта залежить від того, що відбулося в чаті. Bolt має тримати платний API-ключ у панелі Secrets, за серверною функцією, і в нього є перевірка бази даних, що шукає відсутню Row Level Security. Жодна з них не запускається сама: аудит проєкту є кнопкою в меню Publish на платних тарифах, а перевірка бази є розділом, який ви відкриваєте самі. У серпні 2026 року 75 із 1 123 застосунків Bolt мали щось схоже на ключ у фронтенді, а 27 із 35 баз, які ми змогли запитати, відповіли незнайомцю.

Чому застосунки Bolt зливають API-ключі?

Ззовні ми не бачимо, як туди потрапив кожен окремий ключ. Шлях, який ми можемо назвати, пролягає через змінну середовища. Змінна, чия назва починається з VITE_, записується в JavaScript, який завантажує кожен відвідувач, і Vite, інструмент збирання за цим префіксом, каже, що такі змінні ніколи не повинні містити API-ключ. Для адреси проєкту чи публічного ключа це нешкідливо. Для ключа OpenAI це рахунок. Десять із 1 123 застосунків Bolt, які ми просканували, віддавали такий ключ.

Чи в безпеці мої дані Supabase у застосунку Bolt?

Це залежить від одного налаштування на кожну таблицю. Коли застосунок Bolt звертається до Supabase зі сторінки, він використовує публічний ключ, створений бути публічним, тож лише Row Level Security вирішує, що отримає незнайомець. Ми змогли попросити рядки в 35 баз Bolt без входу, і 27 їх віддали. Це кількість, а база замала, щоб перетворювати її на відсоток. Свої policies ви прочитаєте за кілька хвилин.

Чи Bolt безпечніший за Lovable?

З боку платформи вони йдуть нарівні: 13 із 1 123 застосунків Bolt і 225 із 18 553 застосунків Lovable публікували source maps, трохи більше одного на сотню в обох випадках, і жоден не мав проблем із сертифікатом чи доменом. Різниця була в ключах. Десять із 1 123 застосунків Bolt мали ключ OpenAI, проти 18 із 18 554 на Lovable. Десять є малим числом, тож читайте це як напрямок. Повне порівняння всіх п’яти конструкторів є в окремій статті.

Автор

Vlad Tkachenko

Засновник Reeve

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

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

Читати далі

Усі статті

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

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

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

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