[{"data":1,"prerenderedAt":269},["ShallowReactive",2],{"research-uk":3},{"id":4,"title":5,"aside":6,"body":9,"coverAlt":242,"description":243,"extension":244,"faq":245,"lede":261,"meta":262,"navigation":263,"path":264,"published":265,"seo":266,"stem":267,"updated":265,"__hash__":268},"research_uk\u002Fresearch\u002Fvibe-coded-app-security-2026.md","Безпека vibe-coded застосунків у 2026 році",[7,8],"Лише погляд ззовні. Ми читаємо те, що браузер відвідувача читає й так: код, який віддає застосунок, заголовки, які він повертає, адреси, які він сам називає у власному коді. Без входів, без вгадування паролів, нічого не завантажено.","Тут і у файлі даних не названо жодного застосунку. Кожне число несе метод, яким його отримано, а файл унизу збирає всі агрегати в одну таблицю, якщо ви хочете перевірити підрахунки.",{"type":10,"value":11,"toc":224},"minimark",[12,17,21,24,27,31,34,37,40,44,47,50,53,56,60,63,66,70,73,76,79,82,86,89,92,95,98,102,105,108,111,125,129,132,135,138,142,214,218,221],[13,14,16],"h2",{"id":15},"шість-чисел-які-розповідають-історію","Шість чисел, які розповідають історію",[18,19,20],"p",{},"Ці шість чисел і є звітом. Усе, що йде після них, це база, на якій стоїть кожне\nз них, і те, як ми її отримали.",[22,23],"research-key-findings",{},[18,25,26],{},"Типові налаштування платформ підводять майже скрізь, і більшість тих провалів\nпомірні. Те, що може змінити лише той, хто будував застосунок, підводить значно\nрідше, і саме воно виставляє чужі дані у відкритий інтернет.",[13,28,30],{"id":29},"які-оцінки-мають-ці-застосунки-від-a-до-f","Які оцінки мають ці застосунки, від A до F",[18,32,33],{},"Reeve оцінює застосунок так, як це робить шкільний табель. Від ста віднімаються\nбали, зважені за серйозністю знахідки. Далі найсерйозніша знахідка встановлює\nстелю: з однією критичною знахідкою застосунок не підніметься вище за D, а з\nоднією високою не підніметься вище за C.",[35,36],"research-grades",{},[18,38,39],{},"Більшість застосунків потрапляє в A або B. Смуга D і F невелика. Це ті\nзастосунки, де сторонній уже може читати чужі рядки.",[13,41,43],{"id":42},"що-ми-перевіряли-і-скільки-застосунків-провалило-кожну-перевірку","Що ми перевіряли і скільки застосунків провалило кожну перевірку",[18,45,46],{},"Кожна перевірка ставить одне запитання про застосунок ззовні, і кожну рахують\nвід застосунків, де вона отримала відповідь. Застосунок, до якого перевірка не\nдісталася, лишається поза базою цієї перевірки, а не рахується чистим. Про такі\nсканування каже, що перевірити не вдалося, і ця сторінка робить так само.",[48,49],"research-checks-table",{},[18,51,52],{},"Два рядки виглядають страшніше, ніж вони є. Заголовки безпеки є вказівками, які\nхостинг-платформа надсилає браузеру, і коли одного бракує, перед одним класом\nатак стає на одну перешкоду менше. Опублікована source map це оригінальний код\nзастосунку, покладений поруч зі скомпільованою версією: вона показує\nзловмиснику, де шукати, а сама по собі не віддає нічого.",[18,54,55],{},"Рядок може виглядати серйозним і через те, що жменя застосунків у ньому віддала\nщось поважне, поки решта віддала щось звичайне. Файл даних розкладає кожен\nрядок за типами ключів, щоб було видно, де що.",[13,57,59],{"id":58},"більш-ніж-половина-придатних-до-перевірки-supabase-застосунків-віддає-дані-таблиць","Більш ніж половина придатних до перевірки Supabase-застосунків віддає дані таблиць",[18,61,62],{},"До цього числа ми поверталися знову і знову.",[18,64,65],{},"Проєкт Supabase відкритий для інтернету за задумом. Застосунок, який працює в\nбраузері, говорить із базою даних напряму, ключем, що й має бути публічним, а\nміж стороннім і рядками стоїть Row Level Security: правило на кожній таблиці.\nВимкніть це правило або напишіть політику, яка пускає всіх, і будь-яку таблицю\nпроєкту можна прочитати одним запитом і без пароля.",[67,68],"research-stat",{"id":69},"supabase",[18,71,72],{},"Менш ніж половину застосунків, які називають проєкт Supabase, узагалі можна\nперевірити. Частина веде трафік бази через власний бекенд, куди перевірка\nззовні піти не може, тож про них ми не кажемо нічого. Частка вище рахується від\nзастосунків, які відповіли.",[67,74],{"id":75},"rlsSplit",[18,77,78],{},"Поділ і є корисною частиною. Читабельна таблиця з назвою settings чи content є\nпомилкою. Читабельна таблиця з назвою users, profiles чи orders означає чужі\nперсональні дані у відкритому інтернеті, і той, хто будував застосунок, майже\nнапевно вважає їх приватними.",[18,80,81],{},"Перевірка ніколи не читає рядка. Вона питає базу, скільки рядків було б видно,\nі зчитує це число із заголовка відповіді. Цього досить, щоб відрізнити таблицю\nз правилом RLS від таблиці без нього, і далі перевірка не йде.",[13,83,85],{"id":84},"ті-самі-девять-перевірок-за-інструментами","Ті самі дев’ять перевірок, за інструментами",[18,87,88],{},"Кожен застосунок згруповано за інструментом, у якому його опубліковано, і\nвиміряно проти інших застосунків цього інструмента.",[90,91],"research-builders-table",{},[18,93,94],{},"Майже все, що порівнює ця таблиця, це типові налаштування. Ніхто не обирає\nLovable чи Bolt через заголовки безпеки. Їх ставить платформа кожному\nзастосунку, який хостить, тож одна зміна там зсуває цілий стовпець цієї\nтаблиці.",[18,96,97],{},"Два обмеження, перш ніж хтось процитує рядок. Ми приписуємо застосунки за\nдоменом публікації, тож застосунок, що переїхав на власний домен, лишається\nпоза цією таблицею, а це часто саме доробленіші. А інструмент, який веде трафік\nбази через власний бекенд, ззовні не перевірити взагалі. Порожнє місце там\nозначає, що ми не змогли виміряти, і нічого не каже про те, наскільки ті\nзастосунки безпечні.",[13,99,101],{"id":100},"два-типи-знахідок-два-типи-виправлень","Два типи знахідок, два типи виправлень",[18,103,104],{},"Знахідки на цій сторінці лягають у дві групи, і ці групи потребують різних\nрук.",[106,107],"research-controls",{},[18,109,110],{},"Перша група є продуктовим рішенням у компанії. Одна-єдина зміна типового\nналаштування хостингу зсуває кожен застосунок на тій платформі одразу, і саме\nтому ті рядки виходять такими однорідними, а виправити їх найдешевше.",[18,112,113,114,119,120,124],{},"Друга група лежить на тому, хто будував застосунок. Жодна хостинг-платформа не\nзнає, які з ваших таблиць мають бути публічними і якому ключу місце на сервері.\nКожна критична знахідка цього звіту лежить у цій групі.\n",[115,116,118],"a",{"href":117},"\u002Fis","Посібники з безпеки за інструментами"," і\n",[115,121,123],{"href":122},"\u002Fchecklist","чекліст перед запуском"," починаються обидва звідти.",[13,126,128],{"id":127},"що-вайб-кодери-роблять-правильно","Що вайб-кодери роблять правильно",[18,130,131],{},"Ми порахували й те, що пройшло, на тих самих застосунках.",[133,134],"research-clean-rates",{},[18,136,137],{},"Остання картка саме та, де загальні сканери помиляються. Публічний ключ у\nфронтенді (анонімний ключ Supabase, публічний ключ Stripe) там і має бути: він\nстворений, щоб його читали, а захист живе в правилах за ним. Позначити його\nпроблемою означає відправити людину міняти налаштування, яке вже було\nправильним.",[13,139,141],{"id":140},"як-ми-вимірювали-і-де-межі","Як ми вимірювали і де межі",[143,144,145,160,175,194],"research-method",{},[146,147,149,154,157],"template",{"v-slot:origin":148},"",[150,151,153],"h3",{"id":152},"звідки-взялися-застосунки","Звідки взялися застосунки",[18,155,156],{},"Три списки, зведені разом і без повторів: застосунки, які люди публікували в X\nі на Reddit, застосунки, запущені на Show HN, і застосунки, які ми перелічили з\nвласних доменів публікації самих інструментів. Домени публікації дають основну\nмасу вибірки, і лише цей список масштабується. Два інші знаходять лише той\nзастосунок, про який хтось вирішив написати.",[18,158,159],{},"Мертві хости відсіялися першими, і судили ми про це, читаючи саму сторінку.\nВидалений деплой часто досі відповідає цілком бадьорим 200 OK.",[146,161,162,166,169,172],{"v-slot:denominator":148},[150,163,165],{"id":164},"правило-знаменника","Правило знаменника",[18,167,168],{},"Кожна частка на цій сторінці рахується від застосунків, яким ця перевірка\nзмогла відповісти, і ніколи від усієї вибірки. Перевірка, яка не дісталася\nзастосунку, лишає його поза власною базою і ніколи не рахує чистим. Два числа\nпоруч із кожною смугою і є тією базою, щоб кожен бачив, яку саме читає.",[67,170],{"id":171},"inconclusive",[18,173,174],{},"Оцінки пораховано від меншого числа з тієї самої причини. Застосунок, який\nповернув замало, щоб його класифікувати, випадає з усіх чисел вище, а не\nотримує оцінку навмання.",[146,176,177,181],{"v-slot:scope":148},[150,178,180],{"id":179},"що-ми-робили-і-чого-не-робили","Що ми робили і чого не робили",[182,183,184,188,191],"ul",{},[185,186,187],"li",{},"Лише пасивне читання: запити, які браузер відвідувача робить і так, плюс\nпублічні адреси, на які вказує сам застосунок.",[185,189,190],{},"Перевірка бази бере кількість рядків із заголовка відповіді. Ми жодного разу\nне прочитали рядка, не завантажили файла, не зайшли в акаунт і не вгадували\nпароля.",[185,192,193],{},"Жодного застосунку не названо: ні тут, ні у файлі даних. Список застосунків\nпоряд із їхніми слабкими місцями став би списком мішеней, і ми не тримаємо\nтакого у придатному до публікації вигляді.",[146,195,196,200],{"v-slot:limits":148},[150,197,199],{"id":198},"межі-про-які-треба-знати","Межі, про які треба знати",[182,201,202,205,208,211],{},[185,203,204],{},"Вибірка схиляється до новіших застосунків. Застосунок, який переїхав на\nвласний домен, ззовні неможливо прив’язати до інструмента, а це часто саме\nусталеніші застосунки.",[185,206,207],{},"Колір у рядку позначає найгірший випадок, який ми бачили, а ним може бути\nодин застосунок із сотень. Файл даних розкладає кожен рядок за точним типом\nключа.",[185,209,210],{},"Це вікно у три дні серпня. Застосунок, полагоджений наступного тижня, все\nодно рахується тут таким, яким був того дня, коли ми дивилися.",[185,212,213],{},"Автоматична зовнішня перевірка не є аудитом. Відсутність знахідок не є\nгарантією.",[13,215,217],{"id":216},"скористайтеся-цими-числами","Скористайтеся цими числами",[18,219,220],{},"Журналісти, дослідники й усі, хто про це пише, можуть повторно використовувати\nці дані із зазначенням джерела. Файл нижче містить усі агрегати цієї сторінки в\nодній пласкій таблиці й не називає жодного застосунку.",[222,223],"research-cite",{},{"title":148,"searchDepth":225,"depth":225,"links":226},3,[227,229,230,231,232,233,234,235,241],{"id":15,"depth":228,"text":16},2,{"id":29,"depth":228,"text":30},{"id":42,"depth":228,"text":43},{"id":58,"depth":228,"text":59},{"id":84,"depth":228,"text":85},{"id":100,"depth":228,"text":101},{"id":127,"depth":228,"text":128},{"id":140,"depth":228,"text":141,"children":236},[237,238,239,240],{"id":152,"depth":225,"text":153},{"id":164,"depth":225,"text":165},{"id":179,"depth":225,"text":180},{"id":198,"depth":225,"text":199},{"id":216,"depth":228,"text":217},"Темна картка з логотипом Reeve, назвою звіту та кількістю живих застосунків зі сканування, набраною одним великим числом.","Ми прогнали десятки тисяч живих застосунків із Lovable, Bolt, v0, Replit і Base44 через ті самі дев’ять зовнішніх перевірок. Ось що вийшло.","md",[246,249,252,255,258],{"q":247,"a":248},"Чи можете ви сказати, у яких застосунків які проблеми?","Ні. Лише кількості й частки, ніколи назви, а файл даних містить рівно те, що показує сторінка. Список застосунків поряд із їхніми слабкими місцями став би списком мішеней, і ми його не робитимемо.",{"q":250,"a":251},"Мій застосунок може бути в цих даних. Що робити?","Проскануйте його самі. Це ті самі дев’ять перевірок, триває близько двадцяти секунд, і ви отримаєте оцінку та те, що сторонній уже бачить. Ніщо на цій сторінці нікого не називає, тож це єдиний спосіб дізнатися, як у вас справи.",{"q":253,"a":254},"Невже таблиця бази, яку читає будь-хто, аж настільки серйозна річ?","Якщо будь-хто в інтернеті може витягнути ті рядки одним запитом і без пароля, так. Читабельна таблиця з назвою settings є недбалістю. Читабельна таблиця з назвою users чи orders є витоком даних, якого ще ніхто не помітив.",{"q":256,"a":257},"Чому ви вважаєте публічні ключі нормальними?","Анонімний ключ Supabase створений, щоб бути публічним. Захистом є правила бази даних за ним, а не сам ключ. Інструменти, які позначають такі ключі, привчають людей проминати наступне попередження, а воно може виявитися важливим.",{"q":259,"a":260},"Чи будете ви робити це знову?","Так. Сканування тривають, і наступне видання виросте з них. Файл даних фіксує вікно, з якого взято ці числа, тож стара копія не зійде за поточну.","Ми шукали живі застосунки, зроблені у Lovable, Bolt, v0, Replit чи Base44, і провели кожен через ті самі дев’ять перевірок, які будь-хто може безкоштовно зробити з головної сторінки Reeve. Ця сторінка і є тим, що повернулося.",{},true,"\u002Fresearch\u002Fvibe-coded-app-security-2026","2026-08-19",{"title":5,"description":243},"research\u002Fvibe-coded-app-security-2026","G1IG0weB8Or5jp6EQ-G5tNnFOE3AWwuaVfVL3XQizCM",1787826051116]