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