Безпека vibe-coded застосунків у 2026 році
Ми шукали живі застосунки, зроблені у Lovable, Bolt, v0, Replit чи Base44, і провели кожен через ті самі дев’ять перевірок, які будь-хто може безкоштовно зробити з головної сторінки Reeve. Ця сторінка і є тим, що повернулося.
Ваш застосунок може бути в цій вибірці. Тут його не названо, тож єдиний спосіб побачити, як у нього справи, це провести на ньому ті самі дев'ять перевірок
Лише погляд ззовні. Ми читаємо те, що браузер відвідувача читає й так: код, який віддає застосунок, заголовки, які він повертає, адреси, які він сам називає у власному коді. Без входів, без вгадування паролів, нічого не завантажено. Метод ↓
Тут і у файлі даних не названо жодного застосунку. Кожне число несе метод, яким його отримано, а файл унизу збирає всі агрегати в одну таблицю, якщо ви хочете перевірити підрахунки.
Кожен застосунок з оцінкою
452 застосунків, приблизно один із 69, мають D або FШість чисел, які розповідають історію
Ці шість чисел і є звітом. Усе, що йде після них, це база, на якій стоїть кожне з них, і те, як ми її отримали.
- Заголовки безпеки1/699%
із 30 998 перевірених застосунків мали щонайменше одну знахідку. Здебільшого помірні, і майже всім бракує заголовків безпеки браузера.
- Доступ до бази даних2/657%
застосунків на Supabase, до яких ми змогли дістатися, давали сторонньому прочитати щонайменше одну таблицю без входу: 2 096 із 3 680.
- Доступ до бази даних3/6394
застосунків мали читабельну таблицю, назва якої схожа на дані людей: users, profiles, orders. Один запит, без пароля.
- Відкриті секрети4/61із23
застосунків віддають секретний ключ у публічному коді: загалом 1 332. Лише 3 віддали головний ключ бази даних, і це рідше, ніж підказує паніка.
- Source maps5/613%
публікують source maps: оригінальний код застосунку, який видно в інструментах розробника будь-якого браузера. Це 3 885 застосунків.
- Розподіл оцінок6/676%
мають оцінку A. Основи здебільшого тримаються, а серйозні провали збираються в одному місці: у базі даних.
Типові налаштування платформ підводять майже скрізь, і більшість тих провалів помірні. Те, що може змінити лише той, хто будував застосунок, підводить значно рідше, і саме воно виставляє чужі дані у відкритий інтернет.
Які оцінки мають ці застосунки, від A до F
Reeve оцінює застосунок так, як це робить шкільний табель. Від ста віднімаються бали, зважені за серйозністю знахідки. Далі найсерйозніша знахідка встановлює стелю: з однією критичною знахідкою застосунок не підніметься вище за D, а з однією високою не підніметься вище за C.
Як оцінені всі застосунки, які ми змогли класифікувати
Це 452 застосунків із діркою, крізь яку сторонній може пройти вже сьогодні.
Більшість застосунків потрапляє в A або B. Смуга D і F невелика. Це ті застосунки, де сторонній уже може читати чужі рядки.
Що ми перевіряли і скільки застосунків провалило кожну перевірку
Кожна перевірка ставить одне запитання про застосунок ззовні, і кожну рахують від застосунків, де вона отримала відповідь. Застосунок, до якого перевірка не дісталася, лишається поза базою цієї перевірки, а не рахується чистим. Про такі сканування каже, що перевірити не вдалося, і ця сторінка робить так само.
Гортайте вбік, щоб побачити частку і найгірший випадок.
| Перевірка | Застосунків | Із | Частка | Найгірше з побаченого |
|---|---|---|---|---|
| Заголовки безпекиЗахист браузера, який мала б надсилати хостинг-платформа | 30 756 | 30 981 | 99% | щонайбільше Середній |
| Обмін між сайтамиAPI застосунку відповідає будь-якому сайту, який запитає | 6 867 | 30 926 | 22% | щонайбільше Високий |
| Source mapsОригінальний код, опублікований поруч із застосунком | 3 885 | 30 987 | 13% | щонайбільше Середній |
| Доступ до бази данихТаблиці бази даних, які читаються без входу | 2 096 | 26 249 | 8% | щонайбільше Критичний |
| Відкриті секретиКлючі, місце яким на сервері, віддані браузерам | 1 332 | 30 998 | 4% | щонайбільше Критичний |
| Сховища файлівСховище файлів, вміст якого може перелічити будь-хто | 792 | 27 269 | 3% | щонайбільше Високий |
| Продовження доменуРеєстрація скоро завершується або вже завершилася | 55 | 30 980 | <1% | щонайбільше Високий |
| SSL-сертифікатСертифікат прострочений, спливає або йому немає довіри | 32 | 30 851 | <1% | щонайбільше Високий |
| Приватні файлиКонфігураційні файли та дампи на публічних шляхах | 8 | 30 749 | <1% | щонайбільше Критичний |
Кожна частка рахується від застосунків, яким ця перевірка змогла відповісти. Крапка показує найгіршу версію проблеми в рядку, а не типову.
Два рядки виглядають страшніше, ніж вони є. Заголовки безпеки є вказівками, які хостинг-платформа надсилає браузеру, і коли одного бракує, перед одним класом атак стає на одну перешкоду менше. Опублікована source map це оригінальний код застосунку, покладений поруч зі скомпільованою версією: вона показує зловмиснику, де шукати, а сама по собі не віддає нічого.
Рядок може виглядати серйозним і через те, що жменя застосунків у ньому віддала щось поважне, поки решта віддала щось звичайне. Файл даних розкладає кожен рядок за типами ключів, щоб було видно, де що.
Більш ніж половина придатних до перевірки Supabase-застосунків віддає дані таблиць
До цього числа ми поверталися знову і знову.
Проєкт Supabase відкритий для інтернету за задумом. Застосунок, який працює в браузері, говорить із базою даних напряму, ключем, що й має бути публічним, а між стороннім і рядками стоїть Row Level Security: правило на кожній таблиці. Вимкніть це правило або напишіть політику, яка пускає всіх, і будь-яку таблицю проєкту можна прочитати одним запитом і без пароля.
57% 2 096 із 3 680
8 429 застосунків у цьому зрізі називають проєкт Supabase. Наша перевірка отримала відповідь від 3 680 із них; решта лишається за бекендами, крізь які ми не зондуємо, тож про них ми нічого не кажемо. Із цих 3 680 у 2 096 була щонайменше одна таблиця, яку сторонній може прочитати одним запитом і без пароля.
Менш ніж половину застосунків, які називають проєкт Supabase, узагалі можна перевірити. Частина веде трафік бази через власний бекенд, куди перевірка ззовні піти не може, тож про них ми не кажемо нічого. Частка вище рахується від застосунків, які відповіли.
1 702 застосунків відкривають таблиці із загальними або технічними назвами: settings, content, logs.
394 застосунків відкривають таблиці з назвами персональних даних: users, profiles, orders, messages.
Поділ і є корисною частиною. Читабельна таблиця з назвою settings чи content є помилкою. Читабельна таблиця з назвою users, profiles чи orders означає чужі персональні дані у відкритому інтернеті, і той, хто будував застосунок, майже напевно вважає їх приватними.
Перевірка ніколи не читає рядка. Вона питає базу, скільки рядків було б видно, і зчитує це число із заголовка відповіді. Цього досить, щоб відрізнити таблицю з правилом RLS від таблиці без нього, і далі перевірка не йде.
Ті самі дев’ять перевірок, за інструментами
Кожен застосунок згруповано за інструментом, у якому його опубліковано, і виміряно проти інших застосунків цього інструмента.
Гортайте вбік, щоб побачити два стовпці Supabase.
| Інструмент | Застосунків | Зі знахідкою | Оцінки D–F | Із Supabase | Читабельна база |
|---|---|---|---|---|---|
| Lovable | 18 554 | 99% | 2% 407 застосунків | 35% | 57%із 3 553 |
| Base44 | 5 438 | 100% | <1% 2 застосунків | 27% | замало придатних до перевірки застосунків, щоб публікувати частку |
| Replit | 3 042 | 99% | <1% 9 застосунків | 1% | замало придатних до перевірки застосунків, щоб публікувати частку |
| v0 | 1 790 | 100% | 0% 0 застосунків | 1% | замало придатних до перевірки застосунків, щоб публікувати частку |
| Bolt | 1 123 | 100% | 1% 15 застосунків | 24% | 77%із 35 |
Останній стовпець показує частку Supabase-застосунків цього інструмента, на яких наша перевірка отримала відповідь, із цією базою поруч. Тире означає, що придатних до перевірки застосунків було замало для частки. Вважайте це прогалиною в наших даних і не робіть висновків про те, наскільки ті застосунки безпечні.
Позначений рядок пускає трафік своєї бази через власний бекенд інструмента, куди перевірка ззовні піти не може. Ці застосунки тут не виміряні.
Застосунки на власних доменах неможливо ззовні прив’язати до інструмента, тож вони лишаються поза цією таблицею.
Майже все, що порівнює ця таблиця, це типові налаштування. Ніхто не обирає Lovable чи Bolt через заголовки безпеки. Їх ставить платформа кожному застосунку, який хостить, тож одна зміна там зсуває цілий стовпець цієї таблиці.
Два обмеження, перш ніж хтось процитує рядок. Ми приписуємо застосунки за доменом публікації, тож застосунок, що переїхав на власний домен, лишається поза цією таблицею, а це часто саме доробленіші. А інструмент, який веде трафік бази через власний бекенд, ззовні не перевірити взагалі. Порожнє місце там означає, що ми не змогли виміряти, і нічого не каже про те, наскільки ті застосунки безпечні.
Два типи знахідок, два типи виправлень
Знахідки на цій сторінці лягають у дві групи, і ці групи потребують різних рук.
Що контролює платформа
щонайбільше ВисокийКоли майже кожному застосунку на одному хостингу бракує того самого заголовка, це не десятки тисяч людей роблять ту саму помилку. Воно приходить разом із хостингом, і одна зміна з боку платформи виправила б їх усі.
- Заголовки безпеки99%
- Source maps13%
- Продовження домену<1%
- SSL-сертифікат<1%
Що контролюєте тільки ви
щонайбільше КритичнийЖодна хостинг-платформа не знає, які з ваших таблиць мають бути публічними і якому ключу місце на сервері. Кожна критична знахідка цього звіту лежить на цьому боці.
- Обмін між сайтами22%
- Доступ до бази даних8%
- Відкриті секрети4%
- Сховища файлів3%
- Приватні файли<1%
Перша група є продуктовим рішенням у компанії. Одна-єдина зміна типового налаштування хостингу зсуває кожен застосунок на тій платформі одразу, і саме тому ті рядки виходять такими однорідними, а виправити їх найдешевше.
Друга група лежить на тому, хто будував застосунок. Жодна хостинг-платформа не знає, які з ваших таблиць мають бути публічними і якому ключу місце на сервері. Кожна критична знахідка цього звіту лежить у цій групі. Посібники з безпеки за інструментами і чекліст перед запуском починаються обидва звідти.
Що вайб-кодери роблять правильно
Ми порахували й те, що пройшло, на тих самих застосунках.
96%не віддають жодного секрету у своєму публічному коді.
97%сховища, яке ми змогли перевірити, закрите для сторонніх.
99%віддають дійсний сертифікат.
Публічний ключ у фронтенді там і має бути. Ми ставимо таким OK і пояснюємо чому.
Остання картка саме та, де загальні сканери помиляються. Публічний ключ у фронтенді (анонімний ключ Supabase, публічний ключ Stripe) там і має бути: він створений, щоб його читали, а захист живе в правилах за ним. Позначити його проблемою означає відправити людину міняти налаштування, яке вже було правильним.
Як ми вимірювали і де межі
Звідки взялися застосунки
Три списки, зведені разом і без повторів: застосунки, які люди публікували в X і на Reddit, застосунки, запущені на Show HN, і застосунки, які ми перелічили з власних доменів публікації самих інструментів. Домени публікації дають основну масу вибірки, і лише цей список масштабується. Два інші знаходять лише той застосунок, про який хтось вирішив написати.
Мертві хости відсіялися першими, і судили ми про це, читаючи саму сторінку. Видалений деплой часто досі відповідає цілком бадьорим 200 OK.
Правило знаменника
Кожна частка на цій сторінці рахується від застосунків, яким ця перевірка змогла відповісти, і ніколи від усієї вибірки. Перевірка, яка не дісталася застосунку, лишає його поза власною базою і ніколи не рахує чистим. Два числа поруч із кожною смугою і є тією базою, щоб кожен бачив, яку саме читає.
56 застосунків повернули замало, щоб класифікувати їх бодай якось. Вони лишаються поза кожним числом на цій сторінці, а не рахуються чистими.
Оцінки пораховано від меншого числа з тієї самої причини. Застосунок, який повернув замало, щоб його класифікувати, випадає з усіх чисел вище, а не отримує оцінку навмання.
Що ми робили і чого не робили
- Лише пасивне читання: запити, які браузер відвідувача робить і так, плюс публічні адреси, на які вказує сам застосунок.
- Перевірка бази бере кількість рядків із заголовка відповіді. Ми жодного разу не прочитали рядка, не завантажили файла, не зайшли в акаунт і не вгадували пароля.
- Жодного застосунку не названо: ні тут, ні у файлі даних. Список застосунків поряд із їхніми слабкими місцями став би списком мішеней, і ми не тримаємо такого у придатному до публікації вигляді.
Межі, про які треба знати
- Вибірка схиляється до новіших застосунків. Застосунок, який переїхав на власний домен, ззовні неможливо прив’язати до інструмента, а це часто саме усталеніші застосунки.
- Колір у рядку позначає найгірший випадок, який ми бачили, а ним може бути один застосунок із сотень. Файл даних розкладає кожен рядок за точним типом ключа.
- Це вікно у три дні серпня. Застосунок, полагоджений наступного тижня, все одно рахується тут таким, яким був того дня, коли ми дивилися.
- Автоматична зовнішня перевірка не є аудитом. Відсутність знахідок не є гарантією.
Скористайтеся цими числами
Журналісти, дослідники й усі, хто про це пише, можуть повторно використовувати ці дані із зазначенням джерела. Файл нижче містить усі агрегати цієї сторінки в одній пласкій таблиці й не називає жодного застосунку.
Reeve. The State of Vibe-Coded App Security 2026. 30 998 живих застосунків, перевірено 12 серпня 2026 р. – 14 серпня 2026 р.. reeve.page/research/vibe-coded-app-security-2026
Дані під ліцензією CC BY 4.0: вільно використовуйте їх, зазначаючи Reeve посиланням. Файл містить усі агрегати цієї сторінки і не називає жодного застосунку.
Питання
Чи можете ви сказати, у яких застосунків які проблеми?
Ні. Лише кількості й частки, ніколи назви, а файл даних містить рівно те, що показує сторінка. Список застосунків поряд із їхніми слабкими місцями став би списком мішеней, і ми його не робитимемо.
Мій застосунок може бути в цих даних. Що робити?
Проскануйте його самі. Це ті самі дев’ять перевірок, триває близько двадцяти секунд, і ви отримаєте оцінку та те, що сторонній уже бачить. Ніщо на цій сторінці нікого не називає, тож це єдиний спосіб дізнатися, як у вас справи.
Невже таблиця бази, яку читає будь-хто, аж настільки серйозна річ?
Якщо будь-хто в інтернеті може витягнути ті рядки одним запитом і без пароля, так. Читабельна таблиця з назвою settings є недбалістю. Читабельна таблиця з назвою users чи orders є витоком даних, якого ще ніхто не помітив.
Чому ви вважаєте публічні ключі нормальними?
Анонімний ключ Supabase створений, щоб бути публічним. Захистом є правила бази даних за ним, а не сам ключ. Інструменти, які позначають такі ключі, привчають людей проминати наступне попередження, а воно може виявитися важливим.
Чи будете ви робити це знову?
Так. Сканування тривають, і наступне видання виросте з них. Файл даних фіксує вікно, з якого взято ці числа, тож стара копія не зійде за поточну.
Де у цьому ряду ваш застосунок?
Ті самі дев’ять перевірок, на вашому застосунку, безплатно. Оцінка і звіт зрозумілою мовою приблизно за 20 секунд.
Оцінка · Бали: 72/100