# Хук secrets: виявлення жорстко закодованих секретів

> Перевірте кодову базу на жорстко закодовані облікові дані просто з командного рядка.

Канонічна URL-адреса: https://lagune.ai/uk-UA/docs/hooks/secrets
Мова: uk-UA
Оригінал: https://lagune.ai/docs/hooks/secrets
Останнє оновлення: 2026-11-03

Хук `secrets` позначає **облікові дані, вкомпільовані у вихідний код**, замість того щоб читатися з оточення. Він орієнтується на **походження** (літерал проти звернення до змінної оточення), а не на вміст значення, тож не потребує вичерпного каталогу префіксів провайдерів і майже не дає хибних спрацьовувань. Це детермінований рушій [спеціалізації `secrets`](https://lagune.ai/uk-UA/docs/catalog).

Сигнатури форматів провайдерів, облікові дані в рядках підключення й літерал, прив'язаний до ідентифікатора з назвою секрету, **не залежать від мови**: той самий рядок читається однаково в будь-якому файлі. Дві евристики, що залежать від синтаксису, тобто звернення до змінної оточення з жорстко закодованим значенням за замовчуванням і секрет, що потрапляє в sink журналу, **враховують мову**, тож `console.log` з JavaScript ніколи не шукається у файлі Rust, а `os.getenv("X", "default")` з Python розпізнається окремо.

## Запуск

```bash
npx lagune read secrets                  # scans the whole project
npx lagune read secrets --dir src        # scans a directory
npx lagune read secrets --file config.ts # scans a single file
```

Перевірка виводить до двох розділів. **Hardcoded secrets found** є набором знахідок (жорстко закодоване значення за замовчуванням для змінної оточення з назвою секрету, облікові дані, вбудовані в рядок підключення, або значення, що відповідає перевіреному формату провайдера), тож хук завершується з ненульовим кодом. **Secret handling to review manually** є набором зачіпок: звичайний літерал, прив'язаний до ідентифікатора з назвою секрету (його походження можна визначити, а от чи є значення справжнім секретом, ні), і значення з назвою секрету, що потрапляє в sink журналу чи відповіді. Чистий запуск виводить `no hardcoded secrets found`.

### Параметри CLI

| Параметр | Значення | Опис                                                                   |
| -------- | -------- | ---------------------------------------------------------------------- |
| `--dir`  | каталог  | Обмежити перевірку каталогом. Повторюється й поєднується з `--file`.   |
| `--file` | файл     | Обмежити перевірку одним файлом. Повторюється й поєднується з `--dir`. |

Без параметрів хук перевіряє весь проєкт.

### Охоплення мов

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

| Сигнал                             | Мови                                                                            |
| ---------------------------------- | ------------------------------------------------------------------------------- |
| Значення оточення за замовчуванням | JavaScript/TypeScript, Python, Ruby, PHP, Kotlin, Java, Go (`cmp.Or`), Rust, C# |
| Sink журналу чи відповіді          | JavaScript/TypeScript, Python, Ruby, PHP, Java, Kotlin, Go, Rust, C, C++, C#    |

**Чи це проблема з політикою використання?**

Ні. Розпізнавання формату секрету, щоб попередити, що його закомічено, є стандартним оборонним інструментом, тією самою операцією, яку виконують gitleaks, trufflehog і push protection від GitHub. Хук постачає сигнатури виявлення (публічні **формати** токенів), а не справжні секрети, і перевіряє та пояснює, а не викрадає дані.

## Часті запитання

### Як хук secrets уникає хибних спрацьовувань?

Він орієнтується на походження, а не на вміст значення. Формати з високою достовірністю (токени провайдерів, значення оточення за замовчуванням, рядки підключення) є знахідками, що завершуються з ненульовим кодом. Звичайний літерал, прив'язаний до ідентифікатора з назвою секрету, є зачіпкою для перегляду, яку треба підтвердити, а той самий ідентифікатор, прочитаний із process.env, узагалі не позначається.
