# API-ключ потрапив у ваш JavaScript-бандл

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

Source: https://www.afterpack.dev/uk/docs/use-cases/accidental-secrets

Облікові дані, токен чи внутрішній URL, які ніколи не мали залишати вашу кодову базу, потрапили в бандл, який ви розгорнули. Вам треба знати, що зараз у продакшні і що з цим робити.

## Опубліковані облікові дані знаходять сканери, а не люди

Облікові дані, що витекли, стають активним інцидентом із моменту, коли їх почали віддавати. Шлях до їх виявлення автоматизований: сканер секретів, скрейпер бандлів чи скрипт дослідника знаходить ключ відкритим текстом у JavaScript-файлі задовго до того, як людина сяде читати ваш код. Відлік часу розкриття почався з розгортання, хоч би що показували ваші панелі моніторингу.

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

## Дізнайтеся, що розкриває ваш живий сайт

Запустіть [`audit`](https://www.afterpack.dev/uk/docs/audit) на розгорнутому сайті, перш ніж щось змінювати:

```bash
npx afterpack@latest audit https://yoursite.com
```

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

## Що змінює для значення наступна збірка

[Пресет за замовчуванням](https://www.afterpack.dev/uk/docs/presets) кодує ваші рядкові літерали під час збірки, тож внутрішній ендпоїнт, назва прапорця та облікові дані перестають бути відкритим текстом у файлі, який ви віддаєте. `grep` нового артефакту за ключем або за текстом довкола нього їх не знаходить, і автоматизовані скрейпери, які виявляють більшість ключів, що витекли, нічого не отримують. Деякі літерали залишаються читабельними на будь-якому пресеті, і [Protection Map](https://www.afterpack.dev/uk/docs/protection-map) перелічує, які саме.

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

## Не пускайте source map і резервні копії в конвеєр

Перевірте, що ніщо у вашому конвеєрі не вмикає результати, які повертають ваш оригінальний вихідний код:

```json
{
  "sourceMap": { "enabled": false, "emitUrl": false, "sourcesContent": false },
  "build": { "backup": false },
  "protectionMap": { "enabled": true }
}
```

Source map зіставляє обфускований файл із вашим читабельним вихідним кодом, а [`sourceMap.sourcesContent`](https://www.afterpack.dev/uk/docs/config#sourceMap-sourcesContent) вбудовує цей вихідний код у саму мапу. У продакшні мапи за замовчуванням вимкнені, і конвеєр, який вмикає їх для відлагодження, є звичайним шляхом, яким мапа потрапляє на сервер; коли вам потрібні продакшн-трейси, [збирайте з мапою і тримайте її приватною](https://www.afterpack.dev/uk/docs/best-practices#debug-production-traces-without-publishing-the-map).

Копія [`build.backup`](https://www.afterpack.dev/uk/docs/config#build-backup) є вашим вихідним кодом без змін. CLI тримає її в `.afterpack/backups/` у корені проєкту, внесеному в gitignore, поза тим, що ви розгортаєте. Задайте `false`, коли плагін фреймворку записує копію поруч із результатом, а ваше розгортання публікує цей каталог цілком. [`protectionMap.enabled`](https://www.afterpack.dev/uk/docs/config#protectionMap-enabled) записує Protection Map у `.afterpack/` на машині збірки, і CLI відмовляється записувати її в шлях, який роздається сервером.

## Переконайтеся, що знахідки більше немає

Після заміни ключа та повторного розгортання знову запустіть аудит і переконайтеся, що попередньої знахідки більше немає. Додайте [`--diagnostics.format=json`](https://www.afterpack.dev/uk/docs/config#diagnostics-format), щоб читати результат у скрипті. Якщо збірка повідомляє [`DIAG_SURVIVING_READABLE_LITERAL`](https://www.afterpack.dev/uk/docs/diagnostics), у результаті ще є читабельний літерал, а [`strings.leaks.max`](https://www.afterpack.dev/uk/docs/config#strings-leaks-max) зупиняє збірку з помилкою, коли їх залишається більше, ніж задане вами число. Ця діагностика рахує літерали загалом і не каже, який із них є обліковими даними.

## Чого обфускація не може скасувати

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

## Далі

- [Аудит JavaScript живого сайту](https://www.afterpack.dev/uk/docs/audit): повний перелік перевірок і як читати звіт.
- [Найкращі практики](https://www.afterpack.dev/uk/docs/best-practices#if-you-shipped-a-secret-by-accident): кроки заміни ключа по порядку.
- [Збірки та CI](https://www.afterpack.dev/uk/docs/builds): як не допустити source map і резервних копій у жодне середовище.
