Обфускация Javascript на ходу на PHP

Пользователи подключают мой скрипт вида <script src="//domain.com/user-uuid/script.js"></script> на свой сайт. PHP по шаблону генерирует на ходу скрипт для них (в зависимости от настроек и множества других условий).

На днях встала тема защиты скрипта, скрипт платный и стоит денег, вся логика находится на front-end, скопировать не составляет трудности. До недавних пор полагался лишь на секрет неуловимого Джо.

Какие варианты у меня:

  • CLI-утилиты типа javascript-obfuscator.
    Плюс: очень качественная обфускация, с множеством защит от деобфускации.
    Минус: сравнительно медленный и не работает на простом shared-хостинге

  • Простое шифрование кода каким-то алгоритмом и исполнение через eval.
    Плюс: скорость такая, как нужно.
    Минус: очнь легко обойти - если заменить eval на console.log, недоброжелатель тут же получит расшифрованый код.


Ответы (1 шт):

Автор решения: Давид Манжула

Итак, у меня была довольно специфическая структура проекта, JS-код генерировался на ходу с помощью PHP. Нужно было обфусцировать код, но оставить возможность добавлять некоторые данные на ходу на PHP.

Сейчас расскажу как я решил эту проблему.

TL;DR:
Я локально переобфусцирую код и кладу его в соседнюю папку после изменений.

Во-первых, я подключил Webpack. Части, которые раньше вставлялись на PHP теперь подключаются с помощью require. Так же это позитивно сказалось на структуре кода проекта.
Я подключил Webpack-плагин для известного обфускатора javascript-obfuscator.

"Динамичные" данные, которые должны вставлятся с помощью PHP, я вставляю в виде переменных типа __$$CONFIG$$__ и __$$IS_DEV$$__, которые с помощью PHP заменялись на ходу на JSON-массив или код. Таким же образом заменялись некоторые данные в строковых литералах. Эти строки и идентификаторы я добавил в список исключений, чтоб обфускатор их не переименовал.

После изменений я делаю npm build и потом делаю коммит, в котором в одной папке изменения в исходниках, а в другой - в обфусцированной сборке. А потом cron-скрипт подтягивает обновление из GitHub на хостинг.

→ Ссылка