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

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

Чек-лист безпеки для vibe coding, у девʼяти перевірках

Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.

Vlad Tkachenko13 хв читання
Список із девʼяти розлінованих рядків, біля кожного порожня клітинка, жодна ще не позначена.

Коротко

  • Чек-лист безпеки для vibe coding вартий чогось лише тоді, коли ви можете його завершити. У цьому девʼять пунктів, бо девʼять — це стільки речей у живому застосунку будь-хто може перевірити ззовні.
  • Чотири з них вирішують, чи дістанеться чужа людина до ваших даних або грошей. Зробіть ці чотири, перш ніж комусь надіслати адресу.
  • Решта пʼять — це налаштування й дати. Вони належать до списку, і жоден із них поодинці не віддає рядок вашої бази даних.

Ви ось-ось надішлете комусь адресу свого застосунку, і тихий голос каже, що спершу варто перевірити. Тож ви шукаєте чек-лист безпеки для vibe coding і знаходите такий, де двадцять пʼять пунктів, написаний людиною, яка припускає, що ви вже знаєте, що таке Content Security Policy.

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

У цьому девʼять пунктів. Девʼять — це стільки речей у живому застосунку будь-хто може перевірити ззовні, без вашого пароля, без вашого репозиторію і без вашого облікового запису Supabase. Кожен має тест, який ви можете зробити самі, і кожен тест повертається з «так» або «ні».

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

Що має бути в чек-листі безпеки для vibe coding?

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

Девʼять, у тому порядку, в якому їх проходять розділи нижче. Кожна читається ззовні, і саме це робить кожну з них перевірною.
ПеревіркаТест, який ви робите саміЩо це означає, якщо повернулося не так
Секретні ключі у вашому кодіПошук у проєкті за sk_, sb_secret_, service_role, AKIAХто знайде, витратить ваші гроші або прочитає кожен рядок
Правила бази данихSupabase, далі Security AdvisorБудь-хто з вашим публічним ключем прочитає ті рядки
Приватні файлиВідкрийте /.env і /.git/config у приватному вікніКожен ключ, який ви вважали на сервері, можна завантажити
Сховища файлівSupabase, далі Storage, далі колонка Public і політикиЧужа людина отримує список того, що завантажили користувачі
Заголовки безпеки браузераСкан; у цього пункту немає версії з адресного рядкаВаших відвідувачів легше атакувати через вашу сторінку
Опубліковані source mapІнструменти розробника, Sources, шукайте власні імена файлівВаш початковий код читається, разом із коментарями
Ваші власні адреси APIВідкрийте одну в приватному вікні без входуУсе, що вона віддає, є публічним
Строк сертифікатаНатисніть на замок, відкрийте сертифікат, прочитайте «Дійсний до»Відвідувачі бачать попередження браузера на всю сторінку
Продовження доменуДата закінчення у вашого реєстратора та чи ввімкнене автопродовженняЗастосунок зникає, а імʼя виставляють на продаж

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

Чотири перевірки, перш ніж поділитися адресою

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

Три з них — єдині перевірки в усьому наборі, здатні повідомити про критичну знахідку, а четверта — та, де відкритим лишається те, що завантажили ваші користувачі. Між 12 і 14 серпня 2026 року ми прогнали всі девʼять перевірок на 30 998 живих застосунках, зроблених через vibe coding, і цифри в кожному розділі нижче походять із того прогону.

1. Чи є секретний ключ у коді, який віддає ваш застосунок?

Пошукайте в усьому проєкті sk_, sb_secret_, service_role та AKIA. Збіг усередині будь-чого, що завантажує браузер, і є знахідкою.

Усе, що потрібно вашому застосунку, щоб працювати в браузері, прибуває в той браузер, тож ключ, який там сидить, прибуває теж. Деякі ключі там і мають бути: ключ Supabase anon або sb_publishable_ — це адреса, а не дозвіл, і знайти його правильно. Які ключі безпечні у фронтенді, а які ні розбирає цю різницю повністю.

