logo search
Проектирование инт-прил / лекции / Проектирование инет приложений

Обфускация и динамическое получение скриптов

Говоря о скриптах на клиентской части WEB-приложения, нельзя не коснуться темы защиты авторских прав. Предположим, Вы разработали и реализовали некий алгоритм, имеющий научную ценность. Или Вам интересно было бы скрыть от клиента подробности реализации созданной Вами системы. Или просто нет желания давать кому угодно в Интернете возможность читать свои комментарии.

Скрипт, то есть последовательность строк текста программы, выполняется как есть, без предварительного процесса компиляции, прямо из текста и построчно. Иными словами, для выполнения скрипта на клиентской части мы должны передать клиенту весь текст выполняемой программы. К сожалению, избежать этого - нельзя. Но можно попытаться запутать клиента, значительно усложнить возможность понимания сути работы программы. Для этой цели существуют специальные программные средства - обфускаторы (obfuscate - делать неочевидным, запутанным, сбивать с толку). Обфускаторы:

Пример исходной программы:

int COUNT = 100;

float TAX_RATE = 0.2;

for (int i=0; i<COUNT; i++)

{

tax[i] = orig_price[i] * TAX_RATE;

price[i] = orig_price[i] + tax[i];

}

Текст той же самой программы после работы обфускатора:

for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}

Ту же самую цель, то есть сделать суть менее очевидной, преследует и другой подход к передаче скриптов на клиентскую часть. А именно: скрипт не существует в виде некоего файла на сервере и не включается непосредственно в текст передаваемой страницы. Вместо этого, скрипт создается динамически (обычно - через обфускатор) и запрашивается с клиента тоже динамически. Выше был приведен пример ассинхронной загрузки и выполнения скрипта через JQuery/AJAX. А вот еще один пример динамической загрузки: в документации фейсбука предлагается динамически создать на странице элемент "скрипт" и ассинхронно загрузить текст библиотек для работы с сервисом фейсбук:

// Load the SDK asynchronously

(function(d){

var js,

id = 'facebook-jssdk',

ref = d.getElementsByTagName('script')[0];

if (d.getElementById(id)) {return;}

js = d.createElement('script'); js.id = id; js.async = true;

js.src = "//connect.facebook.net/en_US/all.js";

ref.parentNode.insertBefore(js, ref);

}(document));

В данном примере текст реализованных на JavaScript функций all.js существует на сервере connect.facebook.net статически, постоянно. Но, вообще говоря, текст передаваемого на клиента скрипта может создаваться динамически, с учетом прав подключившегося клиента. И содержать только те функции, которые могут быть выполнены - данным конкретным авторизовавшимся пользователем. Большая часть существующих на сегодняшний день средств WEB-программирования (framework'ов) предоставляет разработчикам такие возможности.