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

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

Чи безпечно будувати на Bolt? Код рідко буває проблемою. Вирішує те, чи були колись замкнені таблиці, які Bolt написав за вас.

Vlad Tkachenko4 хв читання
Картка перевірки безпеки Reeve для застосунків на Bolt, з логотипом Bolt на білій плитці.

Логотипи належать їхнім власникам і показані, щоб позначити сумісність.

Коротко

  • Застосунок на Bolt з боку коду зазвичай безпечний. Вирішує те, чи були колись замкнені таблиці, які згенерував Bolt.
  • Таблиці, створені виконанням SQL, не отримують Row Level Security за замовчуванням, а саме через SQL Bolt їх і створює.
  • Публічний ключ у застосунку доречний. sb_secret_… чи service_role, що дістався браузера, варто замінити сьогодні.

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

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

Що Bolt вручає відвідувачу, а що лишає собі

Дві половини, і лише одна з них приватна.

Уявіть крамницю. Bolt будує вам вітрину (сторінки, кнопки, форми), і вся ця вітрина вручається кожному відвідувачу, який відкриває ваш сайт. Інакше не буває. Браузер не покаже сторінку, якої йому не дали, тож не існує варіанту, у якому фасад вашого застосунку лишався б таємним. За ним стоїть склад: ваша база даних у Supabase, окрема будівля з власним замком.

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

Чи проблема, що в моєму застосунку на Bolt є API-ключ?

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

Обидва звуться API-ключами. Лише один із них будь-коли призначався для читання.

Публічний ключ називає ваш проєкт і більше нічого. Supabase зве його sb_publishable_… у нових проєктах і anon у старіших, і його зроблено для того, щоб лежати у браузері, де його може прочитати будь-хто. Секретний ключ (sb_secret_… або service_role до перейменування) робить протилежне. Він ігнорує кожне написане вами правило й читає та змінює кожен рядок у кожній таблиці.

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

Перемикач, що вирішує, кому відповідає ваша база даних

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

Ваш застосунок і сторонній стукають в одні й ті самі двері. Хто увійде, вирішує налаштування, а не екрани вашого застосунку.

Тепер частина, що стосується саме проєкту на Bolt. Supabase вмикає Row Level Security за замовчуванням для таблиць, створених у Table Editor панелі, тому, де клацають. Таблиці, створені виконанням SQL, її не отримують, і вмикати доводиться свідомо.

Bolt створює ваші таблиці, пишучи SQL.

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

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

Прочитайте свій список політик. У Supabase Authentication → Policies показує кожну таблицю зі станом Row Level Security. Почніть із того, що позначено як вимкнене: це може прочитати будь-хто, у кого є адреса вашого проєкту.

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

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

А потім подивіться ззовні. Усе вище каже, що налаштовано. Воно не каже, до чого справді дістається сторонній, а це інше питання, і саме воно важить. Наше безкоштовне сканування читає ваш живий сайт так само, як це зробив би будь-який відвідувач, і дає оцінку приблизно за 20 секунд, без акаунта: сканувати застосунок.

Що робити

  • Усе, що Bolt віддає браузеру, може прочитати будь-хто. Так влаштовані браузери, і ховати це не той шлях, що вартий зусиль.
  • Публічний ключ у застосунку доречний. Секретний ключ (sb_secret_… або service_role) варто замінити сьогодні.
  • Таблиці, створені виконанням SQL, не отримують Row Level Security за замовчуванням, а саме через SQL Bolt створює таблиці.
  • Увімкнути налаштування – це крок перший. Політика, яка дозволяє всім, лишає таблицю відкритою, поки панель показує її як захищену.
  • Те, що застосунок працює, не є доказом, що він замкнений. Зсередини обидва стани виглядають однаково.

Відкрийте в Supabase Authentication → Policies і прочитайте список згори донизу. Якщо десь написано, що Row Level Security вимкнено, саме з цієї таблиці й варто почати, а 10-хвилинний чекліст безпеки охоплює решту поверхні, коли ви це зробите.

Що насправді може піти не так із застосунком на Bolt

