Сканер, звіт про пентест чи анкета безпеки від клієнта запитали, чи читабельний JavaScript, який ви публікуєте, і вам потрібна відповідь.
Що насправді перевіряє автоматизований сканер
Сканер не читає ваш код так, як людина. Він запускає фіксований набір перевірок над будь-яким текстом, який може витягти з відповіді: зіставляє ваші рядкові літерали з патернами, схожими на секрети, переходить за коментарем sourceMappingURL назад до вашого оригінального вихідного коду, якщо такий коментар є, визначає за відбитками версії бібліотек, які ви забандлили, і позначає файл як відкритий текст або мініфікований.
Ніщо з цього не вимагає розуміння вашої логіки. Збіг із патерном знаходить ключ незалежно від того, чи виконується колись код довкола нього. Source map перетворює сканування на повне читання вихідного коду за один запит. Людина, яка читає звіт, бачить мітку, і мітка «відкритий текст» або «мініфікований» каже їй, що вихідний код прямо тут.
Що обфускована збірка змінює у звіті
Літерали за замовчуванням закодовано, тож тексту, який шукає перевірка на патерни секретів, у файлі немає. strings.leaks.max зупиняє збірку з помилкою, коли читабельний літерал уцілів, і називає його через DIAG_SURVIVING_READABLE_LITERAL. Продакшн-збірка не записує ні файлу .map, ні коментаря sourceMappingURL, якщо ви не запитаєте їх через sourceMap.enabled і sourceMap.emitUrl, тож немає мапи, за якою можна повернутися до вихідного коду.
Перевірка рівня захисту все одно позначить файл як обфускований, для цього вона й існує. Форму результату бачить кожен, хто на нього подивиться; перестають бути читабельними саме ваша логіка і ваші рядки.
Релізна збірка, що відповідає на анкету
Релізна збірка, яка кодує свої рядки і не пускає мапу в результат:
{
"preset": "hard",
"strings": {
"encode": true,
"leaks": { "max": 0 }
},
"sourceMap": { "enabled": false }
}sourceMap.enabled у продакшн-збірці вже вимкнено. Якщо задати його тут, відповідь буде однаковою на кожній машині, яка запускає збірку.
Спершу проскануйте власне розгортання
Запустіть перевірки, які запускає сканер, на власному розгортанні, раніше за клієнта:
$ npx afterpack@latest audit https://your-site.example.comafterpack audit спершу шукає відкриті секрети та source map, потім рівень захисту, небезпечні патерни, виявлений стек і відомі CVE у тому, що може розпізнати за відбитками. Для конвеєра додайте --diagnostics.format=json, щоб результат можна було розібрати, а не вишкрібати, і --diagnostics.level, щоб обрати, скільки деталей повертається. Запускайте його на кожному середовищі, куди розгортаєте, зокрема на staging.
Залишайте protectionMap.enabled увімкненим локально. Protection Map веде будь-яку знахідку аудиту назад до ділянки вихідного коду, з якої вона походить.
Що не означає чисте сканування
Аудит власного сайту показує, що будь-який читач уже може з нього витягти, а збірка із закодованими літералами і без опублікованої мапи містить набагато менше читабельного тексту, ніж вихідний код, з якого її зібрано.
Обфускація не виправляє того, що знайшло сканування. Вразлива залежність, помилка ін'єкції або облікові дані, які вже вийшли назовні, залишаються активними в запущеному застосунку і після збірки, тож виправляйте їх у вихідному коді й замініть облікові дані.
Далі
- Аудит: довідник команди і як читати результати.
- Модель загроз: межа між статичним читачем і тим, хто запускає ваш код.
- Діагностика: кожен код, який можуть видати збірка чи аудит.