Перейти до вмісту

Основи безпеки

Як користуватися секретами в Replit і що все одно публікується

Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.

Vlad Tkachenko7 хв читання
Логотип Replit, стрілка до замкненого сховища прихованих значень і ще одна стрілка до працюючого застосунку, який їх читає.

Коротко

  • Як користуватися секретами в Replit: відкрийте інструмент Secrets, додайте назву та значення й читайте це значення в коді як змінну середовища.
  • Це тримає ключ поза вашими файлами. Поза вашим опублікованим застосунком воно його не тримає, бо все, що читає код у браузері, вбудовується в те, що завантажує кожен відвідувач.
  • Ознака це назва. Змінну, що починається з VITE_ або NEXT_PUBLIC_, ваш інструмент збірки поклав у браузер навмисно.
  • Порожній секрет в опублікованому застосунку зазвичай означає, що робочу версію опублікували раніше, ніж ви його створили. Опублікуйте ще раз.

Десь між створенням застосунку та його публікацією Replit сказав вам перестати писати ключ API просто в коді. Тож ви подивилися, як користуватися секретами в Replit, перенесли ключ в інструмент Secrets, і попередження зникло. Потім вам сказали, що ключ усе ще видно у вашому опублікованому застосунку, і обидві ці речі здаються правдою одночасно.

Так і є. Ось частина, яку більшість порад про це оминає: інструмент Secrets вирішує, де значення зберігається. Ваш код вирішує, куди його понесуть. Це два окремі питання, і лише перше має хоч якийсь стосунок до інструмента.

На Replit це б’є найдужче, бо половина вашого застосунку, яка працює на машині Replit, і половина, яка працює на ноутбуці вашого відвідувача, лежать в одному проєкті, часто в сусідніх файлах. Ніщо в редакторі не проводить між ними лінію.

Між 12 та 14 серпня 2026 року ми прогнали ті самі дев’ять зовнішніх перевірок через 30 998 робочих застосунків, з яких 3 042 опубліковані на Replit. У 219 з цих застосунків Replit щось схоже на ключ лежало в коді, який завантажує відвідувач. По всій вибірці більшість того, що знаходить ця перевірка, це ключ Google, з яким після обмеження зазвичай усе гаразд. Ті, з якими не гаразд, це саме ті, яким мав би запобігти інструмент секретів. Повні цифри є в нашому звіті сканування.

Як користуватися секретами в Replit?

Відкрийте інструмент Secrets, додайте назву та значення й читайте це значення у своєму коді як змінну середовища. Це займає близько хвилини.

  1. У своєму проєкті відкрийте Secrets. Він у списку інструментів, і пошук за цим словом у панелі інструментів його знаходить.
  2. Виберіть + New secret. Дайте назву великими літерами з підкресленнями, наприклад OPENAI_API_KEY. Саме цю назву використає ваш код, тож вона важливіша, ніж здається.
  3. Вставте значення в друге поле й збережіть. Replit шифрує його й тримає поза файлами проєкту.
  4. Прочитайте його в коді. У JavaScript це process.env.OPENAI_API_KEY, а в Python os.getenv("OPENAI_API_KEY").
  5. Поверніться й видаліть значення там, де воно було раніше.

П’ятий крок це той, який пропускають, і той, від якого залежить, чи було з усього цього хоч щось. Створення секрету не прибирає копію, яка у вас уже була. Ключ, вставлений у файл минулого тижня, і далі в тому файлі, і далі в історії вашого проєкту, і далі всередині кожної копії вашого застосунку, опублікованої відтоді.

Файл .env виконує ту саму роботу, що й інструмент Secrets, з однією важливою різницею: це файл, тож він подорожує разом із проєктом, коли хтось робить форк або підключає проєкт до репозиторію.

Чи безпечні секрети Replit?

Для того, що вони роблять, так. Значення зашифроване, воно лежить поза вашим кодом, і три найпоширеніші способи втратити ключ цим закриваються: ви ділитеся проєктом зі співавтором, ви підключаєте його до репозиторію, або хтось дивиться, як ви працюєте.

Уявіть це як замкнену шухляду. Те, що лежить у шухляді, приховане від будь-кого, хто читає ваші файли. Чого шухляда вирішити не може, так це що ваш застосунок робить із вмістом після того, як ваш власний код її відчинив і пішов далі.

А опублікований застосунок Replit іде далі з чималим. Кожен відвідувач, який завантажує ваш сайт, отримує всю передню половину, бо браузер не може намалювати сторінку, якої йому не надіслали. Якщо код, що відчиняє шухляду, це код, який надсилають відвідувачам, вийняте значення подорожує разом із ним.

Яка половина вашого застосунку читає ключ?

Половина, яка працює на машині Replit, може читати секрет безпечно. Половина, яка працює в браузері вашого відвідувача, не може, і звичний спосіб змусити її працювати водночас є способом, яким ключ стає публічним.

