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