Директиви обфускації за ділянками коду

Коментарі у вихідному коді, які змінюють захист AfterPack для коду, який вони позначають.

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

Як написати директиву

Директива — це блоковий коментар, який починається з @afterpack. Якщо вона стоїть окремо на своєму рядку, то діє на все аж до парного /* @afterpack end */. Якщо після неї на тому ж рядку йде код, вона діє на решту цього рядка.

/* @afterpack preset=hard */
function checkLicense(token) {
  return verifySignature(token, PUBLIC_KEY);
}
/* @afterpack end */

const apiKey = /* @afterpack preset=extreme */ "YOUR_SECRET";

Ключі — це імена з крапками зі сторінки Конфігурація, розділені пробілами: /* @afterpack preset=hard inflation.max=6 */. Булевий ключ без значення означає true. Директиви діють лише на код, який вони обгортають: не на функції, які з нього викликаються, і не на імпорти.

Що можна задати

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

Будь-який інший параметр у директиві ігнорується, і збірка повідомляє про це на рівні info. Невідомий ключ або некоректно записана директива — це помилка.

Коли її використовувати

  • Позначайте найважливіший код, наприклад перевірки ліцензії, логіку захисту від втручання або секрет, що потрапив у бандл, директивою preset=extreme. Решта програми залишається легшою та меншою.
  • Позначайте код, який має залишатися читабельним або швидким, наприклад гарячий цикл або сторонній фрагмент, директивою skip або нижчим preset.

Що позначати

АктивДирективаНавіщо
Перевірки ліцензії та прав доступуpreset=hardОдного пропатченого біта досить, щоб віддати ваше програмне забезпечення. Поєднуйте з transforms.comparisonHardening.enabled.
Валідатори платежівpreset=hardЗагрозою тут є втручання в код, а не лише його читання.
Логіка проти читів і ботівpreset=hard або preset=extremeПідвищує вартість розробки читів і частоту, з якою її доводиться повторювати. У супротивника є час і мотив, тож поєднуйте з валідацією, де останнє слово за сервером.
Зашиті в код секрети, які не можна перенести на сервер/* @afterpack preset=extreme */ у тому ж рядку, перед літераломНайкраще прибрати їх повністю, але якісь завжди прослизають. preset=extreme робить відновлення дорогим, однак літерал усе ще присутній у результаті. Літерал, з яким ваш код порівнює значення, можна повністю прибрати з результату за допомогою transforms.comparisonHardening.enabled. Про секрет, який уже потрапив у реліз, читайте в розділі Якщо ви випадково випустили секрет.
Пропрієтарні алгоритми (ціноутворення, маршрутизація, обв'язка ML)/* @afterpack preset=extreme */ … /* @afterpack end */ навколо основної функціїЦе ваш найцінніший код. Максимальна цільова складність і увімкнений нижній поріг для констант.

Застосовуйте директиву в найменшій області, яка покриває актив. Позначення файлу на 500 рядків як preset=extreme роздуває весь бандл із незначною користю.

Як перевірити, що було застосовано

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

Збірки Free

Локальна збірка застосовує одну конфігурацію до всієї програми. Директива, яка посилює захист, зупиняє збірку з помилкою, що вимагає ключ Pro (DIAG_PRO_DIRECTIVE_REQUIRES_KEY): preset, вищий за пресет програми, ненульове значення complexity, вище за цільове значення програми або на програмі з light, inflation.max, вищий за бюджет програми, чи strings.encode=on, коли floor рядків програми вимкнено. Будь-яка інша директива ігнорується, і її ділянка отримує конфігурацію програми, зокрема skip, нижчий preset або complexity, нижчий inflation.max і маски трансформацій (transforms.only, transforms.deny, controlFlow.enabled=off). CLI не зчитує жодних директив на жодному з тарифів.