[{"data":1,"prerenderedAt":662},["ShallowReactive",2],{"blog-uk-what-secrets-leak-from-vibe-coded-apps":3,"blog-index-uk":421},{"id":4,"title":5,"body":6,"category":380,"cover":381,"coverAlt":382,"description":383,"draft":384,"extension":385,"faq":386,"image":402,"keywords":403,"meta":409,"navigation":410,"ogTitle":411,"path":412,"published":413,"seo":414,"stem":415,"tldr":416,"updated":413,"__hash__":420},"blog_uk\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps.md","Ключ API у фронтенді: що насправді віддають 30 998 застосунків",{"type":7,"value":8,"toc":368},"minimark",[9,13,16,21,24,33,45,49,52,59,69,75,86,90,93,180,183,189,200,208,212,218,237,242,248,252,255,269,277,281,299,308,311,326,330,356],[10,11,12],"p",{},"Хтось відкриває ваш застосунок, натискає F12 і каже, що у вашому фронтенді\nвідкритий ключ API. Слово, яке при цьому вживають, зазвичай «витік». Який саме\nце ключ, кажуть рідко, а поради, що знайдуться далі, ставляться до всіх ключів\nяк до однакової пожежі.",[10,14,15],{},"Пожежа не однакова, і тепер ми можемо назвати цифри цієї відстані. Між 12 і 14\nсерпня 2026 року ми провели дев’ять зовнішніх перевірок для 30 998 робочих\nзастосунків, створених у Lovable, Bolt, v0, Replit і Base44, і прочитали\nJavaScript, який кожен із них віддає браузеру. Ось що там було.",[17,18,20],"h2",{"id":19},"чи-справді-ключ-api-у-фронтенді-є-проблемою","Чи справді ключ API у фронтенді є проблемою?",[10,22,23],{},"Зазвичай ні, і форма цього «зазвичай» перекошена більше, ніж ми очікували.",[10,25,26,27,32],{},"Ми знайшли вартий уваги ключ у 1 332 із 30 998 застосунків. У 1 080 із них\nєдиним, що ми знайшли, був ключ API Google, тобто саме ті облікові дані, які\n",[28,29,31],"a",{"href":30},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","мають бути на вашій сторінці",". Цей\nключ захищає налаштування, що зберігається на боці Google, а ховати його ніколи\nне входило в домовленість.",[10,34,35,36,40,41,44],{},"Решта 29 666 застосунків не віддавали нічого, що наша перевірка секретів вважає\nпроблемою. Ця цифра потребує одного уточнення, щоб бути чесною: публічні ключі\nдо неї не входять. Ключ ",[37,38,39],"code",{},"anon"," від Supabase або ключ ",[37,42,43],{},"pk_"," від Stripe належить\nбраузеру, тож ми позначаємо його як те, що ви зробили правильно, і в ці підрахунки\nвін не потрапляє ніколи.",[17,46,48],{"id":47},"що-ми-рахували-і-чого-порахувати-не-змогли","Що ми рахували і чого порахувати не змогли",[10,50,51],{},"Ми завантажували кожен застосунок так, як це робить відвідувач, у справжньому\nбраузері, і читали завантажений JavaScript. Усе далі це форма, знайдена в тому\nкоді.",[10,53,54,58],{},[55,56,57],"strong",{},"Ми впізнаємо ті формати ключів, які знаємо."," Stripe, OpenAI, Anthropic, AWS,\nGoogle і Supabase мають упізнавані префікси, а JWT від Supabase називає власну\nроль читабельним текстом у середній частині. Облікові дані у форматі, якого ми\nне впізнаємо, до цих цифр не потрапили, тож читайте їх як нижню межу.",[10,60,61,64,65,68],{},[55,62,63],{},"Ми не скористалися жодним знайденим ключем."," Жодного разу, у жодному\nзастосунку. Ми записали тип і замасковану підказку у формі ",[37,66,67],{},"sk_live_…a1b2",", а\nсправжнє значення ніде не записувалося.",[10,70,71,74],{},[55,72,73],{},"Жоден застосунок не названо."," Ні тут, ні в наборі даних, ні деінде, де ми\nпублікуємо.",[10,76,77,80,81,85],{},[55,78,79],{},"Майже всі вони є застосунками на власному домені білдера."," Повний метод,\nвибірка та кожна цифра за цією статтею є в\n",[28,82,84],{"href":83},"\u002Fresearch\u002Fvibe-coded-app-security-2026","нашому звіті про сканування",", разом із\nтим, чого ми виміряти не змогли.",[17,87,89],{"id":88},"що-30-998-застосунків-віддавали-насправді","Що 30 998 застосунків віддавали насправді",[10,91,92],{},"Одна таблиця, впорядкована за тим, як часто ми бачили кожну річ. Перевірка\nсекретів завершилася на кожному з 30 998 застосунків, тож кожне число нижче\nстосується їх усіх.",[94,95,96,109],"table",{},[97,98,99],"thead",{},[100,101,102,106],"tr",{},[103,104,105],"th",{},"Що ми знайшли в коді для браузера",[103,107,108],{},"Застосунки",[110,111,112,121,129,137,145,153,165,172],"tbody",{},[100,113,114,118],{},[115,116,117],"td",{},"Ключ API Google",[115,119,120],{},"1 142",[100,122,123,126],{},[115,124,125],{},"Значення з високою ентропією поруч із назвою «secret» чи «password»",[115,127,128],{},"204",[100,130,131,134],{},[115,132,133],{},"Ключ OpenAI",[115,135,136],{},"33",[100,138,139,142],{},[115,140,141],{},"Ключ доступу AWS",[115,143,144],{},"9",[100,146,147,150],{},[115,148,149],{},"Ключ Anthropic",[115,151,152],{},"5",[100,154,155,162],{},[115,156,157,158,161],{},"Ключ ",[37,159,160],{},"service_role"," від Supabase",[115,163,164],{},"3",[100,166,167,170],{},[115,168,169],{},"Секретний ключ Stripe",[115,171,164],{},[100,173,174,177],{},[115,175,176],{},"Обмежений ключ Stripe",[115,178,179],{},"2",[10,181,182],{},"Рядки в сумі дають більше за 1 332, бо один застосунок може нести два з них.\nРозкладіть ті самі 1 332 застосунки на групи, що не перетинаються, і картина\nстане ще різкішою: 1 080 мали ключ Google і більше нічого, 198 мали значення з\nвисокою ентропією, яке може бути справжніми обліковими даними, а може й ні, і 54\nмали ключ, який уже своєю формою є справжнім секретом.",[184,185],"diagram",{"alt":186,"caption":187,"src":188},"Одна широка смуга, що представляє 1 332 застосунки, у яких знайдено ключ, поділена на три частини: довга бірюзова секція на 1 080, коротша бурштинова на 198 і вузька червона на 54 біля правого краю.","Кожен застосунок, у якому ми взагалі знайшли ключ, розкладений на три групи без перетинів. Червона секція саме та, про яку йдеться в попередженнях.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fwhat-we-found-1600x620.png",[10,190,191,192,195,196,199],{},"Другу групу варто описати обережно. Значення з високою ентропією поруч зі словом\n",[37,193,194],{},"secret"," чи ",[37,197,198],{},"password"," може бути живими обліковими даними, а може бути\nідентифікатором сесії, хешем збірки або публічним токеном із невдалою назвою. Ми\nпозначаємо це як варте погляду, і ззовні ніхто не скаже вам, що саме це таке.",[10,201,202,203,207],{},"54 із третьої групи є справжньою річчю. Усі, крім двох, отримали оцінку D або F,\nбо один критичний знахідок обмежує оцінку до D, хай би що застосунок зробив\nправильно в усьому іншому. Найбільша окрема група всередині неї це ключ OpenAI,\n33 штуки, і в нього\n",[28,204,206],{"href":205},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","немає налаштування, яке зробило б його безпечним у браузері",".",[17,209,211],{"id":210},"ключ-про-який-усі-попереджають-виявився-найрідкіснішим","Ключ, про який усі попереджають, виявився найрідкіснішим",[10,213,214,215,217],{},"Три застосунки. Стільки віддавали ключ ",[37,216,160],{}," від Supabase, той, що\nпроходить повз кожне правило таблиці, яке ви написали. Секретний ключ Stripe теж\nтрапився тричі.",[10,219,220,221,223,224,227,228,227,231,227,234,207],{},"Поставте це поруч з іншою половиною того самого проходу. Із просканованих\nзастосунків 8 429 називали проєкт Supabase, і обидві знахідки лежать усередині\nцієї однієї групи. Три з них віддавали ключ ",[37,222,160],{},". У 2 096 із них\nпринаймні одна таблиця відповіла на запит зовсім без входу, а в 394 та таблиця\nмала назву про людей: ",[37,225,226],{},"users",", ",[37,229,230],{},"profiles",[37,232,233],{},"customers",[37,235,236],{},"orders",[184,238],{"alt":239,"caption":240,"src":241},"Два рядки, накреслені в однаковому масштабі. Верхній рядок, позначений ключем, є червоною смужкою, настільки тонкою, що їй потрібне пунктирне кільце, аби її було видно, з підписом 3. Нижній рядок, позначений таблицею, є бірюзовою смугою майже на всю ширину, з підписом 2 096.","Обидва підрахунки походять із тих самих 8 429 застосунків із Supabase. Верхній рядок це та знахідка, про яку попереджають власників.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fwarned-about-vs-found-1600x680.png",[10,243,244,245,247],{},"2 096 є нижньою межею. 4 749 із 8 429 так і не відповіли на нашу перевірку бази\nданих, з причин, яких ми ззовні не бачимо, і вони записані як невідомі, а не як\nчисті. Три ключі ",[37,246,160],{}," є точним підрахунком, бо ключ читається з коду,\nякий віддає кожен застосунок.",[17,249,251],{"id":250},"чому-попередження-вказують-не-на-той-ключ","Чому попередження вказують не на той ключ",[10,253,254],{},"Ми бачимо лише зовнішній бік цих застосунків, тож не можемо сказати вам чому.\nПоказати ми можемо те, яка помилка виживає.",[10,256,257,258,260,261,263,264,268],{},"Скопіювати не той ключ Supabase справді легко. У старішому проєкті ",[37,259,39],{}," і\n",[37,262,160],{}," стоять поруч в одній панелі дашборда, вони однакової довжини й\nоднакової форми, і\n",[28,265,267],{"href":266},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","нічого не ламається, якщо взяти не той",".\nІ все ж це сталося лише тричі на 30 998 застосунків, бо ніщо вас туди не штовхає.\nВставте будь-який із двох, і застосунок працює.",[10,270,271,272,276],{},"За відкритою таблицею стоїть сила. Row Level Security вмикають, застосунок\nперестає показувати дані, пишуть політику, яка дозволяє всім, щоб він знову\nзапрацював, і з цієї миті дашборд повідомляє таблицю як захищену. Увімкнути це\n",[28,273,275],{"href":274},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","не те саме, що бути захищеним",".\nНаше сканування оцінює таку таблицю як критичну знахідку в той самий день, коли\nваш дашборд показує вам увімкнений перемикач і наявну політику.",[17,278,280],{"id":279},"як-безкоштовно-знайти-відкритий-ключ-api-у-своєму-застосунку","Як безкоштовно знайти відкритий ключ API у своєму застосунку",[10,282,283,284,287,288,291,292,294,295,298],{},"Почніть руками, це коштує п’ять хвилин і не потребує нічого встановлювати.\nВідкрийте свій живий сайт, подивіться код сторінки й пошукайте чотири рядки:\n",[37,285,286],{},"AIza"," для ключа Google, ",[37,289,290],{},"sk_"," для секрету Stripe чи постачальника моделей,\n",[37,293,160],{}," для ключа Supabase, який ігнорує ваші правила, і ",[37,296,297],{},"eyJ"," для\nбудь-якого токена Supabase. Усе, що повернеться, уже перебуває в руках кожного\nвашого відвідувача.",[10,300,301,302,304,305,307],{},"Це дає вам саму сторінку. Повз проходить JavaScript, який сторінка завантажує\nдалі, і саме тому наш власний сканер відкриває застосунок у справжньому браузері\nй читає бандли замість HTML. Пошук руками також не скаже вам, чи знайдений токен\n",[37,303,297],{}," є ключем ",[37,306,39],{},", чи секретним, бо обидва однакової довжини й однакової\nформи.",[10,309,310],{},"Наше безкоштовне сканування покриває обидві частини. Воно завантажує ваш\nзастосунок у справжньому браузері, читає код, який справді приходить, декодує\nкожен токен Supabase і повідомляє написану в ньому роль, тож публічний ключ\nповертається позначеним як правильний, а не похованим у стіні червоного. Оцінку,\nбал і підрахунки ви бачите на екрані приблизно за 20 секунд без облікового\nзапису. Дайте адресу електронної пошти, і ви отримаєте ще й докладний перелік із\nвиправленням, написаним для вашого білдера, яке можна вставити просто так.",[10,312,313,314,316,317,321,322,207],{},"Три речі, яких воно не робить, і саме тому його безпечно запускати на живому\nзастосунку: воно ніколи не входить, ніколи нічого не пише і ніколи не залишає в\nсебе знайдений ключ. Відкритий секрет зберігається як замаскована підказка на\nкшталт ",[37,315,67],{},", а справжнє значення відкидається.\n",[28,318,320],{"href":319},"\u002F#scan","Проскануйте свій застосунок"," або спершу прочитайте,\n",[28,323,325],{"href":324},"\u002Fsecurity-scanner","на що дивиться кожна з дев’яти перевірок",[17,327,329],{"id":328},"що-робити-у-порядку-який-підказують-цифри","Що робити, у порядку, який підказують цифри",[331,332,333],"key-takeaways",{},[334,335,336,344,347,350,353],"ul",{},[337,338,339,340,343],"li",{},"Спершу визначте ключ, а вже потім реагуйте. Для Stripe і для новіших ключів Supabase відповідь дає префікс; для старішого ключа Supabase вирішує поле ",[37,341,342],{},"role"," усередині токена.",[337,345,346],{},"Якщо це ключ Google, обмежте його, а не ховайте. Обмеження за вебсайтами, ваш домен, лише ті API, якими користуєтесь, плюс денна межа квоти. Безкоштовно, близько п’яти хвилин, без змін у коді.",[337,348,349],{},"Якщо це справжній секретний ключ, спершу зробіть ротацію. Видалення з коду нічого не зачиняє, бо старе значення лишається у вашій історії версій і в кешованих копіях сайту.",[337,351,352],{},"Далі йдіть читати правила своїх таблиць, бо саме там цифри бачать справжню відкритість. Почніть із таблиць, де є люди.",[337,354,355],{},"Після будь-якого розкриття секретного ключа перевірте рахунки та журнали. Ротація зупиняє те, що станеться далі, і нічого не каже про те, що вже сталося.",[10,357,358,359,363,364,207],{},"Пройдіть увесь перелік за один раз із\n",[28,360,362],{"href":361},"\u002Fchecklist","10-хвилинним чеклістом безпеки",", який охоплює і ключ, і правила\nтаблиць поряд з іншими речами, що їх варто закрити у щойно запущеному\nзастосунку. А якщо вас непокоїть саме частина про базу даних, у неї є власний\nпідрахунок:\n",[28,365,367],{"href":366},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","чи може будь-хто прочитати вашу базу Supabase",{"title":369,"searchDepth":370,"depth":370,"links":371},"",3,[372,374,375,376,377,378,379],{"id":19,"depth":373,"text":20},2,{"id":47,"depth":373,"text":48},{"id":88,"depth":373,"text":89},{"id":210,"depth":373,"text":211},{"id":250,"depth":373,"text":251},{"id":279,"depth":373,"text":280},{"id":328,"depth":373,"text":329},"Основи безпеки","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcover-1200x630.png","Сторінка коду застосунку з вісьмома підсвіченими значеннями у формі ключа, більшість звичайні, а одне намальоване червоним.","Ключ API, відкритий у вашому фронтенді, зазвичай є ключем Google Maps. Ми просканували 30 998 vibe-coded застосунків і порахували, що витікає насправді.",false,"md",[387,390,393,396,399],{"q":388,"a":389},"Як дізнатися, чи витік мій ключ API?","Відкрийте свій живий сайт, подивіться код сторінки й пошукайте форми: AIza для ключа Google, sk_ для секрету Stripe чи постачальника моделей, і eyJ для JWT Supabase. Усе, що знайдеться, уже перебуває в руках кожного відвідувача. Наше безкоштовне сканування робить те саме читання ззовні й повідомляє, що бачить, приблизно за 20 секунд, без облікового запису для отримання оцінки.",{"q":391,"a":392},"Чи завжди зашитий у код ключ API є проблемою безпеки?","Ні, і саме така віра привчає людей не зважати на попередження. Деякі ключі публікують навмисно: ключ anon від Supabase, ключ pk_ від Stripe і ключ веб-конфігурації Firebase створені для життя в браузері, а ваші дані захищають правила за ними. Секретний ключ це протилежний випадок, і його місце на сервері. Префікс каже, який із двох перед вами.",{"q":394,"a":395},"Мені кажуть, що мій ключ Supabase відкритий. Це той поганий?","Майже напевно ні. Обидва ключі Supabase схожі, тож прочитайте роль усередині токена або перевірте префікс: anon і sb_publishable_ мають бути публічними, service_role і sb_secret_ ні. Ми знайшли ключ service_role у 3 застосунках із 30 998, тож шанси добряче схиляються до нешкідливого. Якщо це все ж секретний, зробіть ротацію сьогодні в панелі Supabase.",{"q":397,"a":398},"Про що варто хвилюватися натомість?","Про правила на таблицях вашої бази даних. Із застосунків, де ми змогли завершити цю перевірку, більш ніж половина мала принаймні одну таблицю, що відповідала на запит зовсім без входу, а в 394 із них відкритою була таблиця з назвою про людей: users, profiles, customers, orders. Це значно частіше за будь-який ключ, що витік, і значно тихіше, бо застосунок працює точно так само в обох випадках.",{"q":400,"a":401},"Я прибрав ключ зі свого коду. Тепер закрито?","Не саме собою. Старе значення досі є у вашій історії версій і в будь-якій кешованій копії сторінки, тож той, хто його вже зібрав, може користуватися далі. Двері насправді зачиняє ротація ключа в панелі постачальника, і це перший крок, а не останній. Після цього перевірте рахунки та журнали на використання, якого ви не можете пояснити.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",[404,405,406,407,408],"ключ api відкритий у фронтенді","секрети в клієнтському коді","ключ api зашитий у код","чи витік мій ключ api","знайти відкриті ключі api",{},true,"Ключ API у фронтенді: 30 998 застосунків, пораховано","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","2026-09-02",{"title":5,"description":383},"blog\u002Fwhat-secrets-leak-from-vibe-coded-apps",[417,418,419],"Ключ API, відкритий у вашому фронтенді, майже завжди належить до нешкідливого різновиду. Ми знайшли вартий уваги ключ у 1 332 із 30 998 застосунків, і 1 080 із них несли лише ключ API Google.","Ключ Supabase service_role, про який попереджає кожен туторіал, трапився в 3 застосунках із 30 998. Секретний ключ Stripe трапився теж у 3.","Ключі, що вже своєю формою витрачають гроші або читають дані, трапилися в 54 застосунках. Відкрита таблиця Supabase трапилася у 2 096.","wQgPMXP8k6Sy54sj3tbGcnIB3LQ77Nd88B2SXErWfgI",[422,429,435,441,447,453,459,465,471,477,483,489,495,501,507,513,519,525,531,537,543,548,549,555,561,567,573,579,585,591,597,603,609,614,620,625,630,636,642,647,652,658],{"path":423,"title":424,"description":425,"published":426,"category":427,"image":428,"draft":384},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":430,"title":431,"description":432,"published":433,"category":380,"image":434,"draft":384},"\u002Fblog\u002Fdomain-and-certificate-expiry","Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":436,"title":437,"description":438,"published":439,"category":380,"image":440,"draft":384},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":442,"title":443,"description":444,"published":445,"category":380,"image":446,"draft":384},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":448,"title":449,"description":450,"published":451,"category":380,"image":452,"draft":384},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":454,"title":455,"description":456,"published":457,"category":380,"image":458,"draft":384},"\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":460,"title":461,"description":462,"published":463,"category":380,"image":464,"draft":384},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":466,"title":467,"description":468,"published":469,"category":380,"image":470,"draft":384},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":472,"title":473,"description":474,"published":475,"category":380,"image":476,"draft":384},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":478,"title":479,"description":480,"published":481,"category":427,"image":482,"draft":384},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":484,"title":485,"description":486,"published":487,"category":427,"image":488,"draft":384},"\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":490,"title":491,"description":492,"published":493,"category":427,"image":494,"draft":384},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":496,"title":497,"description":498,"published":499,"category":380,"image":500,"draft":384},"\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":502,"title":503,"description":504,"published":505,"category":380,"image":506,"draft":384},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":508,"title":509,"description":510,"published":511,"category":380,"image":512,"draft":384},"\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":514,"title":515,"description":516,"published":517,"category":380,"image":518,"draft":384},"\u002Fblog\u002Frotate-supabase-service-role-key","Як замінити злитий ключ service_role у Supabase","Supabase каже спершу закрити витік. Інші посібники кажуть міняти негайно. Що правильно, залежить від того, куди саме потрапив ваш ключ service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":520,"title":521,"description":522,"published":523,"category":380,"image":524,"draft":384},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Десять інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":526,"title":527,"description":528,"published":529,"category":380,"image":530,"draft":384},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":532,"title":533,"description":534,"published":535,"category":380,"image":536,"draft":384},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":538,"title":539,"description":540,"published":541,"category":380,"image":542,"draft":384},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":205,"title":544,"description":545,"published":546,"category":380,"image":547,"draft":384},"Ваш ключ API OpenAI відкритий у фронтенді. Замініть його.","Ключ API OpenAI, відкритий у фронтенді, не можна прив'язати до домену. Замініть його сьогодні, перенесіть виклик на свій сервер і обмежте витрати.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":412,"title":5,"description":383,"published":413,"category":380,"image":402,"draft":384},{"path":550,"title":551,"description":552,"published":553,"category":427,"image":554,"draft":384},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":556,"title":557,"description":558,"published":559,"category":380,"image":560,"draft":384},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":562,"title":563,"description":564,"published":565,"category":427,"image":566,"draft":384},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":568,"title":569,"description":570,"published":571,"category":380,"image":572,"draft":384},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":574,"title":575,"description":576,"published":577,"category":380,"image":578,"draft":384},"\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":580,"title":581,"description":582,"published":583,"category":380,"image":584,"draft":384},"\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":586,"title":587,"description":588,"published":589,"category":380,"image":590,"draft":384},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":592,"title":593,"description":594,"published":595,"category":427,"image":596,"draft":384},"\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":598,"title":599,"description":600,"published":601,"category":427,"image":602,"draft":384},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":604,"title":605,"description":606,"published":607,"category":380,"image":608,"draft":384},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":30,"title":610,"description":611,"published":612,"category":380,"image":613,"draft":384},"Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":615,"title":616,"description":617,"published":618,"category":427,"image":619,"draft":384},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":366,"title":621,"description":622,"published":623,"category":380,"image":624,"draft":384},"Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків","Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":626,"title":627,"description":628,"published":623,"category":380,"image":629,"draft":384},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":631,"title":632,"description":633,"published":634,"category":380,"image":635,"draft":384},"\u002Fblog\u002Fsupabase-new-api-keys","Нові API-ключі Supabase: який із них безпечний у застосунку?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":637,"title":638,"description":639,"published":640,"category":427,"image":641,"draft":384},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":274,"title":643,"description":644,"published":645,"category":380,"image":646,"draft":384},"Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":645,"category":427,"image":651,"draft":384},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":653,"title":654,"description":655,"published":656,"category":427,"image":657,"draft":384},"\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":266,"title":659,"description":660,"published":656,"category":380,"image":661,"draft":384},"Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150956954]