Добрый вечер.
Хочу поделиться с вами историей о попытке создания системы защиты скриптов (JS и CSS) от копирования. Началось все с того, что однажды я решил написать универсальную систему, которая бы позволила разработчикам web-приложений не беспокоиться за ноу-хау, воплощенные в JavaScript или CSS-коде. Систему я написал, просидев пару недель в новогодние праздники перед компьютером, но получилось она как назло, ни сколько не универсальной (после ее размещения начали приходить сообщения, что система не работает под первым апачем) и глючной (если злоумышленник использовал Оперу или сидел за кэширующей проксей – он мог достать защищенный скрипт).
Принцип работы был предельно прост. В файл .htaccess была помещена одна строчка, которая перенаправляла запросы к файлам с расширениями .css, .js и .jpg к скрипту, который, собственно и определял, откуда пришел запрос на файл. Если переменная $_SERVER['HTTP_REFERER'] содержала имя хоста, где находится защищаемый сайт, то скрипт считал, что запрос пришел от браузера, и в зависимости от типа файла генерировал нужный заголовок и передавал контент файла вопрошающему. Но, если вдруг $_SERVER['HTTP_REFERER'] указывала на чужой сайт или, не дай Бог, вообще была !isset(), это могло означать лишь одно – скрипт пытаются либо получить по прямой ссылке с другого ресурса, либо, просто введя прямую ссылку в адресную строку. В таком случае выдавалось сообщение о доступе к защищенному файлу, а в случае с картинкой, подсовывалась заранее подготовленная, с тем же предупреждением, на случай, если кто-то разместит защищенное изображение по прямой ссылке на другом сайте.
Все было хорошо, пока не обнаружилось, что скрипты и стили можно вытащить из кэша браузера, дав им загрузиться при легальном посещении сайта, а затем по прямой ссылке получить код из кэша. В связи с этим я начал думать над альтернативными способами подзагрузки JS-скриптов и стилей к странице, и решение оказалось прямо под носом. Не знаю, как остальные, но фреймворк JQuery позволяет импортировать скрипты, минуя "", что избавит скрипт от попадания в кэш, а значит, используя систему распознавания по $_SERVER['HTTP_REFERER'], мы сможем защитить скрипт от копирования. Кстати, если $_SERVER['HTTP_REFERER'] покажет, что скрипт запрашивается браузером, можно применить какой-нибудь пакер, чтобы облегчить пользователям сайта жизнь и трафик (только надо быть осторожным с уже запакованными скриптами, могут возникнуть непредвиденные ошибки, как например, с анимационным фреймворком jTweener, который никак не хочет проходить через пакер второй раз). Кстати, можно избавиться от jQuery и воспользоваться встроенным в современные браузеры методом XMLHttpRequest, или вызвать через AсtiveXObject соответствующий метод для старых браузеров, что позволит сэкономить немного трафика на jQuery, но не позволит сделать следующее…
Все, кто когда-либо пользовался фреймворком jQuery знают, что доступ к HTML элементам на странице осуществляется посредством селекторов, которые практически идентичны оным в CSS-файлах, и имеется метод $().css, при помощи которого можно задавать нужному элементу стиль. Так вот, чтобы избавиться от привычного метода загрузки стилей через «<link …», можно написать простенький парсер, который будет загружать в синхронном режиме файл со стилями, и затем потрошить его и сопоставлять объектам на странице соответствующий стиль. Но это, конечно, сродни извращению, ибо метод имеет много минусов, один из которых, кстати, результат паранойи – невозможность кэширования. Файл со стилем будет загружаться каждое посещение страниц сайта. То же самое будет и с JS-скриптами, но здесь есть одно НО: подобную систему можно использовать, если скрипты содержат уникальные алгоритмы, и имеют небольшой объем, но для ширпотреба, который тоннами разбросан по девелоперским сайтам, такой чести можно и не оказывать.
Здесь были приведены лишь некоторые принципы системы защиты скриптов, если кому-то будет интересно, на их основе он сможет попробовать написать собственную систему. Ясно одно – такая система может и должна быть создана.
Хочу поделиться с вами историей о попытке создания системы защиты скриптов (JS и CSS) от копирования. Началось все с того, что однажды я решил написать универсальную систему, которая бы позволила разработчикам web-приложений не беспокоиться за ноу-хау, воплощенные в JavaScript или CSS-коде. Систему я написал, просидев пару недель в новогодние праздники перед компьютером, но получилось она как назло, ни сколько не универсальной (после ее размещения начали приходить сообщения, что система не работает под первым апачем) и глючной (если злоумышленник использовал Оперу или сидел за кэширующей проксей – он мог достать защищенный скрипт).
Принцип работы был предельно прост. В файл .htaccess была помещена одна строчка, которая перенаправляла запросы к файлам с расширениями .css, .js и .jpg к скрипту, который, собственно и определял, откуда пришел запрос на файл. Если переменная $_SERVER['HTTP_REFERER'] содержала имя хоста, где находится защищаемый сайт, то скрипт считал, что запрос пришел от браузера, и в зависимости от типа файла генерировал нужный заголовок и передавал контент файла вопрошающему. Но, если вдруг $_SERVER['HTTP_REFERER'] указывала на чужой сайт или, не дай Бог, вообще была !isset(), это могло означать лишь одно – скрипт пытаются либо получить по прямой ссылке с другого ресурса, либо, просто введя прямую ссылку в адресную строку. В таком случае выдавалось сообщение о доступе к защищенному файлу, а в случае с картинкой, подсовывалась заранее подготовленная, с тем же предупреждением, на случай, если кто-то разместит защищенное изображение по прямой ссылке на другом сайте.
Все было хорошо, пока не обнаружилось, что скрипты и стили можно вытащить из кэша браузера, дав им загрузиться при легальном посещении сайта, а затем по прямой ссылке получить код из кэша. В связи с этим я начал думать над альтернативными способами подзагрузки JS-скриптов и стилей к странице, и решение оказалось прямо под носом. Не знаю, как остальные, но фреймворк JQuery позволяет импортировать скрипты, минуя "", что избавит скрипт от попадания в кэш, а значит, используя систему распознавания по $_SERVER['HTTP_REFERER'], мы сможем защитить скрипт от копирования. Кстати, если $_SERVER['HTTP_REFERER'] покажет, что скрипт запрашивается браузером, можно применить какой-нибудь пакер, чтобы облегчить пользователям сайта жизнь и трафик (только надо быть осторожным с уже запакованными скриптами, могут возникнуть непредвиденные ошибки, как например, с анимационным фреймворком jTweener, который никак не хочет проходить через пакер второй раз). Кстати, можно избавиться от jQuery и воспользоваться встроенным в современные браузеры методом XMLHttpRequest, или вызвать через AсtiveXObject соответствующий метод для старых браузеров, что позволит сэкономить немного трафика на jQuery, но не позволит сделать следующее…
Все, кто когда-либо пользовался фреймворком jQuery знают, что доступ к HTML элементам на странице осуществляется посредством селекторов, которые практически идентичны оным в CSS-файлах, и имеется метод $().css, при помощи которого можно задавать нужному элементу стиль. Так вот, чтобы избавиться от привычного метода загрузки стилей через «<link …», можно написать простенький парсер, который будет загружать в синхронном режиме файл со стилями, и затем потрошить его и сопоставлять объектам на странице соответствующий стиль. Но это, конечно, сродни извращению, ибо метод имеет много минусов, один из которых, кстати, результат паранойи – невозможность кэширования. Файл со стилем будет загружаться каждое посещение страниц сайта. То же самое будет и с JS-скриптами, но здесь есть одно НО: подобную систему можно использовать, если скрипты содержат уникальные алгоритмы, и имеют небольшой объем, но для ширпотреба, который тоннами разбросан по девелоперским сайтам, такой чести можно и не оказывать.
Здесь были приведены лишь некоторые принципы системы защиты скриптов, если кому-то будет интересно, на их основе он сможет попробовать написать собственную систему. Ясно одно – такая система может и должна быть создана.