Основи безпеки
Секретний ключ Stripe у фронтенді може рухати гроші
Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.

Коротко
- Секретний ключ Stripe, відкритий у вашому фронтенді, це витік, який виставляють рахунком на ваш акаунт: повернення, нові списання і кожна картка клієнта, яку ви маєте.
- pk_live_ належить вашому застосунку і завжди належав. sk_live_ відрізняється від нього на один символ і має необмежені права на весь ваш акаунт Stripe.
- Спершу створіть ключ на заміну, запустіть його в роботу, і лише тоді дайте старому завершитися. Видалення рядка з коду не повертає того, що вже завантажили.
- Ми знайшли активний секретний ключ Stripe у 3 з 30 998 просканованих застосунків. Усі три отримали оцінку D.
Відкрийте свій робочий застосунок у браузері, подивіться вихідний код сторінки
й пошукайте в ньому sk_live_. Якщо повернувся довгий рядок, секретний ключ
Stripe відкритий у вашому фронтенді, і кожен відвідувач, який у вас
коли-небудь був, міг його скопіювати.
Ось те, у чому загальні поради про ключі API помиляються: Stripe дає вам два
активні ключі, вони виглядають майже однаково, і один із них має лежати у
вашому застосунку. Ключ, що починається з pk_live_, там і має бути. Ключ,
що починається з sk_live_, має, за власними словами Stripe, необмежені права
на всі API. Вони різняться одним символом посеред довгого рядка, і в цьому
більша частина причини, чому таке стається знову й знову.
Між 12 і 14 серпня 2026 року ми пропустили дев'ять зовнішніх перевірок через 30 998 робочих застосунків, зібраних у Lovable, Bolt, v0, Replit і Base44. Три з них віддавали активний секретний ключ Stripe, ще два обмежений, і це робить знахідку однією з найрідкісніших за весь обхід; ті самі дев'ять перевірок знайшли ключ API Google у 1 142 застосунках. Усі три секретні ключі дали оцінку D, бо одна критична знахідка ставить там стелю, хоч би що застосунок зробив правильно в усьому іншому. Повні цифри є в нашому звіті сканування.
Чи є проблемою секретний ключ Stripe, відкритий у фронтенді?
Так, якщо рядок починається з sk_live_. Ні, якщо з pk_live_.
Stripe видає два активні ключі, бо дві половини платежу відбуваються у двох різних місцях. Уявіть прилавок у магазині. Термінал для карток повернутий до покупця й прикручений на видноті, і найгірше, що може зробити з ним стороння людина, це заплатити вам. Каса за прилавком це зовсім інший предмет. Вона відкривається, у ній лежить денна виручка, а в шухляді під нею лежить картка на кожного клієнта з його адресою.
pk_live_ це термінал для карток. Його робота будувати форму оплати в чужому
браузері, і документація Stripe каже, що публічні ключі можна безпечно
відкривати у фронтенд-коді.
sk_live_ це ключ від каси. Stripe описує секретні ключі як такі, що мають
необмежені права на всі API, і це те саме речення, прочитане з іншого боку: у
вашому акаунті немає нічого, чого він не дістане.
Вашому застосунку потрібен термінал у браузері, щоб узагалі прийняти платіж. Ключ від каси йому не потрібен ніколи.
pk_live_ і sk_live_: як їх розрізнити
Прочитайте другий символ префікса. У цьому вся перевірка.
| Ключ | Починається з | Безпечний у браузері? | Що він робить |
|---|---|---|---|
| Публічний | pk_live_… | Його місце | Будує форму оплати й токенізує картку. Не читає клієнтів і не рухає гроші. |
| Секретний | sk_live_… | Ніколи | Необмежені права на всі API Stripe, на весь ваш акаунт. |
| Обмежений | rk_live_… | Ніколи | Лише ті права, які ви позначили при створенні. Все одно робочі дані доступу в чужих руках. |
| Тестові | sk_test_, pk_test_ | Ні | Торкається лише пісочниці для тестів. Менша проблема з тією самою звичкою позаду. |
Середина префікса це друге, що варто прочитати. _test_ не дістає нічого поза
вашою пісочницею, тож витеклий тестовий ключ не коштує вам грошей; він усе одно
оприлюднює, як зібрана ваша інтеграція, а настанова Stripe полягає в тому, щоб
вважати скомпрометованим будь-який секретний чи обмежений ключ, побачений не на
своєму місці. Новіші акаунти можуть нести ще й ключ організації, що починається
з sk_org_ і працює одразу через кілька акаунтів Stripe. Для нього діє те саме
правило, і витік там сягає далі за один акаунт.
Що хтось може зробити з витеклим секретним ключем Stripe
Усе, що можете ви у власній панелі й для чого не потрібен пароль.
Не «отримати несанкціонований доступ». Конкретно, маючи лише рядок і термінал: прочитати повний список ваших клієнтів, з іменами, електронними адресами, адресами для рахунків і останніми чотирма цифрами кожної картки. Прочитати кожен платіж, який ви коли-небудь прийняли, і за що платив кожен клієнт. Зробити повернення. Створити списання й платіжні посилання від вашого імені. Скасувати підписки.
Далі є використання, яке взагалі не про вас. Ваш акаунт стає місцем для card testing, і це власний термін Stripe для шахрая, який проганяє крадені номери карток через чиюсь інтеграцію, щоб знайти ті, що ще працюють. Картки належать іншим людям. Відмови, спори й пояснення належать вам.
Чого вони переважно не можуть, так це заплатити самі собі. Повернення йде назад на картку, якою зробили початковий платіж, а виплата йде на банківський рахунок у профілі, а він ваш. Це звучить як добра новина і нею не є: це означає, що шкода приходить як ваші гроші, що йдуть геть, як скопійовані картки ваших клієнтів і як ваш акаунт, використаний для чужого шахрайства, а не як переказ, на який можна вказати й піти по слідах.
Нічого з цього не потребує витонченого зловмисника. Власна документація Stripe каже, що шахрайські дійові особи безперервно перебирають публічні бази коду в пошуках відкритих ключів, і цим сканерам не треба знати, хто ви, щоб знайти ваш.
Як замінити секретний ключ Stripe, не зламавши платежі
Спершу створіть заміну, запустіть її в роботу, і лише тоді дайте старому завершитися. Саме в такому порядку.
- У панелі Stripe створіть новий секретний ключ. Старий поки не чіпайте; вони працюють одночасно, і саме це накладання тримає ваше оформлення замовлення на ходу.
- Покладіть новий ключ туди, де жив старий, а це має бути сервер, Edge Function або serverless-маршрут. Ніколи не застосунок, який завантажує браузер.
- Задеплойте, а потім прийміть один реальний платіж. Успішне списання це єдиний доказ, що новий ключ під'єднаний правильно.
- Дайте старому ключу завершитися. Stripe описує це саме так: завершення секретного чи обмеженого ключа не дає йому зробити жодного подальшого виклику API.
- Прочитайте історію платежів за період, коли ключ був відкритий, і свою пошту від Stripe на предмет усього, чого ви не робили.
Якщо ключ уже назовні і ви радше втратите кілька платежів, ніж лишите його активним ще на годину, зробіть навпаки. Заміна ключа блокує його одразу й генерує новий, а Stripe зазначає, що створені старим ключем вебхук-ендпоїнти лишаються активними, тож ваша обробка подій переживе аварійну ситуацію.
Є ще один крок, і саме його більшість робить першим: видалити ключ із коду. Зробіть це, розуміючи, що саме воно дає. Ваші відвідувачі вже завантажили файл, який його ніс, той файл лежить у кешах браузерів, які ви не контролюєте, а старе значення досі є у вашій історії версій. Завершити ключ у Stripe це те, що зачиняє двері. Прибрати рядок це те, що не дає вам відправити його знову.
Публічні ключі, до речі, завершити не можна взагалі. Stripe ніколи не будував такого засобу, бо той ключ ніколи й не мав бути закритим.
Що таке обмежений ключ Stripe і коли він є правильною відповіддю
Ключ, вирізаний під одну роботу, а не під усі.
Обмежений ключ починається з rk_live_ і несе лише ті права, які ви позначили
під час створення. Ключ, якому дозволено читати рахунки, не зробить повернення.
Ключ, якому дозволено створювати списання, не прочитає ваш список клієнтів.
Stripe радить переходити із секретних ключів на обмежені саме з цієї причини, і
це добра порада про код, який працює на вашому сервері.
Це не спосіб зробити прийнятним ключ у браузері. Два з 30 998 застосунків нашого обходу віддавали обмежений ключ у фронтенді, і обидва отримали оцінку C. Наш скан вважає обмежений ключ високою знахідкою там, де секретний є критичною, а одна висока знахідка ставить стелю на оцінці C. Той, хто знайде цей ключ, усе одно отримає кожне право, яке ви позначили, звідки завгодно.
Де обмежений ключ справді заробляє своє місце, так це в незручному проміжному випадку, а застосунки, зібрані з ШІ, породжують їх чимало. Інструмент автоматизації, якому треба читати ваші виплати. Скрипт звітності, який хтось написав вам на Fiverr. Edge Function, яка створює лише один вид списання. Кожне з цього працює на сервері й кожному потрібна частка вашого акаунта, тож кожне отримує власний ключ саме з тією позначеною часткою, і того дня, коли один витече, ви відкликаєте один ключ, а не перезбираєте всю інтеграцію.
Як перевірити, що ваш застосунок віддає насправді
Почніть руками, бо це нічого не коштує й нічого не треба встановлювати.
Відкрийте свій робочий сайт, подивіться вихідний код сторінки й пошукайте в
ньому sk_live_, потім rk_live_, потім pk_live_. Знайти третій і не
знайти перших двох це той результат, який вам потрібен.
Чого пошук у вихідному коді не бачить, так це JavaScript, який сторінка
завантажує після, а в застосунку, зібраному в Lovable, Bolt чи Replit, це майже
все. Наш безкоштовний сканер відкриває ваш застосунок у справжньому браузері,
чекає, доки надійдуть бандли, і читає їх. Він класифікує те, що знаходить, а не
просто збігається з рядками, схожими на ключ, тож pk_live_ повертається
позначеним як правильний, а sk_live_ як критична знахідка, і ці двоє ніколи
не опиняються в одній купі.
Оцінка, бали й підрахунки з'являються на екрані приблизно за 20 секунд, без акаунта. Дасте адресу пошти, і разом із нею прийде докладний перелік, а до нього виправлення, написане під той білдер, яким ви користувалися, і його можна вставити як є.
Три речі, яких скан не робить, і саме вони є причинами, чому його можна
спокійно наводити на робочий застосунок, що приймає справжні платежі: він
ніколи не входить в акаунт, ніколи нічого не записує й ніколи не зберігає
знайдений ключ. Відкритий секрет зберігається як маскована підказка вигляду
sk_live_…a1b2, а справжнє значення викидається.
Проскануйте застосунок або спершу прочитайте,
на що дивиться кожна з дев'яти перевірок.
Що зробити просто зараз
Що робити
- Перш за все прочитайте другий символ.
pk_live_у вашому бандлі це правильно й нічого не потребує;sk_live_іrk_live_потребують. - Спершу створіть ключ на заміну й підтвердьте ним реальний платіж, і лише тоді дайте старому завершитися у Stripe. Саме завершення зачиняє двері.
- Видалити ключ із коду саме собою не зачиняє нічого. Файл, який його ніс, уже завантажений, лежить у кеші й є у вашій історії версій.
- Перенесіть на сервер усе, чому був потрібен той ключ: Edge Function, serverless-маршрут, будь-що, що не є браузером.
- Прочитайте історію платежів і список клієнтів за період, коли ключ був активним. Заміна спиняє те, що станеться далі, і нічого не каже про те, що вже сталося.
- Дайте кожній серверній задачі власний обмежений ключ лише з потрібними їй правами, щоб наступний витік коштував вам одного ключа, а не всіх.
Ключ Stripe зазвичай приходить пізно. Застосунок виходить, працює якийсь час, а тоді одного дня ви додаєте оформлення замовлення, і саме цей деплой уперше кладе в бандл платіжні дані доступу. Скан, який ви запустили на старті, був знімком застосунку, який ще не вмів приймати гроші.
Reeve Monitor зроблений саме для цього розриву. Він проганяє всі дев'ять перевірок щогодини на трьох застосунках, стежить за доступністю кожні 60 секунд, повідомляє вам того дня, коли результат змінився, замість чекати, доки ви подивитеся, і надсилає щомісячний звіт простою мовою. Ключ, який потрапив у бандл із четверговим деплоєм, буде в скані тієї самої години. Це $12 на місяць за прайсом, із сімома безкоштовними днями до першого списання, а сторінка тарифів інколи показує менше за цифру тут і ніколи більше.
Якщо вам зручніше йти за списком, то 10-хвилинний чекліст безпеки покриває це разом з іншим, що варто закрити у щойно запущеному застосунку. Щодо ширшого питання, яким ключам узагалі місце в браузері, у нас є посібник про те, як відрізнити публічні ключі від секретних, те саме питання для ключа OpenAI, і перепис того, що 30 998 застосунків віддавали насправді.
Поширені запитання
Чи безпечний мій публічний ключ Stripe у фронтенді?
Так. Ключ, що починається з pk_live_, має бути на сторінці, і Stripe пише про це у власній документації: публічні ключі можна безпечно відкривати у фронтенд-коді. Він будує форму оплати й токенізує картку. Він не може прочитати ваших клієнтів, рухати гроші чи щось повертати. Якщо сканер або знайомий сказав вам, що ключ Stripe відкритий, спершу прочитайте другий символ, бо ключ pk_live_ у вашому бандлі це ваша інтеграція, яка працює рівно так, як її задумав Stripe.
Що хтось може зробити з витеклим секретним ключем Stripe?
Усе, що можете ви у власній панелі й для чого не потрібен пароль. Прочитати повний список ваших клієнтів з іменами, електронними адресами, адресами для рахунків і останніми чотирма цифрами кожної картки, прочитати кожен платіж, який ви коли-небудь прийняли, робити повернення, доки ваш баланс не спорожніє, створювати списання й платіжні посилання, а також проганяти крадені номери карток через ваш акаунт, щоб знайти ті, які ще працюють. Останнє Stripe називає card testing, і до вас воно приходить як спори та відмови на акаунті, який ви вважали спокійним.
Як замінити ключ Stripe без зупинки платежів?
Спершу створіть заміну. У панелі Stripe створіть новий секретний ключ, покладіть його туди, де жив старий, на вашому сервері, задеплойте й підтвердьте один реальний платіж новим ключем. Лише після цього дайте старому завершитися, і він більше не зробить жодного виклику API. Якщо ключ уже публічний і ви радше втратите кілька платежів, ніж лишите його активним, замініть його негайно: заміна блокує ключ одразу й генерує новий, а Stripe зазначає, що створені старим ключем вебхук-ендпоїнти лишаються активними.
Що таке обмежений ключ Stripe?
Ключ, вирізаний під одну роботу. Обмежений ключ починається з rk_live_ і несе лише ті права, які ви позначили під час створення, тож ключ, якому дозволено читати рахунки, не зможе зробити повернення. Stripe радить переходити із секретних ключів на обмежені саме тому. Читайте це як пораду про код на вашому сервері, а не як спосіб зробити прийнятним ключ у браузері: обмежений ключ у вашому бандлі лишається обліковими даними, якими може скористатися стороння людина, і наш скан оцінює його як високу знахідку.
Чи повідомить Stripe, якщо мій ключ витече?
Інколи, і покладатися на це не можна. Stripe пише, що активно шукає в інтернеті витеклі ключі API, зокрема інструментами на кшталт сканера токенів GitHub, і що може повідомити вас або деактивувати знайдений ключ. Його ж сторінка з найкращими практиками додає, що виявлення не гарантоване. Найкраще той пошук працює на публічних репозиторіях коду, а ключ, вкомпільований у JavaScript вашого власного домену, репозиторієм не є. Вважайте скомпрометованим будь-який ключ, який ви побачили там, де його бути не мало, незалежно від того, сказав Stripe щось чи ні.
Чи небезпечний тестовий ключ (sk_test_) у фронтенді?
Це значно менша проблема, ніж активний ключ, і її все одно варто закрити. Тестовий ключ торкається лише вашої пісочниці для тестів, тож ваших грошей ним ніхто не візьме. Що він справді віддає, так це робочу карту того, як зібрана ваша інтеграція, і зазвичай він означає, що тій самій звичці копіювати й вставляти лишився один деплой до того, щоб відправити активний ключ. Stripe вважає скомпрометованим будь-який секретний чи обмежений ключ, побачений там, де його бути не мало. Завершіть його й перенесіть виклик на сервер.