# Що сканер безпеки знаходить у вашому JavaScript-бандлі

Патерни, схожі на секрети, sourceMappingURL назад до вашого вихідного коду, відбитки бібліотек і мітка «відкритий текст чи мініфікований». Що перевіряє автоматизований читач і що обфускована збірка змінює у звіті.

Source: https://www.afterpack.dev/uk/docs/use-cases/security-scanners

Сканер, звіт про пентест чи анкета безпеки від клієнта запитали, чи читабельний JavaScript, який ви публікуєте, і вам потрібна відповідь.

## Що насправді перевіряє автоматизований сканер

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

Ніщо з цього не вимагає розуміння вашої логіки. Збіг із патерном знаходить ключ незалежно від того, чи виконується колись код довкола нього. Source map перетворює сканування на повне читання вихідного коду за один запит. Людина, яка читає звіт, бачить мітку, і мітка «відкритий текст» або «мініфікований» каже їй, що вихідний код прямо тут.

## Що обфускована збірка змінює у звіті

Рядкові літерали за замовчуванням закодовано, тож тексту, який шукає перевірка на патерни секретів, у файлі немає. [`strings.leaks.max`](https://www.afterpack.dev/uk/docs/config#strings-leaks-max) зупиняє збірку з помилкою, коли читабельний літерал уцілів, і називає його через [`DIAG_SURVIVING_READABLE_LITERAL`](https://www.afterpack.dev/uk/docs/diagnostics). [Продакшн-збірка](https://www.afterpack.dev/uk/docs/config#build-mode) не записує ні файлу `.map`, ні коментаря `sourceMappingURL`, якщо ви не запитаєте їх через [`sourceMap.enabled`](https://www.afterpack.dev/uk/docs/config#sourceMap-enabled) і [`sourceMap.emitUrl`](https://www.afterpack.dev/uk/docs/config#sourceMap-emitUrl), тож немає мапи, за якою можна повернутися до вихідного коду.

Перевірка рівня захисту все одно позначить файл як обфускований, для цього вона й існує. Форму результату бачить кожен, хто на нього подивиться; перестають бути читабельними ваші імена й рядки, а на `light` числа лишаються читабельними.

## Релізна збірка, що відповідає на анкету

Релізна збірка, яка кодує свої рядки і не пускає мапу в результат:

```json
{
  "preset": "light",
  "strings": {
    "encode": true,
    "leaks": { "max": 0 }
  },
  "sourceMap": { "enabled": false }
}
```

[`sourceMap.enabled`](https://www.afterpack.dev/uk/docs/config#sourceMap-enabled) у продакшн-збірці вже вимкнено. Якщо задати його тут, відповідь буде однаковою на кожній машині, яка запускає збірку.

## Спершу проскануйте власне розгортання

Запустіть перевірки, які запускає сканер, на власному розгортанні, раніше за клієнта:

```bash
npx afterpack@latest audit https://your-site.example.com
```

[`afterpack audit`](https://www.afterpack.dev/uk/docs/audit) спершу шукає відкриті секрети та source map, потім рівень захисту, небезпечні патерни, виявлений стек і відомі CVE у тому, що може розпізнати за відбитками. Для конвеєра додайте [`--diagnostics.format=json`](https://www.afterpack.dev/uk/docs/config#diagnostics-format), щоб результат можна було розібрати, а не вишкрібати, і [`--diagnostics.level`](https://www.afterpack.dev/uk/docs/config#diagnostics-level), щоб обрати, скільки деталей повертається. Запускайте його на кожному середовищі, куди розгортаєте, зокрема на staging.

Залишайте [`protectionMap.enabled`](https://www.afterpack.dev/uk/docs/config#protectionMap-enabled) увімкненим локально. [Protection Map](https://www.afterpack.dev/uk/docs/protection-map) веде будь-яку знахідку аудиту назад до ділянки вихідного коду, з якої вона походить.

## Що не означає чисте сканування

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

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

## Далі

- [Аудит](https://www.afterpack.dev/uk/docs/audit): довідник команди і як читати результати.
- [Модель загроз](https://www.afterpack.dev/uk/docs/threat-model#the-boundary): межа між статичним читачем і тим, хто запускає ваш код.
- [Діагностика](https://www.afterpack.dev/uk/docs/diagnostics): кожен код, який можуть видати збірка чи аудит.
