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