# Зупиніть обхід пейволу у вашому опублікованому JavaScript

Перевірка пейволу в бандлі — це іменована функція, яка повертає boolean, і змінити її результат можна патчем в один рядок. Що обфускація та сід для кожної збірки змінюють у тому, як її знайти і як зберегти патч робочим.

Source: https://www.afterpack.dev/uk/docs/use-cases/paywall-checks

Перевірку пейволу чи прав доступу, яка виконується в браузері, дорого знайти й дорого пропатчити лише тоді, коли ви про це подбали. Мініфікований результат не робить її ні тим, ні іншим.

## Чому перевірку пейволу можна обійти патчем в один рядок

У звичайному чи мініфікованому результаті перевірка пейволу зазвичай є іменованою функцією, яка повертає boolean. Будь-хто, хто читає бандл, може знайти її за словом у назві: `isSubscribed`, `hasAccess`, `checkEntitlement`. Після цього найдешевша атака — патч в один рядок, який змінює повернуте значення на протилежне.

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

## Як виглядає опублікований файл після збірки

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

Найважливіша властивість тут — поліморфізм між збірками. [Сід](https://www.afterpack.dev/uk/docs/config#seed) новий у кожній збірці, якщо ви його не закріпили, тож патч, написаний під один реліз, не збігається з наступним. Зловмисник, який з'ясував, де розташована перевірка, платить цю ціну знову щоразу, коли ви випускаєте реліз.

## Посильте захист перевірки

Пресет за замовчуванням уже перейменовує й кодує на низькому цільовому значенні [`complexity`](https://www.afterpack.dev/uk/docs/config#complexity). Підвищення всього бандла в рази збільшує час запуску сторінки ([ціна завантаження](https://www.afterpack.dev/uk/docs/presets#load-cost)), тож виміряйте свої сторінки, перш ніж випускати його:

```bash
npx afterpack@latest dist/ --preset=hard
```

Щоб підсилити лише функцію перевірки, не чіпаючи решту бандла, позначте її директивою:

```ts
/* @afterpack preset=hard */
function checkEntitlement(token: string): boolean {
  return validateSubscription(token);
}
/* @afterpack end */
```

[Директиви](https://www.afterpack.dev/uk/docs/directives) діють у збірках [Pro](https://www.afterpack.dev/uk/docs/tiers).

## Перевірте, що перевірку захищено

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

## Де закінчуються можливості клієнтської перевірки

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

## Далі

- [Директиви обфускації за ділянками коду](https://www.afterpack.dev/uk/docs/directives): повна граматика директив і що ще варто позначати.
- [Не дайте юзерскриптам і розширенням патчити ваш вебзастосунок](https://www.afterpack.dev/uk/docs/use-cases/patching-tools): що структурні зміни та новий сід роблять із патчем, який шукає текст.
- [Модель загроз](https://www.afterpack.dev/uk/docs/threat-model): що статичний читач може відновити, а що ні.
