[{"data":1,"prerenderedAt":1007},["ShallowReactive",2],{"blog-uk-is-lovable-safe":3,"blog-index-uk":773},{"id":4,"title":5,"body":6,"category":725,"cover":726,"coverAlt":727,"description":728,"draft":729,"extension":730,"faq":731,"image":750,"keywords":751,"meta":761,"navigation":762,"ogTitle":763,"path":764,"published":765,"seo":766,"stem":767,"tldr":768,"updated":765,"__hash__":772},"blog_uk\u002Fblog\u002Fis-lovable-safe.md","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable",{"type":7,"value":8,"toc":708},"minimark",[9,13,21,24,29,32,35,57,60,66,70,83,220,223,228,240,247,251,254,264,275,287,290,301,305,308,314,319,341,348,352,355,362,368,375,387,391,394,401,408,411,415,418,421,427,430,434,437,440,534,542,555,562,566,569,577,581,584,619,632,636,639,642,653,664,672,676,700],[10,11,12],"p",{},"Ви побудували щось на Lovable, воно працює, і ви вже майже пускаєте туди\nсправжніх людей. Десь того тижня ви набрали «чи безпечний lovable» у пошуку, і\nповернулася або сторінка про оприлюднення вразливості 2025 року, або\nпостачальник, що продає вам сканування. Жодна з двох не сказала нічого про\nзастосунок, який ви от-от опублікуєте.",[10,14,15,16,20],{},"Ось у чому помиляється більшість тих відповідей: ",[17,18,19],"strong",{},"«чи безпечний Lovable» це\nтри питання, вдягнені в одне речення",", і те з них, яке вирішує, чи зможуть\nнезнайомці прочитати дані ваших користувачів, майже ніхто не вимірює.",[10,22,23],{},"Ми можемо його виміряти. Між 12 і 14 серпня 2026 року ми прогнали 30 998 живих\nзастосунків через ті самі дев’ять зовнішніх перевірок, які кожен може безкоштовно\nзапустити на нашій головній сторінці, і 18 554 з них були опубліковані на\nLovable. Це наша найбільша когорта, три з кожних п’яти застосунків, які ми\nвзагалі сканували. Ось що повернулося для них і де закінчується наш огляд.",[25,26,28],"h2",{"id":27},"чи-безпечний-lovable","Чи безпечний Lovable?",[10,30,31],{},"Як платформа, так, і з більшим відривом, ніж ми очікували. Те, що видає сам\nLovable, виявилося найчистішим з п’яти виміряних конструкторів. Усе, що\nвирішувало оцінку, було всередині застосунку, який побудував його власник.",[10,33,34],{},"Уявіть крамницю, склад якої через дорогу. Lovable будує крамницю: вітрини,\nприлавок, вивіску. Склад належить Supabase, і в нього власний замок на власних\nдверях. Що крамниця видає перехожому, це одне питання. Що склад видає кожному,\nхто підійде і попросить, це зовсім інше, і жодне прибирання в крамниці цього не\nзмінює.",[36,37,38,45,51],"ol",{},[39,40,41,44],"li",{},[17,42,43],{},"Платформа."," Чи публікує Lovable ваш застосунок як належить: дійсний\nсертифікат, домен, що не спливає, нічого, що витікає зі збірки. Це крамниця.",[39,46,47,50],{},[17,48,49],{},"Агент."," Чи надійний код, який пише ШІ Lovable. Жодне зовнішнє сканування\nне бачить проводки, і ця стаття каже про це, замість вгадувати.",[39,52,53,56],{},[17,54,55],{},"Застосунок, який ви опублікували."," До чого незнайомець дістається з\nтротуару: ключ у коді, який завантажує браузер, бакет сховища, що перелічує\nсвої файли, таблиця бази, що відповідає кожному, хто спитає.",[10,58,59],{},"Наші перевірки читають третє питання і дві частини першого. Щодо платформи:\nсертифікат був дійсний на всіх 18 486 застосунках, де ми змогли його прочитати,\nі жоден домен з 18 554 не наближався до закінчення. Щодо агента нам нічого\nвимірювати. Щодо застосунку ми маємо 18 554 відповіді.",[61,62],"diagram",{"alt":63,"caption":64,"src":65},"Три панелі поруч. На першій логотип Lovable із замком і сертифікатом. На другій знак коду з блиском над ним. На третій сторінка браузера з окремою базою даних назовні, троє відвідувачів, що тягнуться до обох, і лупа лише над цією панеллю, а під нею число 18 554.","Три питання всередині одного пошуку. Сканування ззовні читає третю панель і частину першої, і нічого зі середньої.","\u002Fblog\u002Fis-lovable-safe\u002Fthree-questions-1600x700.png",[25,67,69],{"id":68},"що-ми-знайшли-в-18-554-застосунках-lovable","Що ми знайшли в 18 554 застосунках Lovable",[10,71,72,73,76,77,82],{},"Дев’ять перевірок, ззовні, без входу і без доступу до чийогось акаунта. Ми\nжодного разу не читали рядок: там, де база відповідала, ми питали, скільки\nрядків вона віддала б, і на цьому спинялися. Жоден застосунок не названо ні тут,\nні деінде в тому, що ми публікуємо. Кожна частка нижче рахується від застосунків,\nна яких перевірка ",[17,74,75],{},"відповіла",", бо перевірка, що не змогла завершитися, це\nневідомо, а не пройдено, і саме це правило рухає знаменники. Метод і дані\n",[78,79,81],"a",{"href":80},"\u002Fresearch\u002Fvibe-coded-app-security-2026","у звіті",".",[84,85,86,103],"table",{},[87,88,89],"thead",{},[90,91,92,96,100],"tr",{},[93,94,95],"th",{},"Що ми перевіряли",[93,97,99],{"align":98},"right","Застосунки Lovable",[93,101,102],{},"Хто це вирішує",[104,105,106,118,129,139,149,160,170,180,199,210],"tbody",{},[90,107,108,112,115],{},[109,110,111],"td",{},"Бракує заголовків безпеки браузера",[109,113,114],{"align":98},"18 539 з 18 554 (99 %)",[109,116,117],{},"Хостинг Lovable",[90,119,120,123,126],{},[109,121,122],{},"Таблиця бази, читана без входу",[109,124,125],{"align":98},"2 017 з 3 553 (57 %)",[109,127,128],{},"Ваш застосунок",[90,130,131,134,137],{},[109,132,133],{},"Щось схоже на ключ у коді, який завантажує відвідувач",[109,135,136],{"align":98},"822 з 18 554 (4 %)",[109,138,128],{},[90,140,141,144,147],{},[109,142,143],{},"Бакет сховища, що перелічує свої файли",[109,145,146],{"align":98},"768 з 16 565 (5 %)",[109,148,128],{},[90,150,151,154,157],{},[109,152,153],{},"Опубліковано оригінальний вихідний код (source maps)",[109,155,156],{"align":98},"225 з 18 553 (1 %)",[109,158,159],{},"Налаштування збірки",[90,161,162,165,168],{},[109,163,164],{},"Маршрут API, що видав дані незнайомцю",[109,166,167],{"align":98},"8 з 18 518",[109,169,128],{},[90,171,172,175,178],{},[109,173,174],{},"Будь-якому сайту дозволено звертатися до вашого API",[109,176,177],{"align":98},"0 з 18 518",[109,179,128],{},[90,181,182,194,197],{},[109,183,184,185,189,190,193],{},"Приватний файл на кшталт ",[186,187,188],"code",{},".env"," чи ",[186,191,192],{},".git\u002Fconfig"," за відкритим URL",[109,195,196],{"align":98},"0 з 18 442",[109,198,128],{},[90,200,201,204,207],{},[109,202,203],{},"Сертифікат прострочений або недовірений",[109,205,206],{"align":98},"0 з 18 486",[109,208,209],{},"Lovable",[90,211,212,215,218],{},[109,213,214],{},"Домен ось-ось спливе",[109,216,217],{"align":98},"0 з 18 554",[109,219,209],{},[10,221,222],{},"Оцінки: 15 963 A, 370 B, 1 814 C, 402 D і 5 F. Дев’ять застосунків не мали\nжодної знахідки.",[61,224],{"alt":225,"caption":226,"src":227},"Шість горизонтальних смуг на одній шкалі, кожна зі знаком перед нею і числом після: 18 539 для заголовків, 2 017 для відкритих таблиць, 822 для ключів, 768 для бакетів сховища, 225 для source maps і 8 для відкритих маршрутів. Верхня смуга бліда сіра, решта бірюзові, а 8 це тонка лінія з кільцем навколо.","Кількість застосунків, а не частки: одна шкала, шість знахідок. Сіру смугу вирішує хостинг. Кожна бірюзова випливала з чогось усередині застосунку. Рядок відкритих таблиць міряється проти меншого знаменника, який розбирає наступне зображення.","\u002Fblog\u002Fis-lovable-safe\u002Fwhat-we-found-1600x680.png",[10,229,230,231,234,235,239],{},"Саме перший рядок пояснює, чому «99 % застосунків Lovable мають проблему з\nбезпекою» це речення, яке ви десь прочитаєте і маєте проігнорувати. Заголовки\nбезпеки браузера надсилає те, що віддає вашу сторінку, а на\n",[186,232,233],{},"вашзастосунок.lovable.app"," це Lovable, тому кожен застосунок на тому хості\nотримує ту саму відповідь. Їх ",[78,236,238],{"href":237},"\u002Fblog\u002Fmissing-security-headers","варто мати",", і не\nз них робиться D.",[10,241,242,243,246],{},"Приберіть цей рядок, і ",[17,244,245],{},"15 453 з 18 554 застосунків не мали більше нічого",".\nРешта 3 092 це решта цієї статті.",[25,248,250],{"id":249},"що-lovable-робить-добре-і-це-майже-весь-список","Що Lovable робить добре, і це майже весь список",[10,252,253],{},"Три з наведених цифр найкращі, які ми записали в будь-якого конструктора, і всі\nтри вирішує платформа, а не ви.",[10,255,256,259,260,82],{},[17,257,258],{},"Source maps."," 225 з 18 553 застосунків Lovable публікують оригінальні файли\nза застосунком разом із коментарями. Це приблизно 1 з 80. На Base44 та сама\nперевірка спрацьовує на 59 % застосунків, на Replit на 6 %. Продакшн-збірка\nLovable типово робить правильну річ, тож\n",[78,261,263],{"href":262},"\u002Fblog\u002Fsource-maps-exposed-in-production","це здебільшого не ваша проблема",[10,265,266,269,270,274],{},[17,267,268],{},"Cross-origin заголовки."," Нуль застосунків з 18 518 сказали будь-якому сайту\nсвіту, що той може звертатися до їхнього API, і нуль дозволили це з куками входу\nвідвідувача. Це та знахідка, яка\n",[78,271,273],{"href":272},"\u002Fblog\u002Fcors-wildcard-security-risk","найлегше дає іншому сайту діяти як ваш користувач",",\nі на Lovable вона не з’явилася жодного разу.",[10,276,277,280,281,283,284,286],{},[17,278,279],{},"Загублені приватні файли."," Нуль застосунків з 18 442 віддавали ",[186,282,188],{}," чи\n",[186,285,192],{}," за звичайним URL. У застосунку Lovable немає власного сервера, щоб\nйого неправильно налаштувати, тож і забутого файла позаду немає.",[10,288,289],{},"Нічого з цього не втішний приз. Це та частина роботи, про яку вам не довелося\nдумати і про яку в більшості інших конструкторів хтось думає.",[291,292,294],"callout",{"type":293},"note",[10,295,296,297,82],{},"Безкоштовно, без акаунта, приблизно 20 секунд: сканування на нашій головній\nсторінці виконує всі дев’ять цих перевірок на вашому живому застосунку і пише\n«Не вдалося перевірити» замість галочки для всього, на що не отримало\nвідповіді. ",[78,298,300],{"href":299},"\u002Fsecurity-scanner","Просканувати застосунок",[25,302,304],{"id":303},"єдина-цифра-що-має-значення-2-017-з-3-553","Єдина цифра, що має значення: 2 017 з 3 553",[10,306,307],{},"Серед застосунків Lovable, чию базу Supabase ми справді змогли запитати, 57 %\nвіддали рядки запиту, що не ніс жодного входу.",[10,309,310,311,82],{},"Знаменники варто пройти, бо саме цю цифру всі цитують і майже ніхто не\nокреслює. З 18 554 застосунків Lovable 6 532 називали проєкт Supabase у коді,\nякий віддають. З них 3 553 відповіли достатньо добре, щоб ми могли судити, а\nрешта 2 979 ні, тож вони невідомі, а не чисті. З тих 3 553 ",[17,312,313],{},"2 017 повернули\nрядки незнайомцю",[61,315],{"alt":316,"caption":317,"src":318},"Лійка з чотирьох складених смуг, що звужуються: 18 554 застосунки Lovable, 6 532 з названим проєктом Supabase, 3 553 чия база дала придатну відповідь, і 2 017 що повернули рядки без входу. Остання смуга червона, а третя несе знак питання для 2 979, про які неможливо було судити.","Чотири знаменники, а не один. Смуга, яку цитують як заголовок, остання, і міряється вона проти третьої.","\u002Fblog\u002Fis-lovable-safe\u002Fwhere-it-lands-1600x620.png",[10,320,321,322,325,326,329,330,333,334,333,337,340],{},"У ",[17,323,324],{},"373"," з тих застосунків таблиця, що відповіла, мала назву з людей: ",[186,327,328],{},"users",",\n",[186,331,332],{},"profiles",", ",[186,335,336],{},"orders",[186,338,339],{},"messages",". Це 373 застосунки, а не 373 таблиці. В інших\n1 644 це було щось, чого ми не могли назвати ззовні: можливо, каталог товарів,\nякий завжди мав бути публічним, можливо, будь-що інше.",[10,342,343,344,347],{},"Якщо міряти проти всіх просканованих застосунків Lovable, а не проти підмножини,\nпро яку ми могли судити, 2 017 з 18 554 це приблизно ",[17,345,346],{},"11 зі 100",". Запам’ятайте\nцю цифру на два розділи.",[25,349,351],{"id":350},"чому-це-лягає-на-базу-даних-а-не-на-lovable","Чому це лягає на базу даних, а не на Lovable",[10,353,354],{},"Через рішення в дизайні, яке правильне, свідоме і майже ніколи не пояснене\nлюдині, якої воно стосується.",[10,356,357,358,361],{},"У застосунку Lovable немає власного сервера. Сторінка в браузері відвідувача\nговорить із Supabase напряму, і саме тому все це можна побудувати за один вечір\nі саме тому так мало цих застосунків мають відкритий маршрут API: немає вашого\nAPI, щоб лишити його відкритим. Щоб це працювало, адреса вашої бази і ключ до\nнеї мають бути надруковані всередині застосунку, де кожен їх прочитає. Цей ключ\nназивається ",[17,359,360],{},"публікованим",", і те, що він публічний, правильно. Він і має там\nбути.",[10,363,364,365,367],{},"А отже єдине, що стоїть між незнайомцем і вашою таблицею ",[186,366,328],{},", це\nналаштування Supabase на кожну таблицю, що зветься Row Level Security. Якщо воно\nввімкнене і політику написано, публічний ключ читає лише ті рядки, які політика\nдозволяє. Якщо вимкнене, публічний ключ читає таблицю.",[10,369,370,371,374],{},"Тепер частина, яка вирішує більшість проєктів на Lovable. Supabase вмикає Row\nLevel Security типово для таблиць, які ви створюєте кліками в Table Editor.\nТаблиці, створені ",[17,372,373],{},"виконанням SQL",", його не отримують, а виконання SQL це\nспосіб, яким конструктор створює таблиці для вас. Тож звичайна форма проєкту на\nLovable така: кілька таблиць, зроблених руками, які захищені, поруч із тими, що\nбули згенеровані і можуть бути незахищені. Обидві виглядають однаково. Жодна не\nпоскаржиться. Застосунок працює бездоганно в обох випадках, і в цьому вся\nпроблема: нічого з того, що ви бачите спереду, не каже вам, який саме вид у вас.",[10,376,377,378,382,383,82],{},"Довша версія цього, разом із SQL,\n",[78,379,381],{"href":380},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","тут",", а покрокова інструкція простою\nмовою для цієї платформи це\n",[78,384,386],{"href":385},"\u002Fis-your-lovable-app-safe","чи безпечний ваш застосунок Lovable",[25,388,390],{"id":389},"політика-яка-прибирає-помилку-і-лишає-таблицю-відкритою","Політика, яка прибирає помилку і лишає таблицю відкритою",[10,392,393],{},"Увімкнути Row Level Security це крок один із двох, і саме на кроці два\nШІ-помічник дуже охоче робить неправильну річ.",[10,395,396,397,400],{},"З увімкненим налаштуванням і без написаної політики ваш власний застосунок\nперестає працювати. Ви отримуєте помилку, вставляєте її в чат, і повертається\nщось, від чого помилка зникає. Дуже часто це політика, що дозволяє всім,\nнаписана як ",[186,398,399],{},"using (true)",". Це чинна політика. Вона задовольняє вимогу, що\nполітика існує. Вона дозволяє кожен рядок кожному запиту.",[10,402,403,404,82],{},"Панель тепер повідомляє таблицю як захищену, помилка зникла, ваш застосунок\nпрацює, а таблиця читається рівно так само, як і раніше. Про це в нас ціла\nстаття, бо це найпереконливіший збій у всьому стеку:\n",[78,405,407],{"href":406},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","RLS увімкнено, а ваша таблиця досі публічна",[10,409,410],{},"Якщо ви колись вставляли помилку Row Level Security у вікно чату і приймали\nперше виправлення, з яким збірка пройшла, прочитайте ту політику сьогодні.",[25,412,414],{"id":413},"cve-2025-48757-і-чому-це-вже-не-ваше-питання","CVE-2025-48757 і чому це вже не ваше питання",[10,416,417],{},"Вона справжня, вона була серйозна, і з боку Lovable закрита вже понад рік. Вона\nтакож не те, що вам слід перевіряти.",[10,419,420],{},"У травні 2025 року дослідник безпеки Метт Палмер опублікував CVE-2025-48757 про\nзастосунки Lovable, у чиїх таблицях Supabase Row Level Security була відсутня\nабо написана надто дозвільно. Він просканував 1 645 застосунків Lovable і\nзнайшов 170 з відкритими базами. Відповіддю Lovable стала перевірка безпеки, що\nвиконується перед публікацією і попереджає про незахищені таблиці.",[10,422,423,424],{},"Ось чесне прочитання, і саме тому CVE це хибна рамка. Те оприлюднення знайшло\nприблизно 10 відкритих застосунків на кожні 100. За шістнадцять місяців, на\nкогорті вдесятеро з лишком більшій, ми знайшли приблизно 11 на 100. Знаменники\nне однакові, і жодна з двох вибірок не є цілим інтернетом, тож беріть їх як той\nсамий порядок величини, а не як точне порівняння. Напрям достатньо ясний:\n",[17,425,426],{},"частка не впала.",[10,428,429],{},"Це не виправлення, що провалилося. Це ознака того, що воно ніколи по-справжньому\nне було вразливістю продукту. Це налаштування на ваших власних таблицях, у\nвашому власному проєкті Supabase, яке ніхто інший не ввімкне за вас. Патч туди\nне дістає, і саме тому дістає перевірка, яку запускаєте ви самі.",[25,431,433],{"id":432},"з-чого-насправді-складалися-822-ключі","З чого насправді складалися 822 ключі",[10,435,436],{},"Майже всі були в порядку, і сканер, який сказав би вам інакше, навчав би вас\nсебе ігнорувати.",[10,438,439],{},"822 з 18 554 застосунків Lovable мали щось схоже на ключ у коді, який завантажує\nвідвідувач. Прочитане як перелік форм, це 4 % застосунків, що «зливають\nсекрети». Прочитане як те, що кожен ключ насправді вміє, воно виглядає так:",[84,441,442,455],{},[87,443,444],{},[90,445,446,449,452],{},[93,447,448],{},"Що ми знайшли в бандлі",[93,450,451],{"align":98},"Застосунків",[93,453,454],{},"Що це означає",[104,456,457,468,479,490,500,510,523],{},[90,458,459,462,465],{},[109,460,461],{},"Ключ API Google",[109,463,464],{"align":98},"727",[109,466,467],{},"Зазвичай правильно, щойно обмежено вашим доменом",[90,469,470,473,476],{},[109,471,472],{},"Секрет без атрибуції",[109,474,475],{"align":98},"82",[109,477,478],{},"Ми не змогли сказати, якому постачальнику він належить",[90,480,481,484,487],{},[109,482,483],{},"Ключ OpenAI",[109,485,486],{"align":98},"18",[109,488,489],{},"Списує з вашого рахунку, напряму",[90,491,492,495,498],{},[109,493,494],{},"Ключ доступу AWS",[109,496,497],{"align":98},"7",[109,499,489],{},[90,501,502,505,508],{},[109,503,504],{},"Ключ Anthropic",[109,506,507],{"align":98},"3",[109,509,489],{},[90,511,512,518,520],{},[109,513,514,517],{},[186,515,516],{},"service_role"," від Supabase",[109,519,507],{"align":98},[109,521,522],{},"Читає і пише кожен рядок у кожній таблиці, ігнорує правила",[90,524,525,528,531],{},[109,526,527],{},"Живий секрет Stripe",[109,529,530],{"align":98},"2",[109,532,533],{},"Ваш платіжний акаунт",[10,535,536,537,541],{},"727 ключів Google це причина, чому ми класифікуємо, а не просто збігаємо форми.\nКлюч Google Maps у браузері там, де й має бути, а виправлення це\n",[78,538,540],{"href":539},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","обмежити його вашим власним доменом",",\nа не панікувати.",[10,543,544,545,547,548,550,551,82],{},"Значення мають чотири нижні рядки, і вони рідкісні: 30 застосунків з 18 554. Це\nтакож ті знахідки, що самі по собі коштують грошей, і зазвичай вони виринають як\nрахунок, що приходить раніше, ніж хтось помітив. Дві деталі для протоколу. Усі\nтри ключі ",[186,546,516],{}," з усього сканування на 30 998 застосунків були в\nзастосунках Lovable, і так само два з трьох живих секретів Stripe. Ключ\n",[186,549,516],{}," у браузері робить кожну політику Row Level Security у вашому\nпроєкті неістотною одним рядком, і тому це єдина знахідка, яку ми оцінюємо як\nкритичну з першого погляду, і та,\n",[78,552,554],{"href":553},"\u002Fblog\u002Frotate-supabase-service-role-key","яку варто ротувати того самого дня",[10,556,557,558,82],{},"Відрізнити два види займає приблизно хвилину, і\n",[78,559,561],{"href":560},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","ми написали інструкцію",[25,563,565],{"id":564},"_768-бакетів-сховища-які-ніхто-не-хотів-відкривати","768 бакетів сховища, які ніхто не хотів відкривати",[10,567,568],{},"Бакет Supabase, позначений публічним, віддає не лише ті файли, на які посилається\nваш застосунок. Він також перелічує кожен файл усередині кожному, хто спитає.",[10,570,571,572,576],{},"768 з 16 565 застосунків Lovable, які ми могли перевірити, мали щонайменше один\nбакет, що перелічував свій вміст. Причина та сама, що й у читаних таблиць:\nзробити бакет публічним це спосіб, яким ви змушуєте зображення з’явитися, воно\nпрацює одразу, і потім ніщо не каже вам, що перелік ішов у комплекті.\nЗавантажені рахунки, фото документів і аватари користувачів опиняються в одному\nмісці.\n",[78,573,575],{"href":574},"\u002Fblog\u002Fsupabase-storage-bucket-public","Що публічний бакет насправді відкриває","\nпояснює виправлення, а це підписані URL, а не приватний бакет, з якого ви потім\nне зможете читати.",[25,578,580],{"id":579},"пятихвилинна-перевірка-вашого-застосунку-lovable","П’ятихвилинна перевірка вашого застосунку Lovable",[10,582,583],{},"Кожен пункт це сторінка, яку ви відкриваєте. Скористайтеся приватним вікном, щоб\nваш власний вхід не відповідав замість незнайомця.",[36,585,586,592,598,604,610],{},[39,587,588,591],{},[17,589,590],{},"Supabase → Authentication → Policies."," Пройдіть список. Будь-яка таблиця,\nде Row Level Security вимкнено, читається кожним, хто має адресу вашого\nпроєкту, а вона надрукована у вашому застосунку.",[39,593,594,597],{},[17,595,596],{},"Прочитайте політики таблиць, де його ввімкнено."," Якщо одна з них дозволяє\nвсім, таблиця відкрита, а панель усе одно зве її захищеною.",[39,599,600,603],{},[17,601,602],{},"Supabase → Storage."," Будь-який бакет, позначений публічним, перелічує свої\nфайли кожному. Подивіться, що в ньому, перш ніж вирішити, що це нормально.",[39,605,606,609],{},[17,607,608],{},"Supabase → Settings → API."," Переконайтеся, що ключ, який віддає ваш\nзастосунок, це публікований. Якщо секретний ключ колись вставляли в проєкт,\nротуйте його там, перш ніж видаляти з коду, бо старе значення працює, доки ви\nцього не зробите.",[39,611,612,615,616,82],{},[17,613,614],{},"Або доручіть це скануванню."," Воно виконує ці чотири ззовні і ще п’ять,\nзаймає приблизно 20 секунд, не потребує акаунта і показує вам оцінку та те,\nщо її спричинило: ",[78,617,618],{"href":299},"просканувати застосунок",[10,620,621,622,626,627,631],{},"Якщо ви радше пройдете всю поверхню як список,\n",[78,623,625],{"href":624},"\u002Fchecklist","10-хвилинний чекліст безпеки"," охоплює те, що варто підтвердити на\nбудь-якому щойно запущеному застосунку, а\n",[78,628,630],{"href":629},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","чи може будь-хто прочитати вашу базу Supabase","\nце тест, який варто зробити, якщо ви зробите лише одну річ.",[25,633,635],{"id":634},"ваш-застосунок-змінюється-з-кожною-публікацією","Ваш застосунок змінюється з кожною публікацією",[10,637,638],{},"Сканування, яке ви запустили минулого місяця, описує застосунок минулого місяця,\nа на Lovable цей місяць коротший за більшість.",[10,640,641],{},"Публікація це один клік, тож зміна виходить у світ тієї миті, коли ви її\nприймаєте. Між вами й інтернетом немає кроку розгортання, який спіймав би\nтаблицю, додану сьогодні вранці з вимкненим Row Level Security, або ключ,\nвставлений у чат опівночі, щоб пройти збірку, яка падала. Кожна з 2 017\nвідкритих баз, які ми знайшли, належала комусь, чий застосунок працював\nбездоганно.",[10,643,644,648,649,652],{},[78,645,647],{"href":646},"\u002Fpricing","Reeve Monitor"," це версія цієї статті, яка запускається сама. Він\nповторює всі дев’ять перевірок щогодини на трьох застосунках, дивиться кожні 60\nсекунд, чи застосунок відповідає, повідомляє, коли результат ",[17,650,651],{},"змінюється",",\nзамість чекати, поки ви подивитеся, і надсилає місячний звіт. Він коштує $12 на\nмісяць за прайсом, із сімома безкоштовними днями до першого списання; сторінка\nцін іноді нижча за цифру тут і ніколи не вища.",[10,654,655,658,659,663],{},[17,656,657],{},"Якщо ваш застосунок Lovable використовує Supabase, а 6 532 з 18 554\nпросканованих використовують, друга половина проблеми це копія."," Відкрита\nтаблиця це те, що незнайомець може прочитати. Агент із доступом до бази або\nміграція, що пішла не в той бік, це те, що може її стерти, а власна щоденна\nрезервна копія Supabase на безкоштовному тарифі не з тих, які ви відновите\nсамі. ",[78,660,662],{"href":661},"\u002Fsupabase-backups","Reeve Care"," щоночі знімає зашифровану копію вашої бази\nSupabase, тримає її там, куди ваш проєкт не дістає, перевіряє, що кожна копія\nсправді відновлюється, і дає вам відновлення в один клік, коли воно потрібне.\nУсе, що робить Monitor, уже входить. Care коштує $49 на місяць за прайсом за\nодин застосунок, із тими самими сімома безкоштовними днями.",[10,665,666,667,671],{},"Як виглядає цей другий збій, розказане тим, з ким це сталося, є в\n",[78,668,670],{"href":669},"\u002Fblog\u002Fai-agent-deleted-my-database","дні, коли ШІ-агент стер продакшн-базу",".\nЖодна з дев’яти перевірок цієї статті там не допомогла б. Копія допомогла б.",[25,673,675],{"id":674},"що-зробити-цього-тижня","Що зробити цього тижня",[677,678,679],"key-takeaways",{},[680,681,682,685,688,691,697],"ul",{},[39,683,684],{},"Відкрийте Supabase → Authentication → Policies і прочитайте список. Будь-яка таблиця з вимкненим Row Level Security читається кожним, хто має адресу вашого застосунку.",[39,686,687],{},"Прочитайте політики таблиць, де його ввімкнено. Та, що дозволяє всім, лишає таблицю відкритою, доки панель повідомляє її як захищену.",[39,689,690],{},"Перевірте Storage на публічні бакети. Публічний бакет перелічує кожен файл усередині, а не лише ті, на які посилається ваш застосунок.",[39,692,693,694,696],{},"Переконайтеся, що ключ у вашому застосунку це публікований. Ключ ",[186,695,516],{}," у браузері робить неістотною кожну написану вами політику, і це робота на той самий день.",[39,698,699],{},"Тримайте копію вашої бази там, куди ваш проєкт і ваш агент не дістають, і перевіряйте, що ця копія відновлюється.",[10,701,702,703,707],{},"Lovable зробив свою половину добре. Ті 2 017 це половина, яка ваша, і вона\nналаштування, а не переписування. Якщо вам натомість потрібне порівняння між\nконструкторами,\n",[78,704,706],{"href":705},"\u002Fblog\u002Fsafest-ai-app-builder","який конструктор застосунків на ШІ найбезпечніший","\nмає таблицю для всіх п’яти.",{"title":709,"searchDepth":710,"depth":710,"links":711},"",3,[712,714,715,716,717,718,719,720,721,722,723,724],{"id":27,"depth":713,"text":28},2,{"id":68,"depth":713,"text":69},{"id":249,"depth":713,"text":250},{"id":303,"depth":713,"text":304},{"id":350,"depth":713,"text":351},{"id":389,"depth":713,"text":390},{"id":413,"depth":713,"text":414},{"id":432,"depth":713,"text":433},{"id":564,"depth":713,"text":565},{"id":579,"depth":713,"text":580},{"id":634,"depth":713,"text":635},{"id":674,"depth":713,"text":675},"Основи безпеки","\u002Fblog\u002Fis-lovable-safe\u002Fcover-1200x630.png","Логотип Lovable на білій плитці, стрілка до опублікованого застосунку, стрілка далі до трьох відвідувачів і база даних під застосунком.","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.",false,"md",[732,735,738,741,744,747],{"q":733,"a":734},"Чи достатньо Lovable безпечний для справжнього продукту?","З боку платформи це найчистіший з п’яти конструкторів, які ми просканували. Кожен сертифікат, який ми змогли прочитати, був дійсний, жоден домен не наближався до закінчення, жоден застосунок не дозволяв будь-якому сайту світу звертатися до свого API, а 225 з 18 553 публікували вихідний код. Чи безпечно там тримати ваш продукт, вирішує база даних позаду: 2 017 з 3 553 застосунків Lovable, чий Supabase ми змогли запитати, віддали рядки запиту без входу. Це налаштування на ваших таблицях, воно ваше, і ви перевірите його приблизно за п’ять хвилин.",{"q":736,"a":737},"Чи можуть люди побачити вихідний код мого застосунку Lovable?","Браузерну половину завжди, бо браузер не намалює сторінку, якої йому не надіслали. Чого вони зазвичай не прочитають, це ваші оригінальні файли з коментарями та іменами змінних, і саме їх віддає опублікована source map. 225 з 18 553 перевірених застосунків Lovable публікували її, приблизно 1 з 80, і це найнижча частка серед усіх виміряних конструкторів. Ваші запити до бази це інша річ: застосунок Lovable говорить із Supabase прямо з браузера, тож назви таблиць і колонок, які він читає, видно кожному, хто відкриє вкладку мережі.",{"q":739,"a":740},"Чи в безпеці мої дані Supabase у застосунку Lovable?","Це залежить від одного налаштування на таблицю і більше ні від чого. Застосунок Lovable дістається Supabase прямо з браузера відвідувача за публікованим ключем, який і має бути публічним, тож єдине, що стоїть між незнайомцем і таблицею, це Row Level Security. Якщо його вимкнено, цей публічний ключ читає всю таблицю. Ми виміряли це на 3 553 застосунках Lovable, і 2 017 відповіли рядками на анонімний запит. У 373 з них відкрита таблиця мала назву з людей: users, profiles, orders, messages.",{"q":742,"a":743},"Що таке CVE-2025-48757 і чи стосується вона мене досі?","Це оприлюднення 2025 року від дослідника безпеки Метта Палмера про застосунки Lovable, у чиїх таблицях Supabase Row Level Security була відсутня або написана надто дозвільно. Він просканував 1 645 застосунків Lovable і знайшов 170 з відкритими базами. Lovable відповів, додавши перевірку безпеки, що виконується перед публікацією. Це не патч, на який ви чекаєте, і ніколи ним не був, бо відкритість це налаштування на ваших власних таблицях, а не дефект у коді Lovable, і саме тому наші цифри 2026 року так схожі на його цифри 2025 року. Чи стосується це вас, з’ясовується сьогодні відкриттям однієї сторінки в Supabase.",{"q":745,"a":746},"Чи ловить перевірка безпеки Lovable відкриту таблицю?","Lovable перед публікацією запускає перевірку, що читає ваш проєкт зсередини: схему, політики, залежності. Вона бачить те, чого зовнішнє сканування структурно побачити не може, наприклад таблицю, яку ваш фронтенд ніколи не називає. Чого вона не може довести, це що політика справді тримає, бо політика може існувати, виглядати чинною і все одно віддавати кожен рядок усім. Дві точки огляду відповідають на різні питання, тож запускайте внутрішню перед публікацією, а зовнішню після, і якщо вони суперечать одна одній, перемагає відповідь ззовні.",{"q":748,"a":749},"Чи безпечніший Lovable за Bolt або Replit?","У тому, що вирішує платформа, Lovable випередив чотирьох інших, яких ми виміряли: менше опублікованих source map, ніж у будь-кого з них, жодного відкритого cross-origin заголовка і жодної проблеми з сертифікатом чи доменом. У тому, що вирішує власник, усе виглядає як і всюди, бо ці знахідки випливають з того, як застосунок побудовано, а не з того, де. Повне порівняння ми винесли в окрему статтю, замість повторювати тут таблицю.","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",[752,753,754,755,756,757,758,759,760],"чи безпечний lovable","безпека lovable","чи надійний lovable","чи безпечні застосунки lovable","безпека lovable supabase","lovable rls","lovable у продакшені","проблеми безпеки lovable","витік даних lovable",{},true,"Чи безпечний Lovable? Що показали 18 554 застосунки","\u002Fblog\u002Fis-lovable-safe","2026-09-21",{"title":5,"description":728},"blog\u002Fis-lovable-safe",[769,770,771],"Чи безпечний Lovable? Платформа виявилася найчистішою з п’яти конструкторів, які ми виміряли. 225 застосунків з 18 553 публікували власний вихідний код, жоден не дозволяв будь-якому сайту звертатися до свого API, а 15 963 з 18 554 отримали A.","Усе серйозне, що ми знайшли, було всередині застосунку, який побудував його власник. З 3 553 застосунків Lovable, чию базу Supabase ми змогли запитати, 2 017 віддали рядки запиту без жодного входу.","Це приблизно 11 зі кожних 100 застосунків Lovable у нашому скануванні. Дослідник, який вимірював те саме у травні 2025 року, знайшов 10 зі 100, тож за шістнадцять місяців частка не зрушила.","Viq_Igf0yKaXpxMtOJv8MHGwFyFi-d4ZO1C5Pyv-6-M",[774,781,787,788,794,800,806,812,818,824,830,836,842,847,852,858,863,869,875,881,886,892,898,904,910,916,922,928,934,939,945,951,956,961,966,971,975,981,987,992,997,1003],{"path":775,"title":776,"description":777,"published":778,"category":779,"image":780,"draft":729},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":782,"title":783,"description":784,"published":785,"category":725,"image":786,"draft":729},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":764,"title":5,"description":728,"published":765,"category":725,"image":750,"draft":729},{"path":789,"title":790,"description":791,"published":792,"category":725,"image":793,"draft":729},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":795,"title":796,"description":797,"published":798,"category":725,"image":799,"draft":729},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":801,"title":802,"description":803,"published":804,"category":725,"image":805,"draft":729},"\u002Fblog\u002Fvite-and-next-public-env-vars","Змінні оточення Vite відкриті: префікс означає опублікувати це","Змінні оточення Vite відкриті у вашому застосунку, бо так просив префікс. VITE_ і NEXT_PUBLIC_ означають опублікувати це, а ШІ, який їх додав, не знав ціни.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":807,"title":808,"description":809,"published":810,"category":725,"image":811,"draft":729},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":813,"title":814,"description":815,"published":816,"category":725,"image":817,"draft":729},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":819,"title":820,"description":821,"published":822,"category":725,"image":823,"draft":729},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":825,"title":826,"description":827,"published":828,"category":779,"image":829,"draft":729},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":831,"title":832,"description":833,"published":834,"category":779,"image":835,"draft":729},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery у Supabase: ціна та межі","Point-in-time recovery у Supabase відмотує базу на будь-яку секунду за останній тиждень. Коштує $100 на місяць понад Pro і покриває лише базу даних.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":837,"title":838,"description":839,"published":840,"category":779,"image":841,"draft":729},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":705,"title":843,"description":844,"published":845,"category":725,"image":846,"draft":729},"Який білдер застосунків з ШІ найбезпечніший? 30 998 тестів","Який білдер застосунків з ШІ найбезпечніший? Ми просканували 30 998 живих застосунків з Lovable, Base44, Replit, v0 і Bolt. Оцінку вирішує не білдер.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":380,"title":848,"description":849,"published":850,"category":725,"image":851,"draft":729},"Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":853,"title":854,"description":855,"published":856,"category":725,"image":857,"draft":729},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": чого не бачить попередження","Supabase позначає \"RLS disabled in public\" як помилку. Про політику читання, яка лишає вашу таблицю так само відкритою, він не каже нічого.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":553,"title":859,"description":860,"published":861,"category":725,"image":862,"draft":729},"Як замінити злитий ключ service_role у Supabase","Supabase каже спершу закрити витік. Інші посібники кажуть міняти негайно. Що правильно, залежить від того, куди саме потрапив ваш ключ service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":864,"title":865,"description":866,"published":867,"category":725,"image":868,"draft":729},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":870,"title":871,"description":872,"published":873,"category":725,"image":874,"draft":729},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":876,"title":877,"description":878,"published":879,"category":725,"image":880,"draft":729},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":237,"title":882,"description":883,"published":884,"category":725,"image":885,"draft":729},"Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":887,"title":888,"description":889,"published":890,"category":725,"image":891,"draft":729},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Ваш ключ API OpenAI відкритий у фронтенді. Замініть його.","Ключ API OpenAI, відкритий у фронтенді, не можна прив'язати до домену. Замініть його сьогодні, перенесіть виклик на свій сервер і обмежте витрати.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":893,"title":894,"description":895,"published":896,"category":725,"image":897,"draft":729},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Ключ API у фронтенді: що насправді віддають 30 998 застосунків","Ключ API, відкритий у вашому фронтенді, зазвичай є ключем Google Maps. Ми просканували 30 998 vibe-coded застосунків і порахували, що витікає насправді.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":899,"title":900,"description":901,"published":902,"category":779,"image":903,"draft":729},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":905,"title":906,"description":907,"published":908,"category":725,"image":909,"draft":729},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":911,"title":912,"description":913,"published":914,"category":779,"image":915,"draft":729},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":917,"title":918,"description":919,"published":920,"category":725,"image":921,"draft":729},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":923,"title":924,"description":925,"published":926,"category":725,"image":927,"draft":729},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Де знайти API-ключі Supabase: anon, service_role і URL","URL проєкту, ключ anon і ключ service_role лежать на одній сторінці панелі. Ось де вона, і яке з чотирьох значень має бути у вашому застосунку.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":929,"title":930,"description":931,"published":932,"category":725,"image":933,"draft":729},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy в Supabase. Що далі?","\"New row violates row-level security policy\" означає, що Supabase відмовив у записі. Швидке виправлення знову відкриває таблицю для всіх.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":272,"title":935,"description":936,"published":937,"category":725,"image":938,"draft":729},"Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":940,"title":941,"description":942,"published":943,"category":779,"image":944,"draft":729},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching у Supabase це не бекап. Він іде тільки вперед.","Чому branching у Supabase це не бекап: гілка стартує без ваших даних, а мердж переносить саму лише схему. Для чого він потрібен і що брати замість нього.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":946,"title":947,"description":948,"published":949,"category":779,"image":950,"draft":729},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":574,"title":952,"description":953,"published":954,"category":725,"image":955,"draft":729},"Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":539,"title":957,"description":958,"published":959,"category":725,"image":960,"draft":729},"Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":669,"title":962,"description":963,"published":964,"category":779,"image":965,"draft":729},"ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":629,"title":967,"description":968,"published":969,"category":725,"image":970,"draft":729},"Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків","Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":262,"title":972,"description":973,"published":969,"category":725,"image":974,"draft":729},"Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":976,"title":977,"description":978,"published":979,"category":725,"image":980,"draft":729},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":982,"title":983,"description":984,"published":985,"category":779,"image":986,"draft":729},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":406,"title":988,"description":989,"published":990,"category":725,"image":991,"draft":729},"Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":993,"title":994,"description":995,"published":990,"category":779,"image":996,"draft":729},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":998,"title":999,"description":1000,"published":1001,"category":779,"image":1002,"draft":729},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Три способи зробити резервну копію бази Supabase, і чого бракує","Панель, pg_dump і керований сервіс. Що насправді зберігає кожен спосіб, що тихо лишає осторонь і який із них переживе втрату акаунта.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":560,"title":1004,"description":1005,"published":1001,"category":725,"image":1006,"draft":729},"Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150956230]