Секретний ключ належить до іншого різновиду. Ключ Supabase sb_secret_ або service_role ігнорує будь-яке правило таблиці, яке ви коли-небудь писали. Ключ Stripe sk_live_ рухає гроші. Ми знайшли ключ цього класу на 52 застосунках із 30 998, що є рідкістю і є найгіршим у цьому списку, коли трапляється. Якщо ваш із таких, поверніть його, перш ніж робити будь-що інше: видалення ключа з коду лишає старе значення робочим.

2. Чи може чужа людина прочитати вашу базу даних?

У Supabase відкрийте Security Advisor. Кожен запис, який каже, що таблиця публічна, але безпеку на рівні рядків не ввімкнено, — це таблиця, яка відповідає кожному, хто спитає, і саме це попередження має власну статтю.

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

Це найчастіша серйозна знахідка в усьому наборі: 2 096 із 3 680 застосунків, чий проєкт Supabase нам відповів, тобто 57 %, мали щонайменше одну таблицю, яка віддавала рядки на запит без жодного входу. Увімкнути її на кожній таблиці — ось полагодження. Advisor читає ваші налаштування, а не відповіді вашої бази, тож завершіть перевіркою ззовні: у таблиці може бути ввімкнене налаштування і політика, яка все одно пропускає всіх.

3. Чи може будь-хто завантажити ваші приватні файли?

Відкрийте вашзастосунок.com/.env і вашзастосунок.com/.git/config у приватному вікні. Обидва мають відмовитися відкриватися.

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

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

4. Чи перелічують ваші сховища те, що в них лежить?

У Supabase відкрийте Storage. Прочитайте колонку Public на кожному сховищі, а потім відкрийте політики будь-якого сховища, де лежить щось не для всіх.

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

792 застосунки з 27 269 мали сховище, яке перелічилося нам без входу. Що чужа людина отримує з того списку розповідає довгу версію, а полагодження зазвичай є одним перемикачем плюс однією політикою.

Пʼять, які можуть зачекати, доки у вас зʼявляться користувачі

Заголовки, source map, ваші власні адреси API, сертифікат і домен. Три з них зазвичай ставить той, хто хостить ваш застосунок, а два є датами в календарі.

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

5. Чи ввімкнені заголовки безпеки браузера?

Це єдиний пункт списку без версії, яку можна зробити з адресного рядка. Скан їх читає, або ви відкриваєте інструменти розробника у браузері, переходите на вкладку «Мережа», натискаєте перший запит і читаєте заголовки відповіді.

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

Майже ніхто не проходить цей пункт, і майже ніхто не може. 30 756 застосункам із 30 981 бракувало щонайменше одного, а на піддомені білдера це налаштування належить платформі. Чи можете ви щось зробити зі своїми залежить цілковито від того, де ваш застосунок розміщено.

6. Чи опублікований ваш початковий код?

Відкрийте свій живий застосунок, відкрийте інструменти розробника у браузері й подивіться на панель Sources. Якщо там перелічені ваші власні файли з кодом, який ви писали, і коментарями, які ви лишали, то source map вийшли разом зі збіркою.

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

3 885 застосунків із 30 987 опублікували свої. Сам по собі це не витік, а стає ним, коли в коді є щось, про що ви думали, що ніхто не читатиме. Що відкриває опублікована source map розбирає цю різницю та налаштування збірки, яке її вимикає.

7. Чи відповідають ваші власні адреси API чужій людині?

Скопіюйте одну з адрес API вашого застосунку з вкладки «Мережа», а тоді відкрийте її в приватному вікні, де ви не ввійшли. Подивіться, що повернеться.

Це той пункт, який варто посунути наперед, якщо у вашого застосунку є власний бекенд, бо все, що адреса віддає запиту без входу, є публічним, хоч би як виглядала сторінка перед нею. 3 852 застосунки з 30 926 мали щонайменше одну.

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

8. Чи не спливає ваш сертифікат?

Натисніть на замок в адресному рядку, відкрийте сертифікат і прочитайте дату «Дійсний до».

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

