Урок 7 из 8 · 20 мин · обновлено

Безопасность и проверка: что нельзя доверять нейросети

Почему ключи и пароли нельзя класть в код страницы, когда приложение начинает работать с персональными данными, какую типичную уязвимость оставляет нейросеть и как проверить код перед тем, как показать его людям.

Код страницы видят все

У приложения из одного HTML-файла нет секретов. Откройте любую страницу в браузере и нажмите Ctrl + U — увидите её код целиком. То же может сделать любой посетитель вашего трекера.

Отсюда главное правило: в коде страницы нельзя хранить ничего секретного. Ни паролей, ни ключей доступа к сервисам.

Типичная ситуация: вы просите добавить в трекер погоду или перевод, нейросеть подключает внешний сервис и вставляет в код ваш личный ключ доступа. Работает. Но ключ теперь виден всем — и кто угодно может пользоваться сервисом за ваш счёт или исчерпать ваш лимит.

Если для функции нужен секретный ключ, значит, нужен сервер, который хранит ключ и сам обращается к сервису. Это уже не проект из одного файла: такую часть лучше поручить программисту.

Чужие данные — чужая ответственность

Пока трекер хранит только ваши привычки в вашем браузере, вы ни за что не отвечаете. Всё меняется, когда приложение начинает собирать данные других людей: имена, телефоны, почты, ответы анкет.

Это персональные данные, и их сбор в России регулирует закон 152-ФЗ. Нужны согласие человека, политика обработки данных и меры защиты. А хранить такие данные в браузере посетителя бессмысленно — их нужно отправлять на сервер, и это снова выход за рамки проекта новичка.

Поэтому простое правило для вайбкодинга: не собирайте чужие данные, пока рядом нет того, кто отвечает за их защиту.

Типичная уязвимость: текст, который становится кодом

Нейросети часто выводят текст на страницу так:

JavaScript
row.innerHTML = '<span>' + habit.name + '</span>';

Выглядит невинно и работает. Но innerHTML разбирает текст как разметку. Если ввести вместо названия привычки кусок кода, браузер его выполнит. В личном трекере вы атакуете сами себя, но стоит данным оказаться у других людей — в общем списке, отзывах, гостевой книге — и чужой код выполнится уже у них. Эта уязвимость называется межсайтовым скриптингом (XSS) и входит в число самых распространённых.

Безопасный вариант выводит текст как текст:

JavaScript
const name = document.createElement('span');
name.textContent = habit.name;

textContent никогда не превращает текст в код. Проверить свой трекер просто: добавьте привычку с названием <b>Бег</b>. Если на карточке видны угловые скобки — всё в порядке. Если «Бег» стал жирным — вывод идёт через innerHTML, и это стоит исправить.

Подключения со стороны

Иногда нейросеть добавляет строку вроде <script src="https://…"> — загрузку чужой библиотеки из интернета. Такой код выполняется на вашей странице с теми же правами, что и ваш. Для небольших проектов просите обходиться без внешних библиотек — мы так и сделали в ограничениях задания. Если без библиотеки никак, узнайте, что это за источник, и не берите случайные адреса.

Чек-лист перед публикацией

Перед тем как показать проект другим, пройдите пять вопросов:

  1. Секреты. В коде нет паролей, ключей и токенов.
  2. Данные. Приложение не собирает чужие персональные данные — или вы знаете, как их защитить по закону.
  3. Вывод текста. Всё, что вводит пользователь, выводится как текст: проверено вводом <b>Бег</b>.
  4. Подключения. Нет загрузок кода со случайных адресов.
  5. Сценарии. Таблица проверок из урока 6 пройдена полностью.

Нейросеть может помочь и здесь: «Проверь этот код по пунктам: секреты в коде, сбор персональных данных, вывод пользовательского текста через innerHTML, подключение внешних скриптов. Для каждого пункта — есть ли проблема и где». Но её ответ — подсказка, а не гарантия: пропустить проблему она может так же, как пропустила её, когда писала код.

Попробуйте сами. Пройдите чек-лист для своего трекера. Обязательно проверьте вывод текста: добавьте привычку <b>Бег</b>. Затем попросите нейросеть проверить код по тем же пунктам и сравните её выводы со своими.

Что должно получиться

Для трекера из урока 6:

  1. Секреты — нет: трекер ни к каким сервисам не обращается.
  2. Данные — только ваши, в вашем браузере.
  3. Вывод текста — на карточке видно <b>Бег</b> с угловыми скобками: название выводится через textContent.
  4. Подключения — нет: всё в одном файле.
  5. Сценарии — пройдены в прошлом уроке.

Если на шаге 3 «Бег» стал жирным, напишите: «Название привычки выводится через innerHTML. Замени на textContent, чтобы пользовательский текст не мог стать кодом. Остальное не меняй». Удалите тестовую привычку — например, очистив хранилище, как в уроке 5.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Нейросеть подключила к трекеру сервис погоды и вставила в код ваш секретный ключ. Чем это опасно?

  2. Чем опасен вывод названия привычки через innerHTML?

  3. Вы хотите добавить на сайт форму «Оставьте телефон, мы перезвоним». Что меняется?

  4. Нейросеть проверила код и написала, что уязвимостей нет. Достаточно ли этого?