Вайб-кодинг без счёта на 337 000 ₽: 7 проверок безопасности приложения, которое собрала нейросеть (2026)
Приложение от нейросети работает, но ключ API лежит в открытом коде, база читается всеми, а лимитов на запросы нет. Семь проверок, которые закрывают почти все дыры вайб-кодинга: где спрятать ключ, как поставить лимит трат в OpenAI и Anthropic, как включить RLS и готовый промпт для аудита.
20 мин чтения
Проверить безопасность приложения, которое собрала нейросеть, можно за вечер и без знания программирования. Хватает семи проверок: ключи API не лежат в открытом коде, в OpenAI и Anthropic стоит жёсткий лимит трат, платные запросы идут через сервер, база закрыта правилами доступа, права проверяются на сервере, ввод пользователей фильтруется, а формы ограничены по частоте запросов.
Зачем это делать, если всё и так работает? Работающее приложение и защищённое приложение живут в разных измерениях. Нейросеть пишет код, который открывается в браузере и радует глаз, а про то, что любой посетитель может вытащить из него твой ключ OpenAI, она молчит. Zapier в своём разборе описывает типичный сценарий: чужие люди находят ключ и накручивают счёт на 4000 долларов. По курсу ЦБ на 17 сентября 2026 года (84,17 ₽) это около 337 000 ₽, и оплачивать их придётся тебе.
Нейросеть собирает приложение, которое работает, и почти никогда сама не делает его безопасным. Первые три шага закрывают большую часть риска: вынеси все ключи в .env и перевыпусти засвеченные, включи RLS с политикой на каждой таблице базы, проверяй права пользователя на сервере. Лимит трат в OpenAI и Anthropic ставь сегодня же, это пять минут и страховка от счёта на сотни тысяч рублей.
Коротко: пять слов, без которых дальше будет непонятно
- Ключ API - пароль, по которому сервис вроде OpenAI понимает, с чьего счёта списывать деньги за запрос.
- Фронтенд - всё, что загружается в браузер посетителя. Любой может открыть этот код и прочитать.
- Бэкенд, серверная функция - код, который выполняется у тебя на сервере. Посетитель видит только результат.
- .env - файл с секретами, который живёт на твоём компьютере и на хостинге, но не попадает в git.
- RLS (Row Level Security) - правила в базе данных, которые решают, какой пользователь какие строки видит и меняет.
Насколько это реальная угроза: цифры 2025-2026
Цифры неприятные. По отчёту Veracode за 2025 год, 45% кода, который пишут нейросети, содержит уязвимости. Модели уверенно генерируют рабочие функции и так же уверенно пропускают проверки доступа.
В мае 2026 года исследователи из компании RedAccess под руководством Дора Цви просканировали тысячи приложений, собранных в Lovable, Replit, Base44 и Netlify. Больше 5000 из них не имели вообще никакой защиты или авторизации. Примерно 40% отдавали наружу чувствительные данные: медицинские сведения, финансовые записи, корпоративные презентации и стратегии, полные логи переписок клиентов с чат-ботами. 7 мая 2026 года эти результаты опубликовал Wired.
кода от нейросетей с уязвимостями, отчёт Veracode 2025
незащищённых вайб-приложений отдавали чувствительные данные, RedAccess, май 2026
без какой-либо авторизации нашли в одном исследовании
Многие из этих приложений открывались любому, кто просто знал адрес. У других защита была символической: войти можно с любой почтой, без подтверждения.
Чем это грозит лично тебе, если ты собрал сайт или бота для себя или клиента:
- Счёт за чужое использование. Украденный ключ OpenAI или Claude превращается в бесплатный доступ к моделям для кого угодно. Платишь ты.
- Утечка данных. Имена, телефоны, переписки твоих пользователей уходят в открытый доступ.
- Захват приложения. Посетитель даёт себе права администратора и удаляет записи, меняет цены, рассылает спам от твоего имени.
- Репутация и деньги бизнеса. Клиент, чьи данные утекли, к тебе не вернётся.
Для России есть пятый пункт, юридический. С 30 мая 2025 года за утечку персональных данных от 1000 до 10 000 человек гражданину грозит штраф 100-200 тысяч рублей, компании 3-5 миллионов. Об утечке нужно уведомить Роскомнадзор в течение 24 часов, за молчание штраф отдельный, от 1 до 3 миллионов для организации.
Проверка 1. Где хранить ключ API, чтобы его не украли
Это самая частая и самая дорогая дыра. Нейросеть, чтобы быстро показать результат, вставляет ключ прямо в код страницы. Код страницы уходит в браузер каждому посетителю. Дальше дело техники: открыть инструменты разработчика и скопировать строку, начинающуюся с sk-.
Правила для любого секрета (ключи OpenAI, Anthropic, Stripe, SendGrid, токены ботов):
- Никогда не вставляй ключ прямо в код.
- Не показывай его на скриншотах, в видео и на стримах.
- Не пересылай тем, кому он не нужен для работы.
- Не вставляй ключ в промпт чат-боту. Попроси агента сослаться на переменную окружения, значение он знать не должен.
Как сделать правильно, по шагам:
- Создай в корне проекта файл
.envи положи туда ключ строкой видаOPENAI_API_KEY=sk-твой-ключ. - Открой
.gitignoreи допиши туда.env. Без этого файл уедет на GitHub при первом же коммите. - В коде обращайся к ключу только через переменную окружения.
- На хостинге (Vercel, Netlify, Cloudflare Pages) пропиши тот же ключ в разделе переменных окружения проекта.
- Задеплой заново, чтобы хостинг подхватил переменную.
Если ключ хоть раз побывал в коде, на GitHub или в публичной ссылке, считай его украденным. Удаление строки из кода не помогает: ключ остаётся в истории git и в чужих копиях. Единственное лечение - удалить ключ в кабинете сервиса и выпустить новый.
Если ключи уже засвечены, порядок такой: заведи .env, замени все видимые ключи ссылками на переменные, удали старые ключи в кабинетах сервисов, создай новые, впиши их в .env, обнови переменные окружения на хостинге и задеплой. Про то, как держать такие правила в голове агента постоянно, у нас есть отдельный разбор настройки CLAUDE.md: туда стоит один раз записать «секреты только через .env», и Claude Code перестанет вставлять ключи в код.
Проверка 2. Как поставить лимит трат в OpenAI и Anthropic
Даже идеально спрятанный ключ может утечь: через подрядчика, через старый ноутбук, через заражённое расширение. Лимит трат превращает катастрофу на сотни тысяч рублей в неприятность на сумму, которую ты сам выбрал. Это самая дешёвая страховка из всех семи проверок.
Лимит трат в OpenAI API
- Зайди на platform.openai.com и открой нужный проект.
- Перейди в настройки проекта, раздел
Limits. - В блоке Spend нажми
Edit spend limitи впиши месячную сумму. - Включи переключатель
Enforce a hard limit. Это главное действие во всей инструкции. - Сохрани. Тот же лимит можно поставить на уровне всей организации.
Без жёсткого лимита ты получишь только оповещение, а запросы продолжат списывать деньги. С жёстким лимитом после достижения порога API отвечает ошибкой 429 с кодом project_spend_limit_exceeded. Оповещения при этом продолжают работать, так что можно поставить письмо на 50% и блокировку на 100%.
В документации OpenAI честно сказано: блокировка срабатывает не мгновенно, и фактический расход может немного превысить заданный порог. Ставь лимит с запасом ниже реального бюджета.
Лимит трат в Claude API (Anthropic)
У Anthropic лимиты живут в рабочих пространствах, и тут есть ловушка. На Default Workspace, куда по умолчанию попадают все ключи, лимиты поставить нельзя. Значит, ключ из него ограничен только общим потолком организации.
- В Claude Console открой
Settings, затемWorkspaces, нажмиCreate workspaceи назови его по имени приложения. - Переключись в новое пространство селектором в левом верхнем углу и выпусти API-ключ внутри него.
- Открой настройки пространства, вкладку
Spend limits, задай месячный потолок и пороги оповещений. - На вкладке
Rate limitsограничь число запросов и токенов в минуту, если приложению столько не нужно. - Старый ключ из Default Workspace удали, если приложение работало на нём.
Лимит пространства может быть только ниже лимита организации, выше не получится. Это удобно: одно приложение с утёкшим ключом не съест бюджет остальных проектов.
Как оплатить API OpenAI и Anthropic из России
Оба сервиса официально не работают с Россией: зарегистрироваться и пользоваться консолью получится только через рабочий VPN, а российские карты не принимаются ни в OpenAI, ни в Anthropic. Пополнить баланс API можно зарубежной картой или через сервис оплаты подписок, который закидывает деньги на твой аккаунт за рубли (реферальная ссылка: тебе тот же прайс, мне небольшой процент). Подробнее все способы с ценами разобраны в гайде как оплатить Claude из России.
Для безопасности тут есть приятный побочный эффект. Если пополняешь баланс заранее фиксированной суммой и не включаешь автопополнение, украсть больше этой суммы физически невозможно. Проверь в разделе биллинга, что автоматическое пополнение выключено, если оно тебе не нужно.
Ключи спрятаны и лимиты стоят, дальше пойдёт работа с самим агентом. Пройди мини-курс «Claude за вечер»: от установки до первых результатов на твоих задачах.
Пройти мини-курс →Проверка 3. Какой код нельзя оставлять во фронтенде
Правило простое: всё, что видит браузер, может изменить посетитель. Если скидка считается на странице, посетитель поставит себе скидку 100%. Если цена заказа уходит на оплату из браузера, он отправит цену в 1 рубль.
Только на сервере
- списание с карты, скидки, итоговая сумма заказа
- проверка логина и уровня доступа
- чтение, запись и удаление в базе сверх правил RLS
- любые вызовы платных API: нейросети, почта, SMS, платежи
- выдача тарифа или роли пользователю
Можно в браузере
- стили, вёрстка, анимации, тёмная тема
- подсказки при заполнении формы
- переключение вкладок и страниц
- форматирование данных для показа
- сортировка и фильтр уже видимых данных, поиск по мере ввода
Для серверного кода не нужен свой сервер. Подходят облачные функции: Supabase Edge Functions, Firebase Cloud Functions, Vercel Functions, Cloudflare Workers. Ключ лежит в переменных окружения функции, браузер отправляет запрос функции, функция идёт в OpenAI и возвращает ответ.
Попроси агента одной фразой: «Перенеси все вызовы платных API, расчёт цен и проверку прав в серверные функции. Во фронтенде не должно остаться ни одного секретного ключа».
Проверка 4. Как закрыть базу данных: RLS в Supabase и правила Firestore
Вторая по частоте дыра после ключей. Supabase и Firebase дают фронтенду публичный ключ для работы с базой. Это нормально и задумано так, но только при условии, что сама база закрыта правилами. Нейросети часто создают таблицы и забывают про правила. Результат: любой человек с публичным ключом (а он лежит в коде страницы) читает, меняет и удаляет всё.
Что проверить в Supabase:
- Открой проект, раздел таблиц. Таблицы без RLS Supabase помечает предупреждением, а владельцу приходит письмо.
- Включи RLS на каждой таблице в схеме public.
- Убедись, что у каждой таблицы есть хотя бы одна политика. Включённый RLS без политик закрывает таблицу полностью, и приложение сломается, это нормальный сигнал, что политики надо дописать.
- Загляни в Security Advisor, он подсвечивает таблицы без RLS и слишком широкие политики.
В Firebase и Firestore RLS нет, там то же самое делают правила безопасности (Security Rules). Проверь, что в них нет режима «разрешить всё», с которым проект создаётся для тестов.
Самая частая ошибочная политика, которую пишет нейросеть, разрешает чтение всем авторизованным пользователям. Звучит безопасно, но если регистрация открыта для любой почты, «авторизованный» означает «любой человек из интернета». Политика должна сравнивать владельца строки с текущим пользователем.
Если что-то в базе уже пошло не так и данные пропали, у нас есть отдельный playbook на случай, когда ИИ удалил базу.
Проверка 5. Кто что может: права пользователей на сервере
Разлогиненный посетитель должен видеть только публичные страницы и публичные данные. Это звучит очевидно, а на практике в вайб-приложениях админка часто спрятана лишь тем, что на неё нет кнопки.
Как выстроить права:
- Регистрацию и вход отдай готовой платформе: Supabase Auth, Firebase Authentication, Clerk или Auth0. Самописная авторизация от нейросети почти всегда дырявая.
- При регистрации записывай пользователю поле с уровнем доступа: обычный, платный, админ.
- Перед каждым защищённым действием (удалить запись, выдать доступ, открыть админку) проверяй этот уровень на сервере. Проверка в браузере не считается, её отключают за минуту.
- Не давай пользователю самому менять своё поле роли, закрой это политикой в базе.
Проверка 6. Что пользователь может отправить в твоё приложение
Любое поле ввода - это дверь. Через неё приходят не только имена и отзывы.
- Валидация полей. Почта должна быть похожа на почту, число на число, длина текста ограничена. Проверка нужна и в форме, и на сервере.
- Весь пользовательский текст показывай как обычный текст. Если отзыв посетителя вставляется на страницу как HTML, в отзыв можно вписать скрипт, и он выполнится у всех, кто откроет страницу.
- Отдавай только нужные поля. Если странице профиля нужны имя и аватар, запрос к базе должен возвращать ровно эти два поля. Если прилетает вся строка с телефоном, почтой и историей заказов, её видно в инструментах разработчика.
- Загрузка файлов. Храни файлы в отдельном сервисе (Supabase Storage, Cloudinary), ограничь допустимые типы и в форме, и на сервере, а на сервере проверяй реальную сигнатуру файла по первым байтам. Расширение
.jpgв имени ничего не гарантирует.
Проверка 7. Лимит запросов и защита от ботов
Это защита от второго сценария разорения. Ключ может быть спрятан идеально, но если твоя серверная функция обращается к OpenAI на каждый запрос без ограничений, бот просто будет дёргать функцию тысячи раз в минуту. Счёт растёт так же, только уже через твой же сервер.
- Поставь ограничение частоты запросов (rate limiting) на каждую функцию, которая тратит деньги или отправляет письма: например, не больше 10 запросов в минуту с одного пользователя или IP.
- На страницах, которые особенно активно долбят (регистрация, вход, форма генерации), добавь капчу или Cloudflare Turnstile.
- На форме входа ограничь число неудачных попыток. Это закрывает перебор паролей.
- Не подсказывай, существует ли аккаунт. Сообщение «пользователь с такой почтой не найден» помогает составить список твоих клиентов.
Ограничения бывают и у внешних сервисов: например, Google Sheets API ограничивает чтение 60 запросами в минуту. Полагаться на чужие лимиты нельзя: они защищают сам сервис, про твой кошелёк там никто не думает.
Формула: ключ в .env + жёсткий лимит трат + RLS на каждой таблице + проверка прав на сервере. Эти четыре вещи превращают вайб-приложение из открытого кошелька в обычный сайт с обычными рисками.
Бонус: проверь зависимости, нейросеть может выдумать библиотеку
Модели иногда предлагают установить пакет, которого не существует. Злоумышленники это знают: они регистрируют пакеты с часто выдуманными названиями и кладут внутрь вредоносный код. Приём называется slopsquatting.
Как защититься:
- Попроси агента перечислить все зависимости проекта и объяснить, зачем нужна каждая.
- Найди каждый пакет на npmjs.com или pypi.org руками.
- Поищи в интернете «название пакета scam» и «название пакета is it safe».
- Посмотри число скачиваний и живой ли репозиторий на GitHub.
- Сверь название посимвольно:
reqeustsвместоrequestsвыглядит почти так же.
Автоматически это умеет приложение Socket для GitHub, оно предупреждает о подозрительных пакетах в пулл-реквестах.
Промпт для аудита безопасности приложения
Начни с правил. Допиши в CLAUDE.md или AGENTS.md проекта пару строк о безопасности и контекст: что за приложение, где хостится, какие данные хранит. Потом прогоняй аудит после каждой крупной доработки. Промпт ниже рассчитан на Claude Code, Cursor или Codex, запускай его в режиме плана, чтобы агент сначала отчитался, а потом правил.
Ты эксперт по безопасности веб-приложений. Проведи аудит этого проекта перед публичным запуском. Ничего не меняй, пока я не утвержу план. Контекст: [что делает приложение], хостинг [Vercel/Netlify/Cloudflare], база [Supabase/Firebase], хранит [какие данные пользователей], платные API: [OpenAI/Anthropic/Stripe/другие]. Проверь по пунктам и по каждому дай вердикт ОК / ДЫРА / НЕ УВЕРЕН с путём к файлу и строкой: 1. Секреты: есть ли ключи API, токены, пароли прямо в коде, в истории git, в клиентском бандле. Есть ли .env в .gitignore. 2. Фронтенд: какие расчёты цен, скидок, ролей и вызовы платных API выполняются в браузере. 3. База: включён ли RLS на каждой таблице, есть ли политики, не разрешают ли они доступ всем авторизованным. 4. Права: где проверяется уровень доступа перед защищёнными действиями, может ли пользователь сам сменить свою роль. 5. Ввод: валидация полей на сервере, вывод пользовательского текста без экранирования, лишние поля в ответах API. 6. Файлы: ограничение типов на сервере, проверка сигнатуры файла. 7. Злоупотребления: ограничение частоты запросов на платные функции, капча на входе и регистрации, защита от перебора паролей, сообщения, раскрывающие существование аккаунта. 8. Зависимости: список пакетов с объяснением, зачем каждый нужен. Отметь незнакомые и подозрительные названия. В конце дай топ-5 дыр по опасности (деньги, утечка данных, захват приложения) и пошаговый план исправления. Не придумывай уязвимости, если не уверен, пиши НЕ УВЕРЕН и что нужно проверить руками.
Агенту стоит помочь внешними сканерами. Semgrep бесплатен, содержит больше 2000 открытых правил и поддерживает 30+ языков. Snyk Code даёт 100 бесплатных сканирований в месяц. GitHub CodeQL встроен в GitHub. Запусти любой из них и скорми отчёт агенту со словами «исправь найденное, каждую правку объясни».
Аудит нейросетью проверяет нейросеть, которая писала этот же код. Она пропускает те же вещи, что пропустила при написании. Поэтому сканер плюс ручные проверки из этой статьи обязательны, промпт их только дополняет. Как проверять результат агента без умения читать код, мы разбирали в гайде про проверку кода от нейросети.
Что делать, если приложение уже атакуют
Увидел в дашборде OpenAI или Anthropic расходы, которых не было? Действуй в три волны.
Остановить сразу
- войди в кабинет каждого затронутого сервиса
- открой раздел API keys
- удали или перевыпусти скомпрометированный ключ
- предупреди пользователей, что функция временно не работает
Починить в тот же день
- расскажи агенту, что произошло и где была дыра
- попроси закрыть найденные пробелы
- создай новый ключ и впиши его в .env
- протестируй, задеплой, обнови переменные на хостинге
Следить дальше
- регулярно смотри дашборд расходов на аномалии
- поставь оповещения о бюджете и жёсткий лимит
- если утекли персональные данные, уведоми Роскомнадзор в течение 24 часов
Порядок важен. Пока ключ жив, каждая минута стоит денег, поэтому сначала отзыв ключа, а разбор причин потом.
Сводная таблица: 7 проверок за вечер
| Проверка | Что сделать | Сколько времени | Что будет, если пропустить |
|---|---|---|---|
| 1. Ключи | .env, .gitignore, переменные на хостинге, перевыпуск засвеченных | 20 минут | чужие запросы за твой счёт |
| 2. Лимит трат | жёсткий лимит в OpenAI, отдельный workspace с лимитом в Anthropic | 10 минут | счёт без потолка |
| 3. Сервер | платные API, цены и роли в облачных функциях | 1-2 часа | скидка 100% и цена в 1 рубль |
| 4. База | RLS и политики на каждой таблице, правила Firestore | 30-60 минут | вся база читается и удаляется |
| 5. Права | готовая авторизация, проверка роли на сервере | 30 минут | чужой в админке |
| 6. Ввод | валидация, текст без HTML, минимум полей, проверка файлов | 1 час | скрипты на страницах, лишние данные наружу |
| 7. Частота | rate limiting, Turnstile, лимит попыток входа | 30 минут | боты накручивают счёт через твой сервер |
Чек-лист: что у тебя есть после этой статьи
- Ни одного ключа в коде и в git, все секреты в .env и в переменных хостинга.
- Засвеченные ключи удалены и заменены новыми.
- Жёсткий лимит трат в OpenAI и отдельное пространство с лимитом в Claude Console.
- Автопополнение баланса выключено или осознанно оставлено.
- Платные запросы, цены и роли считаются на сервере.
- RLS включён на каждой таблице, у каждой есть политика по владельцу строки.
- Права проверяются на сервере перед каждым защищённым действием.
- Ввод валидируется, пользовательский текст выводится как текст, файлы проверяются по сигнатуре.
- На платных функциях стоит ограничение частоты, на входе капча и лимит попыток.
- Зависимости проверены руками, отчёт Semgrep или Snyk разобран с агентом.
- Промпт для аудита сохранён и прогоняется после каждой крупной доработки.
Гарантий полной безопасности эти проверки не дают, их не даст никто. Но они закрывают именно те дыры, через которые в 2026 году массово утекают данные и деньги из приложений, собранных нейросетями.
По материалам: Zapier, исследование RedAccess в публикации Wired от 7 мая 2026, документация OpenAI и Claude Platform.
Частые вопросы
Как проверить безопасность приложения, собранного через вайб-кодинг?
Пройди семь проверок: ключи API вынесены в .env и не попали в git, в OpenAI и Anthropic стоит жёсткий лимит трат, платные запросы идут через сервер, в базе включён RLS с политикой на каждую таблицу, права проверяются на сервере, пользовательский ввод фильтруется, а на формах стоит ограничение частоты запросов. Потом прогони код через Semgrep и промпт для аудита.
Что делать, если ключ OpenAI или Claude уже утёк в код или на GitHub?
Сразу зайди в кабинет сервиса, в раздел API keys, и удали скомпрометированный ключ. Удаление из кода не помогает, ключ остаётся в истории git и в копиях репозитория. Затем создай новый ключ, положи его в файл .env, добавь .env в .gitignore, пропиши ключ в переменных окружения хостинга и задеплой заново. Проверь дашборд расходов на чужие запросы.
Как поставить лимит трат в OpenAI API?
Открой platform.openai.com, зайди в настройки проекта, раздел Limits, нажми Edit spend limit и впиши месячную сумму. Обязательно включи Enforce a hard limit: без этого переключателя придёт только письмо, а списания продолжатся. После лимита запросы получают ошибку 429. OpenAI предупреждает, что блокировка срабатывает с задержкой и расход может чуть превысить порог.
Можно ли поставить лимит расходов на Claude API?
Да, в Claude Console через рабочие пространства. Создай отдельный workspace под приложение в Settings, Workspaces, выпусти ключ внутри него и на вкладке Spend limits задай месячный потолок и оповещения. На Default Workspace лимиты ставить нельзя, поэтому ключ из него ничем не ограничен, кроме лимита всей организации.
Опасно ли вайб-кодинг для приложения с персональными данными россиян?
Да, и риск тут юридический. С 30 мая 2025 года утечка данных от 1000 до 10 000 человек стоит гражданину 100-200 тысяч рублей штрафа, компании 3-5 миллионов. Об утечке нужно сообщить в Роскомнадзор в течение 24 часов. Если приложение собирает имена, телефоны или почты, RLS и серверные проверки обязательны до запуска.