9. Чи продовжений ваш домен?

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

Це найменш технічний пункт списку і єдиний, який може прибрати ваш застосунок з інтернету цілком. 55 застосунків із 30 980 мали домен, що сплив або спливає. Прострочене імʼя також може зареєструвати хтось інший, разом із кожним посиланням, яке будь-хто колись на нього поставив.

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

Що несуть інші чек-листи і що не є перевіркою безпеки

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

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

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

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

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

Як часто це повторювати?

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

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

Reeve Monitor існує саме для цієї прогалини. Він перезапускає всі девʼять перевірок щогодини на трьох застосунках максимум, щохвилини з інтервалом у 60 секунд дивиться, чи застосунок на ногах, повідомляє вам того дня, коли результат змінюється, замість чекати, поки ви подивитеся, і надсилає місячний звіт простою мовою. Він коштує $12 на місяць за прейскурантом, із сімома днями безкоштовно до першого списання, і сторінка цін іноді нижча за цифру тут і ніколи не вища. Monitor спостерігає і більше нічого. За резервні копії відповідає тариф Care над ним, і Care тримає копію бази даних Supabase і більше нічого.

Чого все це не доводить

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

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

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

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

Що робити

  • Зробіть чотири термінові по порядку: пошукайте у проєкті sk_, sb_secret_, service_role та AKIA; відкрийте Security Advisor у Supabase; відкрийте /.env і /.git/config у приватному вікні; прочитайте колонку Public і політики у Storage.
  • Якщо знайшли секретний ключ, поверніть його, перш ніж прибирати. Видалення ключа з коду лишає старе значення робочим, і воно й далі є у вашій історії версій та в будь-якій кешованій копії вашого сайту.
  • Зробіть решту пʼять, коли нічого не горить. Три належать вашому хостингу, а дві дати належать вашому календарю.
  • Покладіть резервну копію туди, де ваш обліковий запис Supabase не зможе її стерти, а тоді один раз відновіть її, щоб знати, що вона працює.
  • Пройдіть увесь список знову після будь-якого деплою, що торкнувся вашої бази даних, ваших ключів або налаштувань збірки.

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

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

Що перевірити перед запуском застосунку, зробленого через vibe coding?

Чотири речі, у такому порядку: чи потрапив секретний ключ у код, який ваш застосунок віддає браузерам; чи відповідають ваші таблиці бази даних на запит без жодного входу; чи відкриваються файли на кшталт /.env прямо з вашої живої адреси; і чи перелічують ваші сховища те, що завантажили ваші користувачі. Саме на цих чотирьох чужа людина дістається до ваших даних або грошей. Решта пʼять пунктів списку теж варті уваги, і жоден із них не є причиною відкладати запуск.

Скільки це триває?

Три з чотирьох термінових — це по одному погляду, щойно ви знаєте, куди дивитися: пошук у власному проєкті за чотирма префіксами ключів, сторінка Advisors у Supabase та дві адреси, набрані у приватному вікні. Той, що про базу даних, триває стільки, скільки у вас таблиць, бо ви читаєте правило на кожній. Наш безкоштовний скан робить усі девʼять ззовні приблизно за 20 секунд без облікового запису, і це чесна скорочена дорога для першого проходу.

Чи потрібен мені розробник для чогось із цього?

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

Який пункт найважливіший?

Чи відповідають ваші таблиці бази даних чужій людині. Це той пункт, де на кону дані ваших користувачів, а не ваші, і це найчастіша серйозна знахідка, яку ми бачимо. Серед застосунків, чий проєкт Supabase відповів нашому скану між 12 і 14 серпня 2026 року, 57 % мали щонайменше одну таблицю, яка віддавала рядки на запит без жодного входу. Секретний ключ у бандлі завдає більшої шкоди, коли трапляється, і трапляється він значно рідше.

Як часто перевіряти знову?

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

Чи означає пройдений список, що мій застосунок безпечний?

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

Автор

Vlad Tkachenko

Засновник Reeve

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

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

Читати далі

Усі статті

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

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

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

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