Забыли пароль?
Запросите новый здесь.

Автор темы: yury
ID темы: 17
Информация:
Тема содержит 7 сообщения, была просмотрена 2569 раз.
Просмотр темы
PHP-Fusion Russia » Веб-разработка » PHP
 Распечатать тему
Защита PHP скриптов от копирования — это возможно?
yury
Бывает так, что вам неохота предоставлять исходные коды проектов, которые вы разрабатывали. Для этого можно использовать программы-обфускаторы, о которых недавно шла речь.

А бывает, что вам не так хочется закрыть исходный код, как защитить скрипт от копирования. На мой взгляд, сокрытие исходного кода, в большинстве случаев, не имеет смысла без защиты от копирования. Некоторые обфускаторы, шифрующие код (а не просто коверкающие), имеют возможность лочить скрипт под определенный домен или айпишник. Но, во-первых, мы же не хотим для каждого домена перешифровывать все исходники? Во-вторых, мне удалось разлочить эту защиту одной строкой в начале скрипта:
$_SERVER['HTTP_HOST']='разрешенный домен';

Я долго искал в интернете решение для защиты от копирования. На форумах этот вопрос часто обсуждался, в основном, задавали его новички, а опытные (видимо) программисты отвечали "— Ты дурак, кому нужен твой код. Учи матчасть, да и вообще php-скрипты ничего не достойны!". Что ж, подумал я. Наверное, действительно нельзя. Но подождите, тот же Битрикс (фу) выдает лицензии на отдельные сайты, при этом вы получаете открытый исходный код после покупки лицензии. Что же мешает скопировать его на несколько своих сайтов? Я не знаю, а если вы знаете — скажите мне пожалуйста.

В итоге, делать защиту от копирования пришлось самому. Я поставил такие исходные условия задачи:
Скрипт, очевидно, должен быть зашифрован, например Зендом. Но мне понравился Lock It — во-первых, он не требует Зенд Оптимайзера, и, во-вторых — стоит недорого. Но сейчас речь не о том, как шифровать скрипт, а как защитить его от копирования. Поэтому идем дальше, просто будем считать, что исходный код закрыт. Очевидно, что это необходимое условие.

Я хочу выдавать ключ (я назову его лицензией) на каждый экземпляр скрипта. То есть я хочу каждому человеку отдавать только лицензию, а скрипт пусть валяется во всеобщем доступе.

Лицензию привязывать к домену, но если у домена есть синонимы — скрипт должен работать и при обращении через них. Главное, чтоб это был один и тот же экземпляр скрипта.

Никаких коннектов на другой (мой) сервер. Скрипт должен быть самодостаточным.

Никакого доверия скрипта к серверным переменным или переменным окружения во время проверки лицензии. Их можно легко переопределить.

Решение

1. Выдача лицензии и проверка действительности лицензии скриптом

Я создаю ключ к домену приблизительно таким образом:
$key = md5($domain.$secretword);

Cкрипт проверяет свою лицензию так:
$key == md5($domain.$secretword);

Действительно, некрасиво хранить $secretword в самих скриптах. Поэтому здесь можно использовать шифрование с открытым ключом. При выдаче лицензии я буду подписывать ее своим закрытым ключем, а скрипт, при проверке лицензии, открытым ключем будет проверять действительность лицензии. Но я не нашел в стандартном комплекте PHP никаких функций шифрования с открытым ключом, даже RSA (я слепой?). Если поможете — буду благодарен.

Итак, скрипт проверил правильность лицензии. То есть, подходит ли указанный ключ к указанному домену. Идем дальше.

2. Проверка домена

Как скрипт может проверить, лежит ли он на указанном домене? У нас нет доверия к $_SERVER['HTTP_HOST'].
Так же, по условиям — никаких коннектов на другой сервер. Значит, коннектимся сами к себе по предполагаемому домену, и проверяем мы ли там находимся ab

А точнее:

1) сохраняем случайное число на сервре (например, во временном файле)

2) обращаемся по адресу наш_домен.ру/наш_скрипт.php?action=скажи_число

3) проверяем, какое число нам отдают по этому адресу. Если оно соответсвует тому, что мы сохранили, значит, по адресу находимся мы ab

0) нулевым пунктом надо добавить отдачу сохраненного числа, если нас вызвали с параметром action=скажи_число

Я немного упростил алгоритм, на самом деле для каждого обращения к скрипту нужно отдельно учитывать эти случайные числа.

Теперь скрипт знает, что лицензия действительна, и что он лежит на соответствующем домене. Основная задача решена!