Ваш серверний код це та частина, яку запускає Replit: маршрут Express, обробник на Python, функція, що спілкується з OpenAI чи Stripe і повертає вашому застосунку відповідь. Вона читає секрет, використовує його, і значення ніколи не залишає машину.

Ваш код у браузері це все, що виконує ноутбук вашого відвідувача. У проєкті на React це більша частина того, що ви редагували. Він компілюється у пакунок JavaScript і повністю завантажується кожним, хто відкриває ваш сайт.

Одна шухляда, двоє читачів. Значення йде туди, куди йде код, який її відчинив.

process.env у браузері не існує, тож код у браузері, який його читає, не отримує нічого. Щоб значення все ж дійшло, хтось його перейменовує: VITE_OPENAI_API_KEY у проєкті на Vite або NEXT_PUBLIC_OPENAI_API_KEY у проєкті на Next.js. Це працює одразу, бо такий префікс це інструкція інструменту збірки записати значення всередину пакунка. Власна документація Vite каже це прямо й радить не класти туди ключі API саме з цієї причини.

Тож найшвидша перевірка в цій статті це пошук. Відкрийте свій проєкт і пошукайте VITE_ та NEXT_PUBLIC_. Кожен збіг це значення, яке ваш інструмент збірки має вказівку опублікувати.

Для деяких це правильно. Публічний ключ Supabase створений для того, щоб бути в браузері, і ключ Google Maps з обмеженням за referrer теж. Неправильно це для всього, що витрачає гроші або читає базу даних, не питаючи, хто стукає, а відрізнити одне від одного займає близько хвилини на ключ.

Якщо ви радше подивилися б, що ваш опублікований застосунок віддає, перш ніж іти файл за файлом, наше безкоштовне сканування читає ваш сайт ззовні й каже, що воно там знаходить. Воно триває близько 20 секунд і не потребує облікового запису: сканувати застосунок.

Чому мій секрет Replit не працює?

Дві причини, і з вашого місця вони дають однаковий симптом: порожнє значення й застосунок, який не працює.

Код, який його читає, працює в браузері. Там немає жодного середовища для читання, тож process.env.ВАШ_КЛЮЧ порожній і таким залишиться. Це не проблема налаштувань, і скільки б разів ви не створювали секрет наново, з місця воно не зрушить. Виклик, якому потрібен ключ, має переїхати в серверну половину вашого застосунку.

Ваш опублікований застосунок працює на старішій версії. Replit тримає два набори значень: ті, що у вашому робочому просторі, і ті, з якими працює ваш опублікований застосунок. Вони синхронізуються, тож доданий секрет зазвичай доходить до розгортання. Але те, чим працюючий застосунок користується насправді, це те, що було на момент останньої публікації. Додайте секрет після неї, і працюючий застосунок нічого про нього не знатиме, доки ви не опублікуєте ще раз.

Та сама назва в обох місцях. Працюючий застосунок працює на значеннях, які були на момент вашої останньої публікації.

Власна інструкція Replit для застосунку, який працює в редакторі та ламається після публікації, починається саме в цьому місці, тож варто відкрити секрети розгортання й прочитати назви, перш ніж вважати щось зламаним. Назва, написана OPENAI_KEY в одному місці та OPENAI_API_KEY в іншому, дає те саме порожнє значення, що й відсутній секрет.

Розгортання, яке падає опівночі, це момент, коли беруть коротший шлях. Вставити значення просто в код розблоковує все за секунди, застосунок повертається, і ключ відтоді лежить у вашому опублікованому пакунку.

Ключ уже в моєму опублікованому застосунку. Що тепер?

Замініть його, перш ніж міняти будь-який код. У панелі постачальника створіть новий ключ і відкличте старий.

Цей порядок важливий, бо заміна це єдиний крок, після якого відкрите значення перестає працювати. Редагування коду прибирає його з поточної версії й лишає в історії проєкту, а з копіями вашого пакунка, які вже завантажили, закешували та обійшли краулери, не робить нічого. Те, що ваш застосунок маленький, теж не рятує: автоматичні краулери безперервно читають публічні сайти в пошуках рядків, схожих на ключі, не маючи жодного уявлення, хто ви.

Далі, у такому порядку:

  1. Покладіть новий ключ у Secrets і читайте його лише з серверного коду.
  2. Перенесіть виклик, якому він був потрібен. Усе, що спілкується з OpenAI, Anthropic, Stripe чи вашою базою даних адміністративним ключем, належить за маршрутом, який викликає ваш застосунок, щоб браузер питав ваш сервер, а ключ тримав сервер.
  3. Перегляньте сторінки використання та оплати постачальника за період, коли старий ключ був публічним. Заміна спиняє те, що станеться далі, і нічого не каже про те, що вже сталося.

Ключі постачальників моделей на Replit варто перевіряти першими. OPENAI_API_KEY це приклад, до якого вдається власна документація Replit, коли показує, як додати секрет, і публічного варіанту ключа OpenAI чи Anthropic не існує. Кожен із них списує гроші просто з вашого рахунку.

