Основи безпеки
Безпека v0: усі 1 790 просканованих застосунків v0 отримали A
Безпека v0 на 1 790 живих застосунках v0: усі отримали A. Лише 17 згадували базу даних, і саме це здебільшого вимірює оцінка A.

Коротко
- За безпекою v0 вийшов чистішим за будь-який інший builder, який ми вимірювали: усі 1 790 живих застосунків v0, які ми просканували, отримали A, а єдина спільна для них знахідка це налаштування заголовків на домені, з якого v0 їх віддає.
- Це здебільшого факт про те, чим ці застосунки є. Лише 17 із 1 790 згадували базу даних, і жоден із цих 17 не дав нашій перевірці бази даних відповіді, яку вона могла б оцінити.
- Під’єднайте Supabase або опублікуйте застосунок на власному домені, і перевірки, що повернулися порожніми, почнуть мати що перевіряти.
Ви описали v0 застосунок, подивилися, як він його будує, і отримали посилання,
що закінчується на vusercontent.net. Воно працює, виглядає завершеним, і,
можливо, ви вже комусь його надіслали. Перш ніж справжні клієнти введуть туди
свої дані, ви пошукали безпеку v0, і частина того, що знайшлося, була історією
про зловмисників, які за допомогою v0 будують фальшиві сторінки входу.
Ця історія про те, що інші люди роблять цим інструментом. Ця стаття про застосунок, який зробили ним ви, і для нього в нас є вимірювання. З 12 по 14 серпня 2026 року ми прогнали ті самі дев’ять зовнішніх перевірок, які будь-хто може безкоштовно запустити на нашій головній сторінці, по 30 998 живих застосунках, і 1 790 із них були застосунками v0. Усі 1 790 отримали A.
Ось що рейтинг розуміє неправильно: ця оцінка A говорить більше про те, що було перевіряти, ніж про v0. Як рейтинг вона робить v0 найбезпечнішим builder, якого ми вимірювали. Прочитана разом зі своїми знаменниками, вона описує фронтенди, за якими нічого немає, і перестає описувати ваш того дня, коли ви під’єднуєте базу даних.
Чи безпечний v0?
У всьому, що ми змогли виміряти щодо самого v0, так. Його єдина знахідка належить домену, з якого v0 віддає ваш застосунок, і нічого іншого не з’явилося в жодному з 1 790, у жодній із дев’яти перевірок. Чого це не може сказати, так це того, як поводиться ваш застосунок, коли в ньому є дані, бо майже жоден із цих їх не мав.
Уявіть попередній перегляд v0 як картотечну шафу у виставковій залі. Шухляди висуваються, етикетки на місці, будь-хто, хто проходить повз, може висунути одну, і кожна шухляда порожня. Наші перевірки спробували кожну шухляду й ні в одній нічого не знайшли, і це точний звіт про порожню шафу.
Наскільки вона порожня, кажуть цифри. Лише 17 із 1 790 згадували проєкт
Supabase десь у коді, який вони віддають, і на всіх 17 наша перевірка бази
даних не отримала відповіді, яку могла б оцінити, тож кількість читабельних
таблиць на v0 дорівнює нулю з нуля. Усі 1 790 віддавалися з vusercontent.net,
який Vercel у своєму
запиті до Public Suffix List
описує як місце, «де ми розміщуємо вміст, надісланий користувачами» v0.
Застосунок, який ви публікуєте, потрапляє на адресу vercel.app або на ваш
домен, де ззовні ніщо не позначає його як v0, тож такі застосунки до підрахунку
не входять. Методика й повні дані є
у звіті.
Тож «чи безпечний v0» це три запитання:
- Інструмент. Що v0 перевіряє в коді, який пише, і що відмовляється публікувати. Ця частина належить Vercel, і вона задокументована.
- Попередній перегляд. Шафа у виставковій залі, за своєю адресою
vusercontent.net. Усі застосунки, які ми виміряли, були на цьому етапі. - Застосунок, який ви наповнюєте. Той самий код, коли в ньому дані ваших клієнтів або коли він працює на вашому домені. Майже ніщо з виміряного нами так далеко не дійшло.
Що покриває безпека v0 до публікації
Три речі, і власна документація v0 називає кожну з них.
Він перечитує код, який написав.Сторінка безпеки v0 каже, що весь згенерований
код «проходить аналіз безпеки перед виконанням» і що v0 «аналізує використання
NEXT_PUBLIC_ і попереджає користувачів про можливі ризики безпеки».
NEXT_PUBLIC_ це префікс, який каже Next.js, фреймворку, на якому пише v0,
покласти значення в код, що його завантажує кожен відвідувач.
Що цей префікс робить із ключем,
розповідає окрема стаття.
Він відмовляє деяким деплоям. У серпні 2025 року Vercel написав, що v0 за попередні 30 днів заблокував понад 17 000 деплоїв лише через відкриті секрети, а від запуску понад 100 000 небезпечних деплоїв. Це цифри Vercel про блокування Vercel, і воно стосується деплоїв на Vercel. Частина нашого нуля може бути роботою цього блокування. Наскільки велика, ззовні сказати не можемо.
Інтеграція Supabase ставить префікс у правильне місце. Під’єднана через
Vercel Marketplace, вона додає дюжину змінних середовища, і лише дві з них мають
NEXT_PUBLIC_: адреса проєкту й публічний ключ, обидва призначені бути
публічними. SUPABASE_SECRET_KEY і пароль бази даних лишаються без нього, на
сервері.
Чому в попередньому перегляді v0 бракує заголовків безпеки
Бо їх задає домен попереднього перегляду v0, кожен застосунок на ньому отримує ту саму відповідь, і зсередини попереднього перегляду ви цього не зміните.
Заголовки безпеки це інструкції, які сайт надсилає з кожною сторінкою: завжди використовуй HTTPS, не дозволяй іншому сайту показувати цю сторінку всередині своєї, не вгадуй, що це за тип файлу. Надсилає їх той, хто віддає сторінку. Попередні перегляди, які ми відкрили 3 жовтня 2026 року, надсилали один із п’яти, які шукає наша перевірка, той, що примушує використовувати HTTPS, і жодного з інших чотирьох. Це знахідка на всіх 1 790 застосунках v0, і вона єдина.
Виставкова зала сама вирішує, які в неї двері й сигналізація, і ви не можете
перепаяти їх для однієї шафи у своєму кутку. Щойно ви публікуєте, шафа стоїть у
вашому офісі, а заголовки стають налаштуванням у vercel.json або у вашій
конфігурації Next.js.
Що робить кожен заголовок і які два нічого не коштують,
розповідає окрема стаття.
Чи публічний попередній перегляд на vusercontent.net?
Вважайте його публічним. Будь-хто з адресою може його відкрити, а адреси поширюються.
Кожен із 1 790 відкрився для нас без входу, і нам не довелося вгадувати жодного: їхні адреси взялися з публічного вебархіву, який уже зберіг копію кожного. Налаштування спільного доступу v0 вирішують, хто бачить ваш чат: за замовчуванням приватний, далі ваша команда, будь-хто з посиланням або будь-хто в інтернеті. Документація не каже, що ці налаштування поширюються на попередній перегляд.
Тож попередній перегляд це шафа у виставковій залі. Вона годиться, щоб показати
комусь дизайн, і не годиться для справжніх документів будь-кого. Vercel додав
vusercontent.net до Public Suffix List у вересні 2024 року, і через це
браузери вважають кожен попередній перегляд окремим сайтом, тож один попередній
перегляд не може ставити cookie для всіх інших. Це тримає попередні перегляди
окремо один від одного і нічого не робить для того, щоб ваш лишався приватним.
Якщо ви тут, бо хтось надіслав вам посилання на vusercontent.net: домен
належить Vercel, а сторінку на ньому зробив той, хто попросив її промптом.
1 липня 2025 року
Okta повідомила
про зловмисників, які за допомогою v0 будували копії справжніх сторінок входу, і
Vercel обмежив доступ до тих, які знайшов. Не вводьте пароль у форму входу на
такій адресі, якщо ви на неї не чекали.
Що змінюється, коли ви під’єднуєте Supabase до v0
Ви починаєте наповнювати шухляди, і перевірки, що повернулися порожніми на v0, починають мати що перевіряти.
v0 додає Supabase в один клік і, словами його власної документації, «може генерувати й виконувати SQL. Це дає змогу створювати, оновлювати й видаляти таблиці». Саме так з’являються ваші таблиці. Кожна таблиця це шухляда, а Row Level Security це замок на ній: налаштування для кожної таблиці, яке вирішує, які рядки може читати публічний ключ на вашій сторінці. Цей ключ має бути публічним, тож лише замок вирішує, що отримає незнайомець.
Supabase ставить цей замок за замовчуванням на таблиці, створені в його Table Editor, і не ставить на таблиці, створені виконанням SQL, а саме так їх створює v0.
Саме туди лягли серйозні знахідки в усіх інших builder. Із 3 553 застосунків
Lovable, чию базу даних ми змогли запитати, 2 017 віддали рядки на запит без
входу, і цифри Lovable показують, як виглядають
результати builder, коли в шухлядах уже лежать документи. Замок, який відчиняє
будь-який ключ, теж не замок: політика з using (true) пропускає всіх, поки
дашборд показує таблицю як захищену.
RLS увімкнено, а таблиця все одно публічна
розповідає всю історію.
Якщо ж ваші дані стоять за маршрутами, на які відповідає ваш власний серверний код, те саме запитання стосується цих маршрутів: що означає відкритий API-ендпоінт.
Що змінюється, коли ви публікуєте або деплоїте самі
Шафа переїжджає з виставкової зали до вашого офісу, і рішення, які ухвалював домен v0, стають вашими.
Публікація з v0 створює проєкт у Vercel і питає про три речі, згідно з
документацією v0 про деплої: назву проєкту,
хто може відкривати опублікований застосунок, і домен, адресу vercel.app або
ваш власний. На другому пункті не поспішайте. Які варіанти ви бачите, залежить
від вашого тарифу, і якщо до перевірки тримати застосунок лише для команди або
за паролем, сторонні лишаються ззовні, поки ви дивитеся.
Під час публікації до вас переходять три речі:
- Заголовки. Двері й сигналізацію офісу тепер налаштовуєте ви.
- Змінні середовища. Вони живуть у налаштуваннях вашого проєкту, і саме в
цьому списку ключ отримує префікс
NEXT_PUBLIC_або не отримує. - Перевірка вашого деплою, якщо ви йдете з Vercel. Vercel описує своє блокування як те, що зупиняє деплої на Vercel, тож код, який ви завантажуєте й розміщуєте деінде, виходить без цієї перевірки.
Так чи інакше, ви вийшли за межі вибірки, яку ми виміряли. Застосунок v0 на власному домені з базою даних за ним має більше спільного із застосунками Bolt, які ми виміряли, ніж із цими 1 790 попередніми переглядами.
Як перевірити власний застосунок v0
П’ять речей, і перші три починають мати значення, лише коли ви під’єднали базу даних або опублікували застосунок. Використовуйте приватне вікно, щоб ваш власний вхід не відповідав за незнайомця.
- Прочитайте свої змінні середовища. У v0 вони в меню проєкту, у розділі
Settings, Environment Variables. Усе, що починається з
NEXT_PUBLIC_, є в коді, який завантажує кожен відвідувач. Адреса проєкту й публічний ключ там на місці. Ключ, за який вам виставляють рахунок,SUPABASE_SECRET_KEYі будь-що з паролем там бути не мають ніколи. Якщо хтось із них колись мав префікс, спершу ротуйте його в провайдера, бо старе значення працює, доки ви цього не зробите. - Прочитайте замок на кожній таблиці. У Supabase відкрийте Authentication → Policies і пройдіться списком. Таблицю з вимкненою Row Level Security може прочитати будь-хто, у кого є адреса вашого проєкту, а ця адреса є на вашій сторінці. Політика, яка дозволяє все всім, вважається вимкненою.
- Оберіть, хто бачить застосунок, коли публікуєте. Лише команда або пароль, доки перші два пункти не зроблено.
- Налаштуйте заголовки, щойно домен стане вашим. Два з них займають по одному рядку.
- Потім подивіться ззовні. Наше сканування виконує всі дев’ять перевірок на опублікованій адресі так, як це зробив би незнайомець, триває приблизно 20 секунд і не потребує акаунта: просканувати застосунок безкоштовно.
Сканування ззовні не бачить ні коду, який написав v0, ні чату, у якому ви його написали, ні таблиці, яку ваші сторінки ніколи не згадують. Перевірки v0 бачать код зсередини й не бачать, що незнайомець отримує за адресою. Запускайте перевірки v0, поки будуєте, дивіться ззовні після публікації, і якщо вони колись не погодяться, чи читабельна таблиця, довіряйте відповіді ззовні, бо саме її отримує незнайомець. Версія простою мовою для цієї платформи: чи безпечний ваш застосунок v0.
Щоб так і лишалося після публікації
Оцінка A на попередньому перегляді описує попередній перегляд. Того дня, коли ви під’єднуєте базу даних або публікуєте на власному домені, ваша оцінка може змінитися, і ніщо на вашому екрані не скаже, що вона змінилася.
Reeve Monitor проганяє дев’ять перевірок знову за вас:
- усі дев’ять перевірок щогодини, для трьох застосунків максимум
- чи працює застосунок, кожні 60 секунд
- повідомлення, коли результат змінюється, щоб нова таблиця чи новий ключ не чекали, поки ви глянете
- місячний звіт про те, що він побачив
Monitor коштує $12 на місяць за прайсом, із сімома безкоштовними днями до першого списання. Сторінка цін іноді нижча за цифру тут і ніколи не вища.
Якщо ваш застосунок v0 тримає дані в Supabase, Reeve Care зберігає копію вашої бази даних Supabase.
- зашифрована копія щоночі, у місці, до якого ваш проєкт не дотягнеться
- кожна копія перевірена, перш ніж її зарахувати, з підрахунком рядків у кожній таблиці
- відновлення в один клік, коли воно знадобиться
- ваші завантажені файли теж, щойно ви під’єднаєте облікові дані Storage
- усе, що робить Monitor
Care коштує $49 на місяць за прайсом за один застосунок, із тими самими сімома безкоштовними днями.
Документація v0 каже, що він може не лише створювати таблиці, а й видаляти їх, і жодна з дев’яти перевірок вище не повернула б рядки такої таблиці. День, коли ШІ-агент видалив продакшн-базу даних показує, як це виглядає зсередини.
Що зробити цього тижня
Що робити
- Якщо ваш застосунок v0 досі попередній перегляд, вважайте його адресу публічною й не тримайте в ньому дані реальних людей.
- Перш ніж під’єднати базу даних, вирішіть, де живе кожен ключ:
NEXT_PUBLIC_для адреси проєкту й публічного ключа, а для всього іншого нічого поруч із браузером. - Після під’єднання Supabase прочитайте політику кожної таблиці, яку створив v0, і вважайте вимкненою таку, що дозволяє все всім.
- Публікуйте лише для команди або за паролем, доки це не зроблено, а потім перевірте опубліковану адресу ззовні.
- Тримайте копію своєї бази даних там, куди не дістануть ні v0, ні ваш проєкт, і перевірте, що копія відновлюється.
Почніть зі змінних середовища, бо саме вони вирішують, що завантажує кожен відвідувач. Якщо ви ще обираєте builder, який AI-конструктор застосунків найбезпечніший ставить усі п’ять поруч.
Поширені запитання
Чи безпечний v0?
У тому, що ми змогли виміряти, v0 вийшов чистішим за будь-який інший просканований builder. Усі 1 790 живих застосунків v0 отримали A, а єдина спільна для них знахідка була налаштуванням браузерних заголовків на домені, з якого v0 віддає попередні перегляди. Проте лише 17 із них згадували базу даних, і жоден із цих 17 не відповів нашій перевірці бази даних, тож оцінка A здебільшого описує фронтенди, за якими нічого немає. Щойно ви під’єднуєте Supabase або публікуєте застосунок на власному домені, перевірки, що вирішують про серйозну оцінку, починають стосуватися і вас.
Чи безпечні застосунки v0 за замовчуванням?
Частини, які контролює v0, у доброму стані. Його документація каже, що згенерований код проходить аналіз безпеки перед виконанням і що v0 попереджає про ризиковане використання префікса NEXT_PUBLIC_, а в серпні 2025 року Vercel повідомив, що v0 за 30 днів заблокував понад 17 000 деплоїв через відкриті секрети. Чого не вирішує жодне налаштування за замовчуванням, так це замок на ваших таблицях. Supabase не вмикає Row Level Security для таблиць, створених виконанням SQL, а саме так їх створює v0, тож прочитайте політику кожної таблиці після того, як під’єднаєте базу даних.
Чи публічна URL-адреса попереднього перегляду на vusercontent.net?
Вважайте її публічною. Кожен із 1 790 попередніх переглядів v0, які ми просканували, відкрився без входу, а їхні адреси ми знайшли в публічному вебархіві. Налаштування спільного доступу у v0 визначають, хто бачить ваш чат, і документація не каже, що вони поширюються на попередній перегляд. Не тримайте в попередньому перегляді дані реальних людей, а під час публікації оберіть видимість лише для команди або за паролем, доки застосунок не буде готовий для сторонніх.
Чи безпечний vusercontent.net?
Домен справжній і належить Vercel, який розміщує на ньому те, що люди генерують у v0. Але сторінку за конкретною адресою зробив той, хто попросив її промптом, і в липні 2025 року Okta повідомила про зловмисників, які за допомогою v0 будували копії сторінок входу. Vercel обмежив доступ до тих, які знайшов. Якщо посилання, на яке ви не чекали, відкриває форму входу на адресі vusercontent.net, не вводьте туди пароль.
Що змінюється, коли я під’єдную Supabase до v0?
Тепер за вашим фронтендом є дані, тож перевірки, що повернулися порожніми на застосунках v0, починають мати що перевіряти. v0 може виконувати SQL, щоб створювати таблиці, а Supabase не вмикає Row Level Security для таблиць, створених так. Ваш публічний ключ має бути на сторінці, тож лише політика кожної таблиці вирішує, що може прочитати незнайомець. Із 3 553 застосунків Lovable, чию базу ми змогли запитати, 2 017 віддали рядки на запит без входу.
Що змінюється, коли я сам деплою код із v0?
Три речі стають вашими. Заголовки безпеки, які обирав домен попереднього перегляду v0, стають налаштуванням у vercel.json або у вашій конфігурації Next.js. Ваші змінні середовища, і те, які з них мають префікс NEXT_PUBLIC_, живуть у вашому власному проєкті. А код, який ви завантажуєте й розміщуєте деінде, ніж у Vercel, більше не проходить перевірку деплою, яку Vercel описує для v0. Подивіться на опубліковану адресу ззовні, щойно вона запрацює.