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