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