Ще одне місце, куди варто зазирнути, поки ви тут: якщо ваш проєкт публікує source maps, відвідувач може прочитати цей пакунок як оригінальні файли, які ви написали, з вашими власними назвами змінних на них.

Що зробити цього тижня

Що робити

  • Перенесіть кожен ключ в інструмент Secrets, а потім видаліть копії, залишені у файлах. Створення секрету не прибирає старе значення.
  • Пошукайте у своєму проєкті VITE_ та NEXT_PUBLIC_. Кожен збіг це значення, яке ваш інструмент збірки публікує навмисно, і кожне з них має бути ключем, який можна публікувати.
  • Для кожного, який таким не є, перенесіть виклик, що його використовує, у серверну половину, щоб браузер питав ваш застосунок, а ключ тримав застосунок.
  • Якщо секрет порожній в опублікованому застосунку, але працює в редакторі, опублікуйте ще раз і перевірте назву в секретах розгортання, перш ніж міняти код.
  • Замініть у постачальника все, що вже вийшло назовні, перш ніж чіпати код. Потім прочитайте сторінку оплати за тижні, коли ключ був публічним.

Спершу зробіть пошук. Він займає хвилину, нічого встановлювати не треба, і він каже, які з ключів у вашому проєкті вже публічні. Десятихвилинний чекліст безпеки охоплює решту того, що варто перевірити у щойно запущеному застосунку, а посібник простою мовою для цієї платформи це чи безпечний ваш застосунок Replit.

Поширені запитання

Чи безпечні секрети Replit?

Для того, що вони роблять, так. Replit шифрує значення й тримає їх поза вашими файлами, тож поділитися проєктом, підключити його до репозиторію чи вести стрім під час роботи більше не означає віддати ключ тим, хто дивиться. Чого інструмент вирішити не може, так це куди ваш застосунок понесе значення далі. Ключ, який читає код на машині Replit, залишається на Replit. Той самий ключ, який читає код у браузері вашого відвідувача, вбудовується в те, що ви публікуєте, і те, що ви спершу поклали його в Secrets, тут нічого не змінює.

Чому мій секрет Replit показує undefined?

Дві причини, і з вашого місця вони виглядають однаково. Або код, який його читає, працює в браузері, де немає жодного середовища для читання і в process.env нічого немає, або ваш опублікований застосунок працює у версії, розгорнутій до того, як ви створили секрет. Для другого випадку опублікуйте ще раз: працюючий застосунок використовує значення, які були на момент останньої публікації.

Чи можу я використати секрет у своєму фронтенді на React у Replit?

Покласти туди значення ви можете, і секретним воно не буде. Код React працює на машині вашого відвідувача, тож усе, що він читає, спершу треба надіслати на ту машину. Інструменти збірки роблять це явним через префікс: Vite віддає коду в браузері лише змінні, що починаються з VITE_, а Next.js лише ті, що з NEXT_PUBLIC_. Додати префікс це те, як люди змушують ключ працювати у фронтенді, і водночас момент, коли цей ключ стає публічним. Публічні ключі там доречні. Усе, що витрачає гроші або читає базу даних, належить серверу.

Чи треба додавати секрети ще раз під час публікації?

Зазвичай ні, бо секрети розгортання синхронізуються з робочим простором, але значення, яким користується ваш працюючий застосунок, це те, що було на момент останньої публікації. Секрет, доданий після неї, потрапляє в розгортання з наступною. Власна інструкція Replit для застосунку, який працює в редакторі та падає після публікації, починається саме тут, тож якщо під час розгортання чогось бракує, відкрийте секрети розгортання й перевірте, що назва там є і написана так само.

Я вставив ключ API у файл, перш ніж знайшов інструмент Secrets. Чи достатньо видалити файл?

Ні. Спершу замініть ключ у постачальника, бо саме це справді зачиняє двері, і лише потім переносьте значення в Secrets. Видалення рядка коду прибирає його з поточної версії, але не з історії проєкту й не з жодної копії вашого опублікованого застосунку, яку хтось уже має. Заміна це єдиний крок, після якого старе значення перестає працювати, і в панелі постачальника вона зазвичай займає близько хвилини.

Автор

Vlad Tkachenko

Засновник Reeve

Я щодня дивлюся на застосунки, зібрані в Lovable, Bolt, v0, Cursor і Replit, і на короткий список помилок, які трапляються в них знову і знову.

Більше про автора

Читати далі

Усі статті

Не впевнені, як справи у вашому застосунку?

Запустіть безкоштовне сканування й отримайте зрозумілу оцінку від A до F приблизно за 20 секунд. Без облікового запису й без картки.

Сканувати безкоштовно

Автоматична зовнішня перевірка, а не повний аудит. Відсутність знахідок не є гарантією безпеки.