Жоден із цих пунктів не означає, що ви зробили щось не так: це звичайні побічні ефекти швидкої розробки. Ось що варто перевірити:

  • Секретний ключ, що потрапляє в браузер (пастка VITE_)

    Застосунки на Bolt зазвичай збираються за допомогою Vite, у якого є одне правило, на якому люди спотикаються: будь-яке налаштування, назва якого починається з VITE_, вбудовується в код, що виконується у браузері відвідувача, де його може прочитати будь-хто. Назвіть справжній секрет VITE_SOMETHING, і він піде в публічний доступ. Деякі ключі й мають бути публічними (як-от «anon» ключ Supabase), і це нормально: Reeve відрізняє безпечні від небезпечних, тож без хибних тривог.

  • Відкрита база даних (RLS у Supabase вимкнено)

    Bolt часто під'єднує ваш застосунок до Supabase для даних. У Supabase є перемикач Row Level Security (RLS, захист на рівні рядків), що вирішує, хто може читати чи змінювати кожен рядок. Якщо він вимкнений, ваші таблиці можуть бути доступні для читання, або редагування, будь-кому, хто знайде адресу. Це найпоширеніша серйозна проблема застосунків, зроблених AI, і вона невидима, доки не перевіриш.

  • Відкритий файл .env або конфігурації

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

  • Публічне сховище файлів

    Якщо люди завантажують файли у ваш застосунок, вони живуть у «бакетах» сховища. Публічний бакет означає, що будь-хто може переглянути список або завантажити те, що всередині, тож приватне завантаження може стати видимим усім. Reeve перевіряє, чи можна переглянути список ваших бакетів; він ніколи не завантажує чужих файлів.

  • Увімкнені Source maps

    «Карта коду» (source map) є допоміжним файлом, що розкриває оригінальний код вашого застосунку. Зручно під час розробки, але якщо вона потрапляє в продакшн, то дає стороннім читабельну мапу того, як влаштований застосунок, а це полегшує пошук усіх інших дверей. Невисока терміновість, але варто прибрати.

  • Відсутні заголовки безпеки та відкриті ендпоінти

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

Що таке Reeve і чим він не є

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

Bolt і StackBlitz постійно покращують те, що генерується, а якщо ваш застосунок використовує Supabase, її власний радник позначає проблеми з базою даних у панелі керування. І те, і те допомагає. Що додає Reeve: ви живете в Bolt, а не в панелі, і ті інструменти говорять мовою розробників. Reeve дивиться на весь ваш задеплоєний застосунок ззовні, так, як подивився б сторонній, і розповідає знайдене словами, за якими можна діяти. А якщо ви не хочете про це думати, ми можемо стежити за ним замість вас.

Хочете, щоб цим займалися, а не лише перевірили?

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

Дізнатися про Reeve Care

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

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

Bolt швидко дає робочий застосунок, але «безпечний за замовчуванням» залежить від того, як він налаштований, надто ж від змінних середовища і, якщо ви використовуєте Supabase, від правил бази даних. Дізнатися можна, лише перевіривши, що насправді відкрито; Reeve робить це безкоштовно приблизно за 20 секунд.

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

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

Чи використовує Bolt Supabase, і чи це безпечно?

Bolt часто під'єднує застосунки до Supabase. Supabase безпечний, коли Row Level Security увімкнено й у фронтенді лише ваш публічний «anon» ключ. Якщо RLS вимкнено або витік «service_role» ключ, ваші дані можуть бути відкриті. Reeve перевіряє і те, і те, жодного разу не читаючи ваших справжніх даних.

Чи змінить сканування щось у моєму застосунку на Bolt?

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

Bolt написав мої таблиці в базі даних. Вони замкнені за замовчуванням?

Часто ні, і причина суто механічна. Supabase вмикає Row Level Security автоматично для таблиць, які ви створюєте клацанням у Table Editor, але не для створених виконанням SQL. Білдер створює таблиці саме виконанням SQL, тож такі таблиці приходять із вимкненим перемикачем, якщо тільки щось не увімкнуло його згодом.

Прев'ю працювало, і опублікований застосунок працює. Це означає, що все налаштовано правильно?

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

Куди дивитися, щоб зрозуміти, чи є ця проблема в моєму проєкті на Bolt?

Відкрийте свій проєкт у Supabase і перейдіть до Authentication, потім до Policies. Там перелічено кожну таблицю схеми public і показано, чи ввімкнено Row Level Security. Будь-яку таблицю, позначену як вимкнену, може прочитати кожен, у кого є URL вашого проєкту й публічний ключ, і обидві ці речі лежать усередині опублікованого вами застосунку.

Автор

Vlad Tkachenko

Засновник Reeve

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

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

Будували деінде? У нас є такий самий чесний розбір для:

← Усі гайди з безпеки конструкторів

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