Основи безпеки
Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit
Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.

Коротко
- Чи безпечний Replit? Як хостинг він не був місцем знахідок. Кожен із дев’яти застосунків із 3 042, що отримали D або F, дійшов туди через щось усередині самого застосунку.
- Типова знахідка Replit це власний API: 1 050 із 3 037 застосунків мали маршрут, який віддавав дані незнайомцю без входу, бо застосунок Replit зазвичай виходить із власним сервером.
- Із 219 застосунків із чимось схожим на ключ у завантажуваному коді три тримали ключ, який списує гроші з рахунку. 2 789 із 3 042 отримали A.
Ви збудували щось на Replit, воно працює, і ви ось-ось пустите туди справжніх людей. Десь на тому тижні ви набрали «чи безпечний replit» у пошуку, і у відповідь прийшла або сторінка про сертифікації Replit, або сторінка про ШІ-агента, який видалив базу даних. Жодна з них ні словом не згадала застосунок, який ви збираєтеся опублікувати.
Ось у чому більшість тих відповідей помиляється: «чи безпечний Replit» це три запитання в одному реченні, і те з них, яке вирішує, чи зможуть незнайомці читати дані ваших користувачів, майже ніхто не вимірює.
Ми можемо його виміряти. Між 12 і 14 серпня 2026 року ми прогнали 30 998 живих застосунків через ті самі дев’ять зовнішніх перевірок, які будь-хто може безкоштовно запустити на нашій головній сторінці, і 3 042 з них були опубліковані на Replit. Ось що повернулося для них, і де наш погляд зупиняється.
Чи безпечний Replit?
Як хостинг він не був місцем знахідок. Дві речі, які ми можемо побачити про хостинг іззовні, виявилися чистими на кожному застосунку, що відповів, а дев’ять застосунків з оцінкою D чи F дійшли туди через щось усередині застосунку.
Уявіть Replit як орендовану крамницю з майстернею позаду. Орендодавцю належить будівля і замок на дверях з вулиці. Той, хто облаштовував крамницю, вирішив, де стоять полиці і як задня кімната сполучається з передньою. А що перехожий може дістати з тротуару, вирішуєте ви, щоразу, коли відчиняєте. Це три різні запитання, і добра відповідь на перші два нічого не каже про третє.
- Платформа. Чи Replit хостить ваш застосунок як слід: чинний сертифікат, домен, який не закінчиться, секрети зашифровані й поза вашими файлами. Це орендодавець.
- Агент. Чи безпечний код, який пише ШІ Replit. Це майстер, і жодне сканування іззовні не бачить проводки.
- Застосунок, який ви опублікували. Те, до чого незнайомець може дістати з вулиці: ключ у коді, який завантажує браузер, маршрут API, що відповідає без входу, файл, який ніколи не мав отримати URL-адресу.
Наші перевірки читають третє. Щодо першого: сертифікат був чинний на всіх 3 028 застосунках, де ми змогли його прочитати, і жоден домен із 3 042 не був близький до закінчення. Щодо другого нам нічого вимірювати, і розділ про це нижче так і каже.
Що ми знайшли в 3 042 застосунках Replit
Дев’ять перевірок, запущених іззовні, без входу і без доступу до чийогось облікового запису. Ми ніколи не читали жодного рядка: там, де база даних відповідала, ми запитували, скільки рядків вона віддасть, і на цьому зупинялися. Жоден застосунок не названо ні тут, ні деінде в наших публікаціях. Кожна частка нижче рахується від застосунків, на яких ця перевірка відповіла, бо перевірка, яка не змогла завершитися, це невідомість, а не залік, і саме це правило пояснює, чому знаменники рухаються. Метод і дані є у звіті.
| Що ми перевіряли | Застосунки Replit | Хто це вирішує |
|---|---|---|
| Бракує заголовків безпеки браузера | 2 924 із 3 042 (96 %) | Те, що віддає сторінку |
| Маршрут API, який відповів незнайомцю даними | 1 050 із 3 037 (35 %) | Ваш застосунок |
| Щось схоже на ключ у коді, який завантажує відвідувач | 219 із 3 042 (7 %) | Ваш застосунок |
| Опубліковано оригінальний вихідний код (source maps) | 168 із 3 041 (6 %) | Налаштування збірки |
| Будь-якому сайту дозволено викликати ваш API | 76 із 3 037 | Ваш застосунок |
| Будь-якому сайту дозволено викликати його з кукі ваших користувачів | 56 із 3 037 | Ваш застосунок |
Приватний файл на кшталт .env чи .git/config за публічною URL | 7 із 3 023 | Ваш застосунок |
| Таблиця бази даних, яку можна читати без входу | 4 із 3 033 | Ваш застосунок |
| Сховище (bucket), яке показує список своїх файлів | 0 із 3 035 | Ваш застосунок |
| Сертифікат прострочений або недовірений | 0 із 3 028 | Replit |
| Домен ось-ось закінчиться | 0 із 3 042 | Replit |
Оцінки: 2 789 A, 183 B, 61 C, 8 D і 1 F. Тридцять один застосунок не мав жодної знахідки.
Чому «99 % мали знахідку» тут мало що означає
Бо 2 924 з тих знахідок це одна й та сама, і вона найменш термінова з усіх, які може містити звіт.
Заголовки безпеки браузера надсилає те, що віддає вашу сторінку. На власному домені білдера це білдер, тому число тут 96 %, 99 % на Lovable і 100 % на v0, і тому кожен застосунок на тому самому хості отримує ту саму відповідь. Replit одне з небагатьох місць, де це можна змінити: якщо ваш застосунок запускає власний сервер, саме той сервер надсилає заголовки, і додати їх це кілька рядків. Це варто зробити, і не з цього складається D.
Приберіть цей рядок, і 1 798 із 3 042 застосунків не мали нічого, що випливало б зі збудованого. Решта 1 244 це те, про що решта цієї статті.
Знахідка у формі Replit: власний маршрут API
Найпоширеніше з того, що ми знайшли і що власник поклав туди сам, це маршрут на власному сервері застосунку, який відповідав незнайомцю даними. 1 050 із 3 037 застосунків мали принаймні один.
Застосунок Lovable це фронтенд плюс база даних, яку запускає хтось інший.
Застосунок Replit зазвичай це вся крамниця: сторінка і сервер за нею, що
розмовляє з базою даних, у тому самому проєкті і часто написані в тому самому
сеансі. Сьома з наших дев’яти перевірок читає шляхи API, вписані в JavaScript
вашого застосунку, /api/orders, /api/users, що знайде, і питає кожен із
них без входу, чи він відповість. На Lovable це спрацювало на 8 застосунках із
18 518, бо там зазвичай немає власного сервера власника, який можна спитати. На
Replit спрацювало на 1 050.
Ця знахідка має середню вагу, бо іноді так і має бути. Маршрут, який віддає ваш
публічний список товарів, має відповідати всім. Це неправильно, коли маршрут
називається /api/users, а відповідь це ваші користувачі з їхніми адресами
електронної пошти, і дізнаєтеся ви про це тому, що будь-хто може відкрити цю
адресу у вкладці й прочитати. Маршрут, який має бути приватним, потребує
перевірки входу, а кожен без входу отримує 401.
У крамниці це задні двері, які відчиняються з вулиці. Якщо ви користувалися Supabase, це та сама вада, яку ви бачили описаною як таблиця без Row Level Security, в іншій формі. Рядки читаються, бо ніщо між незнайомцем і даними не спитало, хто він.
Поруч дві менші знахідки. 76 застосунків сказали будь-якому сайту у світі, що він може викликати їхній API, а ще 56 дозволили це з доданими кукі входу відвідувача, і це той варіант, який дає іншому сайту діяти від імені вашого користувача, і той, що рідко буває правильним.
З чого складається «7 % відвантажили секрет»
Здебільшого з ключів Google. 219 із 3 042 застосунків мали щось схоже на ключ у коді, який завантажує відвідувач, і 200 з них були ключем Google API, що зазвичай нормально, щойно його обмежили вашим доменом. Тридцять два несли схоже на ключ значення, яке ми не змогли приписати жодному постачальнику. Три застосунки тримали ключ, який списує гроші з рахунку напряму: ключ OpenAI, Anthropic або AWS.
Три з 3 042 це рідкість. Водночас це знахідка, яка сама по собі коштує грошей, ключ від каси, залишений на прилавку, і виявляється вона зазвичай як рахунок за використання, що приходить раніше, ніж хтось щось помітив. Сканер, який порівнює форми, надрукував би всі 219 як проблеми; ми читаємо, що може кожен ключ, бо інакше ми навчили б вас ігнорувати попередження в той день, коли воно має значення.
На Replit шлях, яким ключ потрапляє в бандл, достатньо особливий, щоб мати
власну статтю. Інструмент Secrets тримає
значення поза вашими файлами, і робить це добре. Він не може тримати його поза
браузером, якщо його читає браузерний код, а щоб це запрацювало, люди
перейменовують змінну на VITE_ або NEXT_PUBLIC_, що є вказівкою інструменту
збірки опублікувати її.
Дві речі, які ви виправляєте одним налаштуванням
Source maps і приблудний приватний файл. Обидві вирішуються тим, як збирається проєкт, і обидві це налаштування, а не переписування.
168 застосунків публікували source maps, а це означає, що оригінальні файли за застосунком, разом із коментарями, можна читати в інструментах розробника будь-якого браузера. На Replit конфігурація збірки лежить у вашому проєкті, тож перемикач ваш; що відкриває опублікована мапа, а чого ні варто прочитати, перш ніж вирішити, що це неважливо.
Сім застосунків віддавали приватний файл за звичайною URL-адресою: .env,
.git/config. П’ять із дев’яти застосунків з оцінкою D чи F мали цю знахідку,
і це найкоротший шлях до поганого дня з усього списку, бо .env за URL-адресою
це кожен ключ у ньому за один запит. У приватному вікні відкрийте свою
опубліковану адресу з /.env наприкінці. Має не вийти. Якщо показує текст,
сьогодні ж замініть кожен ключ у цьому файлі, а потім заберіть файл із того, що
розгортаєте.
Чи безпечний код, який пише агент Replit?
Ми його не вимірювали, і жодне сканування іззовні не може. Сканування бачить результат: 1 050 відкритих маршрутів і три ключі, що списують гроші, хтось написав, агент чи людина, і опублікував.
Задокументована одна подія. У липні 2025 року агент Replit видалив робочу базу даних посеред сеансу, в якому йому сказали нічого не змінювати, і CEO Replit публічно це визнав; розділення баз даних розробки і робочих стало частиною відповіді компанії. Що з цього випливає для вас, однакове на кожному білдері з агентом усередині: тримайте агента подалі від живої бази даних і тримайте копію своїх даних там, куди агент не дістане.
Де живе ця копія, залежить від того, де ваші дані. Якщо ваш застосунок Replit тримає їх у Supabase, це те, що зберігає Care. Якщо вони у власній базі даних Replit, ми не можемо зробити її резервну копію, і перед тим, як вона вам знадобиться, варто прочитати, що інструмент бази даних Replit пропонує для відновлення. Лише 14 із 3 042 просканованих застосунків Replit взагалі називали проєкт Supabase, тож для більшості діє другий випадок.
П’ятихвилинна перевірка вашого власного застосунку Replit
Кожен пункт це URL-адреса, яку ви відкриваєте, або пошук, який ви запускаєте. Користуйтеся приватним вікном, щоб ваш власний вхід не відповідав замість незнайомця.
- Відкрийте свою опубліковану адресу з
/.envнаприкінці, потім/.git/config. Обидва мають не вийти. Якщо котрийсь показує текст, сьогодні ж замініть кожен ключ у ньому. - Так само відкрийте один зі своїх маршрутів API, такий, який ви не хотіли б дати прочитати незнайомцю. Якщо він відповідає, цьому маршруту потрібна перевірка входу.
- Пошукайте у проєкті
VITE_іNEXT_PUBLIC_. Кожен збіг це значення, яке ваш інструмент збірки публікує навмисно, і кожне має бути ключем, який було безпечно публікувати. - Відкрийте свій живий застосунок, а потім вкладку Sources в інструментах розробника браузера. Якщо ви можете читати свої оригінальні файли з коментарями, source maps увімкнені.
- Або нехай це зробить сканування. Воно запускає ці чотири і ще п’ять іззовні, триває близько 20 секунд, не потребує облікового запису і друкує «Не вдалося перевірити» для всього, на що не змогло відповісти, замість галочки: просканувати застосунок.
Що змінюється після того, як ви публікуєте знову?
Будь-що. Публікація на Replit це один рух, тож зміна живе тієї ж миті, коли ви її зробили, і між вами та інтернетом немає жодного кроку розгортання, який зловив би маршрут, що втратив перевірку входу, або ключ, вставлений опівночі, щоб пройти повз збірку, яка падала. Сканування минулого місяця описує застосунок минулого місяця.
Reeve Monitor зроблений саме для такої форми застосунку: хтось, хто щогодини проходить повз крамницю і смикає двері. Він щогодини повторює всі дев’ять перевірок на щонайбільше трьох застосунках, стежить за доступністю кожні 60 секунд, повідомляє вам, коли результат змінюється, замість чекати, поки ви подивитеся, і надсилає щомісячний звіт. Коштує $12 на місяць за прайсом, із сімома безкоштовними днями до першого списання; сторінка цін іноді буває нижчою за цифру тут і ніколи вищою. Monitor лише стежить, і для застосунку Replit це зазвичай правильна половина: Care, наш план резервного копіювання, зберігає лише копію бази даних Supabase, а більшість застосунків Replit тримають дані деінде.
Що зробити цього тижня
Що робити
- Відкрийте
/.envі/.git/configза своєю опублікованою адресою у приватному вікні. Обидва мають не вийти. - Відкрийте свої маршрути API без входу. Будь-який маршрут, що відповідає приватними даними, потребує перевірки входу і 401 для всіх інших.
- Пошукайте у проєкті
VITE_іNEXT_PUBLIC_. Кожен збіг публікується навмисно і має бути ключем, який було безпечно публікувати. - Вимкніть source maps у конфігурації збірки, якщо не хочете, щоб ваші оригінальні файли можна було читати з браузера.
- Тримайте агента подалі від живої бази даних і тримайте копію своїх даних там, куди він не дістане.
Покроковий посібник для цієї платформи це чи безпечний ваш застосунок Replit, а десятихвилинний чекліст безпеки охоплює те, що варто підтвердити в будь-якому щойно запущеному застосунку.
Поширені запитання
Чи безпечний Replit для справжнього продукту?
Як хостинг: ніщо в 3 042 живих застосунках Replit, які ми просканували, не вказувало на хостинг. Кожен сертифікат, який ми змогли прочитати, був чинний, і жоден домен не був близький до закінчення. Знахідки, які вирішували оцінку, всі сиділи в застосунку, що його опублікував власник, і вони мають ту саму форму на кожному білдері, який ми вимірювали. Чи безпечно запускати там ваш продукт, залежить від того, що ваш застосунок віддає відвідувачу, а це можна перевірити приблизно за п’ять хвилин.
Чи справді секретні Replit Secrets?
Для своєї роботи так. Значення шифрується і тримається поза файлами проєкту, тож поширення чи форк проєкту його не видає. Чого інструмент не може вирішити, так це куди ваш застосунок понесе значення далі. Ключ, який читає код на машині Replit, там і лишається. Ключ, який читає код у браузері відвідувача, вбудовується в те, що ви публікуєте, хоч би де він зберігався, і змінна з назвою VITE_ або NEXT_PUBLIC_ це саме він.
Чи можуть люди бачити мій вихідний код на Replit?
Браузерну половину завжди, бо браузер не може намалювати сторінку, яку йому не надіслали. Чи побачать вони її як ваші оригінальні файли або як стиснутий результат, залежить від source maps, які публікували 168 із 3 041 перевірених застосунків Replit. Ваш серверний код лишається на Replit, якщо тільки приватний файл на кшталт .env чи .git/config не отримав публічну URL-адресу, а це зробили 7 із 3 023 застосунків.
Чи безпечний опублікований застосунок Replit за замовчуванням?
Немає налаштування за замовчуванням, яке робить його безпечним, і немає такого, яке робить його небезпечним. 2 789 із 3 042 просканованих застосунків отримали A. Решта мали знахідку, що випливала зі збудованого: маршрут на власному сервері, який відповідав без входу, ключ у завантажуваному коді або приватний файл за публічною адресою. Ніщо в хостингу не дало D чи F.
Яка найпоширеніша проблема безпеки в застосунках Replit?
Якщо відкласти заголовки, яких бракує майже кожному застосунку на кожному білдері, це маршрут API, який відповідає незнайомцю даними. 1 050 із 3 037 застосунків Replit, на яких ця перевірка змогла відповісти, мали принаймні один. Застосунок Replit зазвичай несе власний сервер, тож має власні маршрути, які можна лишити відкритими, тоді як застосунок Lovable здебільшого їх не має.