Вы скажите — wtf, скрипт при каждом обращении будет дергать сам себя? Действительно, жестоко как-то. Поэтому:

3. Временная лицензия

При первом обращении, если проверка прошла успешно, скрипт сохраняет во временном файле временную лицензию.
Временная лицензия представляет собой что-то ноподобие md5(сегодняшняя_дата, домен, секретное слово).
Теперь при каждом запросе мы проверяем только временную лицензию, которая действительна в течение дня. Как только со временной лицензией что-то неладное (поменяли, удалили, прошли сутки) — скрипт опять проверит всё серьезно и сохранит новую временную лицензию.

4. Выполнение скрипта на локальном компьютере без лицензии


Было бы идеально, если бы скрипт не требовал лицензии при запуске на локальном компьютере. Зачем, спрашивается, человеку требовать с меня лицензию, если он просто хочет протестировать скрипт на своем компьютере? Он должен скачать его, и пользоваться. А вот когда он поставит скрипт на сервер, тогда и прийдет ко мне.

Я не знаю как решить эту задачу. У меня пока есть 3 варианта решения, но они мне не нравятся:
1) Если скрипт лежит на домене без точек (типа http://myscript/) — считать, что это виртуальный домен, значит, скорее всего, это локальное тестирование. Недостаток этого метода — умельцы создадут виртуальный домен на своем сервере, а настоящий домен сделают синонимом. Так же, непонятно что делать с доменом localhost.

2) Проверка $_SERVER["REMOTE_ADDR"]. Проверяем наличие '127' в начале ip-адреса. Недостаток — можно переопределить эту переменную перед выполнением скрипта.

3) Смешно, но можно проверить операционную систему сервера. И разрешить выполнение под Windows. Только не бейте меня, это всего лишь вариант.


Источник: хабрахабра

А сам искал варианты защиты некоторых скриптов...
 
SchreiBear
А зачем это собственно нужно? не давай свои скрипты не кому и всё. в чём проблема? зачем всё усложнять. если уж на то пошло давайте будем php файлы компилировать как exe файлы или ещё что. Да даже если вы их и каким то образом попытаетесь скрыть от посторонниго глаза всё равно ведь крякнут... еще нет таких вещей которые бы один написал а другой не смог бы прочесть. возьмите пример с что твориться с компилированными exe фалами как бы вы не хотели скрыть исходный код всё равно кому надо тот его прочтёт. так что считаю задумку простой тратой времени.
Изменил(а) SchreiBear, 22.05.2013 09:12
 
Polarfox
Давайте не путаем исполняемый код и скрипты может?
Вещи разные.

А вот идея - конечно просто так не скрыть, только сторонняя хрень типа зендов, что должно по идее поднять скорость тк байт-код уже готовый.
А значит нужно на сервер эту муру ставить, что минус.
И закрытый код сложней потом править без исходников, а так исходники всегда есть.
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле.
Ежели кто забанен за спам, но не считает себя ботом: можете сообщить мне об этом, все будет хорошо.

PolarLab - вход для подопытных
 
Web
Rush
бесплатных можно сказать и нет

шифраторы делятся на два типа: которые требуют установки дополнительных пакетов на сервер (zend encoder) и которые не требуют (ioncube). собственно качественные решения стоят хороших денег, и сомневаюсь что их покупка оправдана. а остальные по большому счету ломаются не так уж и трудно.
Изменил(а) Rush, 22.05.2013 09:57
x1
 
Web
SchreiBear
По мне что исходный код программы что скрипты..разницы особо не вижу. проложенная дорога мастером. один хрен что тот что другой ПРОГРАММИСТ. а шифроваться нахожу для себя тратой времени.

и ещё думаю что у автора статьи одна цель написать какой нибудь скрипт спрятать его от глаз посторонних и как можно дольше на этом рубить капусту. оно и понятно каждый хочет за свою работу получить вознаграждение. цель сего Заработать на своих знаниях деньги.
ну это моё личное мнение можете не согласиться
 
util
Заработать на скрипте? На мороженное, наверное.. ab
Счастлив не тот, кто получает подарок, а тот, кто подарок делает.
 
Web
SchreiBear
util, ну тогда какой резон прятать коды если им грош цена..
 

Поделиться этой темой
Социальные закладки: Vkontakte Odnoklassniki Mail.ru Facebook Google Tweet This
URL:
BBcode:
HTML:

Перейти на форум:
Похожие темы
Топ 5 пользователей форума
Alex Alex (1,171)   Zaxap Zaxap (1,078)   Vova Vova (877)   Pisatel Pisatel (678)   util util (666)