Pull to refresh

Comments 213

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

Главная проблема в том, чему ты не стал уделять внимания - Encoder-е. Zend - хорошо, но стоит денег + необходим Zend Optimizier. Другие решения - тоже, "не фонтан". В общем, нет ничего подходящего и в этом вся проблема.
>Весь этот велосипед придумывается на ходу.
Тогда, может быть вы сможете дать мне подсказку по последнему пункту?
а почему не делать также как и в начале? пишем число случайное, а потом обращаемся на 127.0.0.1/нашскрипт?скажичисло
Дело в том что на 127.0.0.1 скорее всего окажется не наш сайт, а сайт хостера
а, извините, не правильно вас понял. Дайте подумать )
да, то что вы предложили действительно может помочь во многи случаях, но, кажется, не во всех. Беру на заметку
Нмм... То есть для взлома достаточно переопределить в PHP одну функцию? Не бог весть какая проблема...
А есть какой-то способ переопределисть стандартную функцию?
Есть, если расширение Runkit стоит (http://ru2.php.net/manual/ru/function.runkit-function-redefine.php). Модуль редкий, но можно самому пересобрать РНР и выложить как CGI, многие хостеры разрешают.
Если один умелец установит себе, думаю ничего страшного не случиться. Главное чтоб распространить скрипт не мог
если установит один, через очень короткое время весь интернет будет завален статьями как это сделать.
только если это мега-популярный скрипт…
но это ведь надо ещё такой умудриться написать!
хм, так что же теперь будете делать?
я вот с удовольствием прочитал статью и читаю сейчас комментарии, в надежде, что будет доработано универсальное безошибочное решение...
Как придумаете, напишите обязательно!
Я учту все комментарии, и постараюсь написать вторую версию топика с их учетом.
Безошибочным решением будет использования зенда :)
В каких целях Вы применяете эту защиту?

1. Для того, чтобы показать клиенту НУЖНО испоьзовать собственный сервер.
2. Код после обфускации и защиты лицензирования ни 1 нормальному клиенту НЕ нужен. Что они с ним будут делать?

Я что-то упустил?
Я не кодирую весь проект, я кодирую только один файл, в который никому лезть нет надобности, но без которого ничего работать не будет
Вообще топик не о моем скрипте, я просто попытался обсудить возможность защиты. Конкретно мне защита нужна только для того, чтобы человек, купивший у меня скрипт, не спрашивал "а зачем мне вам платить за вторую лицензию, если я могу скопировать скрипт". То что я продаю предназначено не для таких гуру как вы, а для тех, кто в состоянии просто скопировать файлы на FTP сервер. Ну а если кто-то сможет, и не поленится, разлочить скрипт - прекрасно, значит скрипт полезный, и пусть юзает на здоровье )
Просто без зенд оптимайзера вы вряд-ли защитите скрипт так, чтобы его не разкодили и не взламали вашу защиту.

Можете выслать Ваш закоденый файл (пример) мне на мыло, только сегодня (перед сном покопаюсь).

Кроме зенда есть ещё айскуб, но с него защита снимаеться за определённую сумму прямо у разработчиков)))

Вообще это бесполезно, вот возмут таких 3 покупателя вашего скрипта и скинуться по 10 баксов и им хакнут защиту, платить Вам уже никто не будет)))

P.S. anddriga at gmail dot com
Покупать будут, потому что он очень дешевый, и уважающий себя человек не будет искать нуленую версию. Таких людей, конечно, мало, но, с другой стороны, за счет нуленой версии возрастет популярность. Ну а как же живут всякие неткеты, битриксы, шопскрипты? Я понял что вы приверженец опенсорса, и я с удовольствием послушаю ваше мнение о том, как можно заработать на опенсорсе. Может быть вы меня убедите ) Кстати, этот скрипт - 5 лет моей жизни, и 12 часов каждый день )
Не прошу скрипт целяком, прошу лишь возможность хакнуть защиту :)

Уважающие себя люди пишут с 0 :)

P.S. Я не поклонник опенсоурса, я фрилансер. Так и зарабатываем. Но на свой код я не жаден... Просто разработки, которые шли для клиентов распространять нельзя по понятным причинам.
Я не имел в виду уважающих себя программистов, большиство моих клиентов - слабо разбираются в рнр, иначе им этот скрипт нафиг не нужен ). Тестовый файл лежит в примере к топику, а он же, в зашифрованном с помощью Lock It виде, лежит здесь: http://pikusov.kiev.ua/test.php.txt Правда один товарищ ниже в каментах расшифровал его уже, и посоветовал все-таки Зенд использовать.
Блин) я не успел :)

Правильно он посоветовал :)
Зенд элементарно расшифровывается. В сети есть даже инструменты от китайских умельцев. А также существуют платные сервисы.
Не знаете - не говорите бреда. Новые версии не расшифровываються
Я говорил и ещё раз повторяю: новые версии вам никто не расшифрует, никогда. Темболее за такую смешную цену.

Если зазендить в каком-то далёком прошлом, то да (в старых версиях были уязвимости).

Если вы не разбираетесь, но нечего вступать в дисскусию.
Там был trial раньше, без отправки на мыло. А вы бы пошли поспали, что ли, а то раздражительный какой-то.
Брр, давно в кругах программистов известно, что нормальный новый лицензионный зенд не декодиться -.-
Может, я, конечно, и ошибаюсь. И про трайал я с другим сайтом перепутал, извините.
Да нечего, у меня тоже день тяжёлый, извините за агресивность.

Действительно хорошо зазенденые скрипты не декодяться, точнее в теории эт возможно, но не на практике.

...

О, мне минус в карму кто-то кинул -.- Хабр интересная штука, минус в 10 раз проще получить, чем +
можно, поверьте мне. Многие из тех разработок, которые я впоследствии выкладываю в открытый доступ (в частности, то, что я постила на Хабре про MODx), изначально писались по чьему-то заказу, причём именно что с договорённостью, что потом разработка может стать открытой.
Я не заключаю таких договорённостей, а в крупных проектах заказчик относиться жадно к тому, за что платит.

Почему его конкуренты должны иметь доступ к тому, что он оплатил?
потому что корпоративному клиенту дешевле заплатить, чем нанимать того, кто будет чужой код расковыривать. А любитель-энтузиаст пускай ковыряется, с меня не убудет :)
Это неоспоримо, но корпоративный клиент не хочет чтобы вообще что-то кому-то доставалось :) Он сказал не давать - я не даю :)

Энтузиастам я лучше помогу и так, в случае его - код набросаю...

Вообще это бесполезно, вот возмут таких 3 покупателя вашего скрипта и скинуться по 10 баксов и им хакнут защиту, платить Вам уже никто не будет)))

Если скрипт полезен, то покупатели найдутся. На это можно даже жить. ;-)

А если делать правильно, то нужно по HTTP протоколу делать запрос с страницы в админке на Ваш сервер, который будет в ответ давать информацию о сроке действия лицензии. Файл, который отправляет запросы, нужно очень хорошо защитить.

Навскидку:
скрипт в админке передаёт методом POST данные сервер lic.site.com, в ответ получает массив (serialized) в котором указано на какой домен действует данная лицензия (или их список), до какой даты.

В список доменов с доступом автоматически включить локалхост.

В результате Ваш скрипт могут закинуть куда-угодно, но админить уже не смогут (фактически он стаёт бесполезным).
Для защиты от нуления можно при первом запуске админки отправлять Вам на сайт отчёт об исползовании.

Например:

Пользователь с IP ... произвёл установку скрипта ... версии ... по адресу ... .
Лицензионный ключ: ...
Данные о лицезние: ... (берём с базы лицензий)
Данные о покупателе: ... (берём с базы наших клиентов)

Заблокировать ключ \ Отрпавить предупреждение пользователю
И давайте вы проверять будете не домен, а айпишник сервера с которого скрипт обратился для верификации лицензионного ключа? А лицухи выдавать на айпишник, а не домен (домен можете дальше проверять, но строку с его адресом просто подменить).
В том то и дело, что при нулении все эти проверки вырезаются :)
А методы автора не вырезаються, да?

В том то и дело, что я сказал, что ЗЕНД нужен в любом случае
Ещё на заметку Вам про защиту. Мы не верим данным в $_SERVER?

if(getenv("HTTP_HOST") != $_SERVER['HTTP_HOST']) $_SERVER['HTTP_HOST'] = getenv("HTTP_HOST"); // По-моему это подменить тяжелее :)
?>


И напоследок почему проверка запросом самого себя не сработает. Допустим у меня есть сервер и я подменю строку на localhost. Если запрос идёт на локальный хост, значит сервер ответит В ЛЮБОМ СЛУЧАЕ, тк он обратился сам к себе. И не важно какие ещё доменные имена у него будут.
Какую строку вы подмените?
Я не подменю ничего, я в случае, если строку $_SERVER['HTTP_HOST'] какой-то злой мальчуган изменил на
$_SERVER['HTTP_HOST'] = "localhost"; // Хаха, у меня локальная лицензия

возвращаю в нормальный вид (ставлю туда правильные данные об адресе хоста, получаемые через функцию getenv)
Те адреса localhost/1.php и domain.com/1.php выдадут одни и те-же результаты для вашего скрипта.
я понял, но скрипт запрашивает тот домен что в лицензии, перед этим проверив лицензию
А давайте вы сделаете так, как я писал выше. Но проверять будете не домен, а айпишник сервера с которого скрипт обратился для верификации лицензионного ключа? А лицухи выдавать на айпишник, а не домен (домен можете дальше проверять, но строку с его адресом просто подменить)
>лицухи выдавать на айпишник
Это очень плохо. Как раз то что мне больше всего не подходит, так как один клиент обычно все сайты хостит на одном сервере, и у него все будет работать с одной лицензией
Я набросаю код-пример для Вас завтра, напишите мне в асю...
А если в /etс/hosts вписать лицензированный домен и назначить ему нужный (локальный) айпи?
Вы никак достоверно не защитите свой скрипт в враждебной среде. Советую перечитать мои посты выше, я описал что нужно давать лицензию на айпи, с которого идёт обращение.
getenv может подменить apache_setenv() (а не putenv, как ни странно), я проверил
Ну нам нужно, чтобы никто не знал, что у нас там есть getenv. Мало кому придёт в голову сделать что-то более, чем замена $_SERVER['HTTP_HOST']
Я об этом думал, но хотел "чистой" защиты. Но тут люди распотрошили всю защиту вдребезги, так что и это уже покатит )
О чистой писал выше, но зендом заенкодить нужно всё-равно :) Или вырежут всё :(
Что ж, завтра буду перечитывать все каменты, и делать выводы. Все-таки интересно, как другие коммерческие cms защищаются, особенно те, кто тоже продает лицензии на домен, при этом предоставляя открытый код )
Вообще говоря, согласно закону Керкхоффа алгоритм всегда известен злоумышленнику.
Если у меня есть лицензия на site1.ru, а работать все должно на site2.ru, то можно поизвращаться и поставить прокси site2.ru -> site1.ru
Если автор не мудила, то он изменит домен, на который распространяется лицензия.
Этот файл - защита авторизации или что-то в этом духе?
Если ты не собираешь продавать продукт каждые 20 минут, то можно сделать так. Ты забиваешь в ядро системы данные о владельце и выдаешь ему систему. Когда владелец устанавливает систему, та начианает сначала проверять кучу параметров, типа валидности хоста, IP и т.д., а потом шлет запрос на сервер, который отвечает, есть такая лицензия с таким номером или же нет. Но тут тоже свои минусы. Нужно сделать, чтобы переменные не смогли менять, а это пока что невозможно.
zend декодерится
не знаю как сейчас с этим обстоит дело
но декодинг скриптов зашифрованых старыми версиями, конечно не вернул работающий скрипт, но позволил увидеть метод "лицензирования"
Вам в Майкрософт надо идти работать. Им понравится ваш подход к делу :)

А по теме - в зазендованный файл можно напихать что угодно. Кстати, никто не мешает прописать какую нибудь штучку в php.ini - через auto_prepend_file скажем.
И что же вы предлагаете туда в зазенденый файл дописать, чтоб обойти защиту? Плиз, конструктивней, я этот топик создал не чтоб поумничать, а действительно жду совета.
Не обойти, а наоборот защитить. В зендованый файл дописать ничего нельзя вроде.
Зато как хорошо он инклудиться...
Хм...я шифрую только один файл, который может инклудится из других, так что дописать уж совсем не проблема. Пусть дописывают. Чем это поможет обойти защиту?
Насколько мне известно зенд уже декодируется достаточно хорошо
это не относится к новым версиям. а на счет старых версий - да, все декодируется. и это скорее всего политика самих зендовских маркетологов.
Кстати, топик о том как защититься от копирования, а не от изменения кода. Там, где я использую свой медод, большиство файлов как раз открыто, а зашифрованный файл даже включается из незашифрованного, так что дописать действительно можно что угодно.
автор незнает, каким ключом надо шифровать, а каким - расшифровывать, а все туда-же - в системы безопасности...
читайте - http://ru.wikipedia.org/wiki/Криптосистема_с_открытым_ключом
Вы видимо сами плохо читали, потому что как раз в данном случае я написал правильно. Открытый ключ идет в качестве цифровой подписи к лицензии, и ее расшифровка этим ключем дает гарантию того, что зашифрована она именно мои закрытым. То что вы написали используется - когда наоборот, неважно кто отправитель, важно чтоб сообщение пришло к нужному получателю.
вы лучше вместо шифрования напишите что лицензию подписываете своим закрытым ключем и проверяете действительность подписи открытым ключем, хранящимся в исходниках
Но ведь проверке с обращением к домену тоже нельзя доверять. это решение только для виртуального хостинга, если есть доступ к ос сервера ничего не стоит подменить домен.
Во-первых, я расчитываю на защиту от установки, по краиней мере, на самый обычный хостинг. Я понимаю что кому очень хочется - что-то придумает. Но я рассчитываю хотя бы на защиту от массового распространения. Конкретно по вашему комментарию - как именно вы видите обход?

Теоретически можно попробовать заставить сделать этот запрос к себе не сам скрипт, а клиента-браузера, который этот скрипт вызвал. Например при создании сессии пользователя перенаправить его на страницу, которая пошлет нужный нам запрос на лицензионный домен. А мы у себя проверим, пришел нам такой проверочный запрос или нет.
Я так понимаю, вы предлагаете установить лицензию на любой домен, а на сервер настроить таким образом, чтоб домен из лицензии был синонимом настоящего?
Если не хотите шифровать - можете придумывать гадости.
Например: админка - в ней 1px с вашего сервера грузится. Чтобы не нашли строки где этот 1px инициализируется, раскидайте его в закодированном виде в десяток функций, при этой сделайте так чтобы при части также носили действенный характер. Т.е. чтобы их нельзя было тупо, безболезненно вырезать.

Накидайте копирайтов, со ссылками на ваш сайт. Тяните лого с вашего сайта. Тяните новости обновлений в вашего сайта. Эти запросы помогут вам узнать кто работает по лицензии а кто нет.

Используйте нечто уникальное, чтобы пользователей вашего софта можно было найти в Google
(Битрикс имхо так и делает)

Используйте timebomb - например при достижении 100 новостей в бд - > защищенным методом, запрашивайте либо картинку с сервера, либо делайте пост запрос, либо отсылайте себе мейл.

Ну и самое главное - делайте софт качественным и удобным. Если его начали крысить - радуйтесь, значит оно того достойно. Пересмотрите свою политику лицензирования. Подумайте как вы можете использовать нелегалов в свою пользу.
>Используйте нечто уникальное, чтобы пользователей вашего софта можно было найти в Google (Битрикс имхо так и делает)
Что вы имеете в виду?

>Ну и самое главное - делайте софт качественным и удобным. Если его начали крысить - радуйтесь, значит оно того достойно.

В том то и дело, что я недавно обнаружил, что некоторые веб-студии выдают за свою разработку, не говоря уже о нелицензионном использовании всем кому не лень. Речь идет о cms для интернет-магазина
ну например в битриксе уникальные модели урлов, и еще сайты подписаны копирайтом "сделано на ..."
мониторить выдачу в гуглю по этим параметрам, труда не составит.
Значит, коннектимся сами к себе по предполагаемому домену, и проверяем мы ли там находимся


правим /etc/hosts подвешивая "разрешенный домен" на 127.0.0.1, его-же прописываем в конфигах в качестве алиаса.


З.Ы.: подумалось, что вам на помошь может прийти экстеншн под PHP который бы занимался вопросами обработки ключей и привязывался бы к железу сервера (номера винтов, процов, мамы и т.д. - их не подделать через серверные переменные)... хотя и вызовы его методов по идее можно вычистить из кода :")
>правим /etc/hosts
Я согласен с вами. Но мало у кого есть возможность это сделать, и плюс - это им не поможет распространять скрипты дальше, только использовать для себя. А это не так страшно. Один екземпляр моих скриптов не так ценен, но когда копируют их сотнями...
1. копируем файлы на новый хост
2. патчим /etc/hosts что бы он спрашивал сам себя.
3. проксируем запрос ключа на коррекнтый хост через mod_proxy

собственно, все :)
Все системы защиты php скриптов. не требующие установки софта на целевой сервер давно вскрыты. Даже Zend в своё время вскрывали - но они оперативно переписали систему.
кстати в нём есть все эти лицензии и прочее и прочее
Да, в нем есть лицензии, но дело в том что мои лицензии автоматически выдаются при их покупке онлайн, что очень удобно. Ну и цена зенда )
Ну, как я уже писал, пока ваша защита - неуловимый Джо, то да, всё в порядке.
Предложите сделать Zend(LockIt(PhpОбфускатор(скрипт)))
С локалхостом, может быть подумайте над таким (корявым достаточно, но все же) решением:

1. Если есть инсталлятор, то спрашиваем при установке, если нету - при первом запуске (при отсутствии файла-маркера из п.2 или временного лицензионного файла-ключа): "Тестовая установка?"

2. На этот банальнй вопрос получаем ответ "да" или "нет"; "да" - делаем файл-маркер, например md5('secret-word' + 'yyyy-mm-dd-hh') и выдаем вверху (или где еще) каждой страницы в противного цвета рамочке надпись "Тестовая установка. За лицензией милости просим на: http://..."

3. Если в п.1 был ответ "нет" или нет файла-маркера (решили ответить "да", а потом удалили файл) выполняем полные проверки на соотв. хоста лицензии (из вашего поста).

4. Каждый запуск проверяем есть ли файл-маркер из п.2 и, например, раз в 12 часов переписуем его содержимое, чтобы его не так просто можно было пробывать использовать на реал. сервере. И не забываем показывать надпись из п.2, если все еще локал-хост.
Не написал, что "залогом" будет как раз надпись о тестовости установки скрипта. Может на ядовитого цвета фоне или еще и мигающая ;-) — вряд ли ее станут терпеть на реальном сервере, только чтобы не платить. По крайней мере, думаю, 8 из 10 тех, кто решит попробывать не платить, а установить и сказать, что "тест" — не будут ее терпеть...
Временные лицензии как раз сейчас поддерживаются ) Я просто не допер, что временную лицензию может выдать сам установочный скрипт :) Да, конечно, лицензия стоит 49$, никто не будет париться из-за них. Хотя задача конечно касается не только моего продукта, но, думаю мало скриптов требуют бОльшей зщиты )
тем более что временные лицензии и так сейчас поддерживаются ) Я просто не допер, что временную лицензию может выдать сам установочный скрипт :)
Есть только проблема с тем, что скрипт потенциально могут многократно переставлять для продления лицензии.
Эту рамочку можно выцепить CSSом и display:none :-)
в PHP есть биндинги к OpenSSL, хотя я не знаю, стоит ли это расширение на популярных хостингах
В том то и дело, что мой скрипт расчитан на работу в любых условиях, он должен быть не требовательным. Кстати, я где-то нашел отдельный класс для RSA, но очень кривой ). Надо будет поискать еще что-то
Именно этот класс я и нашел, он кривой )
Для работы с openssl пхп должен быть собран соответствующим образом, а собирают его с поддерждой ссл далеко не все. Есть еще и классы(pear.php.net, phpclasses.org), которым openssl не нужен, но им нужна длинная арифметика, которая реализуется отдельными расширениями, которые в свою очередь опять же не всегда найдешь на хостингах
жалко конечно что вы не разрешаете в сеть лезть скрипту, так бы можно было бы придумать чего-нибуть. А ваша защита думаю обходится прописанием в днс пути на домен на кот. лицензия с перенаправленьем к себе на сайт.
Да, многие об этом тут сказали. Но мой скрипт должен работать и на локальном компьютере без интернета. А на счет прописания пути - как я выше говорил, это не поможет тиражировать его, а отдельные лица пусть уже юзают, раз такие умные. Точнее таким умным и скрипт то мой вовсе не нужен )
вот не знаю мож предлагали уже предлагаю проверку на соотв-е хоста делать на клиенте ч-з яваскрипта, в случае несоотвецтвия матюкаться, а фактом пробной инсталяции считать доступность админки без пароля ... вобщем както так.
слабо представляю как это..
ну например пихать в каждую сотую страничку яваскрипт код который проверяет лицензионность по соотв. скрытого поля выданного сервером и адресной строки, в случае неудачи показывает пользователю что это не лиценз (стучит на нерадивого товарища куданибуть)
А, я примерно понял. Просто у меня мухи - отдельно, котлеты - отдельно. В смысле, шаблончики Smarty используются, я не позволю себе выплевывать html/javascript прямо из php
ну или при тестовой устаноке как выше уже было сказано писать как-нибуть кислотно в шапке што нелиценз, для тестов думаю терпимо это
А если нет возможности коннектиться по TCP/IP?
curl недоступен, fopen-врапперы отключены, итд.
Получается, что на таком хосте ваш софт не запустится.. !true.
Да, но, к счастью, такое мало где встречается. Тут вот вообще кто-то предлагал к моему серверу коннектиться
А бесплатные варианты шифровщиков не сущесвуют?
я имею в виду не обфускаторы, а аналоги зенд энкодера
Есть PECL-расширения. Но они уже года как 3-4 не обновляются. Так что, делайте выводы...
UFO just landed and posted this here
UFO just landed and posted this here
а можно взглянуть на закриптованный код? чисто из спортивного интереса
А у вас эта штука компилится? У меня отдает
Parse error: syntax error, unexpected ',' in /home/username/www/1.php(2) : eval()'d code(1) : eval()'d code on line 1
отдельно этот файл - нет :) Я думал вы хотите просто визуально глянуть ) Я обновил, на этот раз зашифровал именно тот же скрипт, что в примере к топику. Скачайте с того же адреса http://pikusov.kiev.ua/test.php.txt
Да это не я просил, я просто мимо проходил, было интересно, как эта штука вручную расшифровывается... Оказалось что просто (10 минут).
Во втором файле есть что-то интересное или не тратить время? ;-)
А, точно, извините ) Нет, это две одинаковые ссылки, а Lock It похоже надо выбросить на свалку, спасибо ) А вы знаете какие-то нормальные енкодеры?
Угу, Zend Encoder (да, да, я читал пост).
Так, все же сейчас посмотрю что во втором файлике. :-)
Вот, блин, к чему ведет невнимательность. Пропустил фразу о том, что зашифрован тот же скрипт, что и в топике и увидел это лишь когда расшифровал его. :-)
А вообще от обфускаторов в пхп толку мало, если в итоге все не превращается в бинарник. Можно легко пройти от конца к началу и получить сорец.
Я это понимаю, сам даже не пытался расшифровывать. В данном топике обфускатор вообще не важен, но все же, вы сами не думали, есть ли какой-то способ зашифровать код безвозвратно? Я особо не задумывался, но по-моему это теоретически невозможно (при условии сохраниения синтаксиса).
Только при условии компиляции, например, в байт-код. Не знаю, реализовано ли это для PHP.
ну вот, меня опередили с расшифровкой =\
действительно замое оптимально зендом, но он тоже декодится, так что на php идеальной защиты на данный момент имхо не существует
можете уточнить. Т.е. у вас есть некий файл license.php и функция в нем bool licensed(). А все остальное вызывает эту функцию?
Конкретно в моем проекте есть только один зашифрованый файл (остальные открыты), в котором проверкиа идет просто прямым текстом, а не отдельной функцией.
собственно к чему я веду. а что мешает подменить этот файл?
этот файл - самый главный файл файл в проекте, ядро, так сказать ) Почему всего один? Потому что такой себе минималистичный движок магазина :) Все остальные файлы это модули, которые каждый под себя может переделывать как душе угодно
На эту тему у меня есть две истории.

История первая, познавательная. Думал я как-то на тему защиты собственных прав много-много лет назад. Хотелось мне многого, в частности, что бы можно было продавать ограниченные по времени лицензии на софт, причем без необходимости обращаться на каждом запросе к серверу сертификации. Не придумал ничего более путнего чем кроме как выписывать подписанные лицензии с использованием ассиметричного алгоритма шифрования, а код запрятать в байткод. Причем, в лицензии содержалась информация о том на каком хосте и в какой промежуток времени можно систему запускать. OpenSSL тогда на хостингах был большой редкостью (если вообще был, php был помнится версии около 4.0.0), так что ничтоже сумняшеся, реализовал алгоритмы (RSA 128 бит + RC4 или самописное гаммирование) на гольном php. До сих пор собой гордюсь, потому что проверка прав на запуск отъедала совсем немного времени проца :-) Впрочем, прожект тот был впоследствии благополучно заброшен. К счастью. Кроме экспириенса по криптотехнологиям ничего там интересного не было.

История вторая, поучительная. Однажды моя супруга написала сайт. Хороший сайт, несмотря на отсутствие к нему должного внимания, он до сих пор активно используется общественностью. Для защиты пары-тройки десятков килобайт эксклюзивного кода, она использовала zend encoder. Но вот спустя пару лет случилась неприятность — незажатые encoder-ом исходники где-то благополучно потерялись, совсем. Сколько мы их ни искали — так и не нашли. Ну что делать, взяли «закодированные» исходники, взяли декодер (какой-то сугубо подпольно-хакерский) и удивились. Восстановилось практически все: названия переменных, названия функций… все, вплоть до комментариев. Мораль проста — на предмет секретности кода, доверять zend encoder-у нельзя.
Ну вы просто писатель :) Да, я слышал про Зенд подобные вещи.
Особенно жена впечатлила :))
Какая бы не была супер-умная защита точка-то проверки (на действительность лицензии) всё равно ОДНА.
Вычленить её в коде и ликвидировать дело нескольких минут. Т.е. находим условие/ветвление с вызвом check_license(...) и заменяем её строкой "ok". Всё! Код разблокирован!
Угу. А можно и просто УДАЛИТЬ.
А вообще думаю, на просторах нашей Родины еще можно найти программиста, который сможет поменять значения $key == md5($domain.$secretword);, хотя бы на 1==1
Привязывать php-скрипты к хосту, зендить, проверять лицензии - только время тратить. Тут даже не надо самому писать заумные скрипты, а достаточно уметь бегло определять принцип работы, чтобы вычленить эти "хитрости" и ликвидировать их
из за вашего ника мой рабочий прокси не пропускал статью читать пока она в личном блоге была :)
Слово "защита" выглядит смешно тут. Я Ваш код и даром бы не взял. Раздуваете собственную значимость? :)

return "ok";
О каком коде вы говорите вообще?
последнюю строчку комментария посмотрите. ничего не напоминает?
При чем тут код примера к статье? Я и не предлагаю вам его брать
Пока рнр - интерпритатор, нормальной защиты от копирования не будет
Выгоднее продавать исходники :) Все равно клиенту важно, чтобы работало, лезть туда он вряд ли станет. Можно обговорить ситуацию с доработками скрипта клиентом.
P.S. Используйте SHA-1 вместо MD5. Безопаснее.
100% защитить не удасться PHP скрипт никогда, т.к. это PHP. Тут нужно опять искать золотую середину, между тем насколько это все будет безопасно и просто.

Безопасность <----+----> Простота. Выбирать вам :) Можно предусмотреть многие варианты, чтобы даже опытные юзеры попотели над защитой, можно сделать простенько, со вкусом. Если работать с серьезными клиентами, нужно делать уклон в сторону простоты, а если с 14-летними школьниками, у которых врядли есть лишние 100$ и которые жаждят халявы, тогда уж в сторону безопасности :)
Сходил на сайт lockit. Я правильно понимаю, что он ни за что вот такой код правильно не сможет обфускировать?

call_user_function( array( 'Prefix'.$Class, 'get'.$Field ) )
А в чем, собственно, неправильность может заключаться?
В том, что названия класса и метода в данном случае зависят от ран-тайм окружения, которое на этапе обфускации неизвестно. Я практически уверен, что ни один обфускатор с такой задачей не справится: сложно себе представить, как это вообще можно сделать, без предварительной вставки в код обёрток-подсказок.
Оупенсорс по своей технологии работы не может быть защищен. Он же даже не компилируется!

Выхода нет. Решение есть - перенести часть логики на собственный сервер, где обрабатывать запросы в зависимости от купленной лицензии. Только такая политика предоставления СЕРВИСА может быть реализована при существующих технологиях. Всё остальное - дизассемблируется.
UFO just landed and posted this here
Если вам хочется скрывать код, то скриптовые языки не для вас. Напишите на С и скомпилируйте. Любые потуги сокрытия чего-либо наподобие PHP вызывают жалость.
Мда… Одно быдло шифрует код, другое ломает его. И это вместо того чтобы делом заниматься.

Люди, вы что, совсем с ума посходили? Ощущение что в программирование идут одни менеджеры, которые писать код не умеют, а только п*здят его. Так пусть п*здят, все равно из этого ничего толкового они не сделают.

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

У меня ощущение, что у некоторых людей на почве опенсорса проблемы с головой и они ну никак не хотят понимать, что это не мегановая идеалогия, которая перевернет мир, а удобный маркетинговый ход, что бы противостоять гигантам софтверной индустрии.
> Человек пишет софт на продажу как я понял. Не одному человеку за много денег, а множеству человек за небольшие деньги. И это конечный продукт, к которому ничего не надо доделывать, переделывать и тд.

И что мешает ему его продавать не защищая всякой ересью? Типа дать лицензию "хочешь использовать для коммерции - плати". И все.

А те кто ломают - и так бы не купили.
До этого так и было - его просто скачивали, и платить не собирались. Более таго, выдавали потом за свою разработку.
Хмм. Тогда возьму свои слова временно обратно (если вы не против) и давайте порпобуем разобраться: что за продукт? Кто скачивал? Кто выдавал за свои разработки?

А потом попробуем решить вопрос по закону ФР (или Украины или еще где вы). Попробуем?
не хочу здесь светить
Тогда как их могли скачивать?
с моего же сайта, можно было бесплатно скачать. Но просто было предупреждение о том что нельзя использовать в коммерческих целях, на которе, естественно, все срали. Зачем я выложил для скачивания? Никто не заинтересуется, пока не скачает - потому что главная "фишка" моего скрипта - в исходных кодах
В общем, не хотите разобраться - не надо.
Если я не буду давать для теста исходники, люди просто взглянут и пройдут мимо, через 5 минут забудут обо мне. А если я даю скачать - человек скачает, поставит, и уже более серьезно задумается об использовании именно моего скрипта
Да. И, по-вашему, человек не должен задумываться чем он пользуется, а тупо юзать все что ему в эти исходники запихнут?
Как раз должен. У меня исходники открыты. Были. А вот пример вебстудии, которая выдает как за своё: http://www.jvs.in.ua/
Почему вы не обратились с иском в суд? Выиграете денег куда больше чем стоит лицензия на вашу CMS.
Я программист, и далек от юридической стороны вопроса. И скрипт никак юридически не защищен (кстати, надо самому себе отправить исходники заказным письмом :) ). А из этой вебстудии денег не получишь :)
Потратить пару часов на выбор открытой лицензии - нетрудно. А пока студия пусть клиентов набирает да побольше на вашей CMS бабла сделает (а потом и в суд можно :-)
А что дает открытая лицензия? Поподробнее плиз. У меня тоже висит какое-то лицензионное соглашение (самопальное)
к примеру GPL, Apache, BSD - открытые лицензии
но у меня коммерческий продукт
Ну правильно. Подберите лицензию, в которой проект будет с открытыми исходниками, но платным для коммерческих целей.
Хотя отчасти вас понимаю - сам пишу код и с судовыми процессами не разбирался. Но если такое дело произойдет - надо быть готовым.
У них прямо на главной странице:
О собственной системе управления содержимым:
Разработанная нами система управления содержимым сайта (CMS) .....
http://www.jvs.in.ua/index.php?section=4…

ай-яй-яй. Это Ваша cms? Плохо... А если это их кусок кода, то ладно уж, подарите им cms, всё равно много бабок они с этого не поимеют с такими знаниями ;)
ой. ссылка отфильтровалась. В общем, заходим на сайт и вводим в поле поиска html теги.
Вы искали слово "алерт говностидия", естественно ничего не найдено. Что вы хотели показать?
вот и я говорю — сначала бы писать научились, а потом бы уже защищали
Смысла в такой защите нет вообще.
Место где делается проверка найдется достаточно быстро. Даже если оно спрятанно досаточно "глубоко" с кучей промежуточных вызовов. Примеры - nulled релизы всяких форумов.
В защите софта криптография с открытым ключем поможет, но не сильно, так как:
1. Можно просто выключить нафиг проверку (всегда 'ok') возвращать
2. Можно создать свою ключевую пару и зашить ее в скрипт/программу (так, кстати с The Bat! делают)

Я когда-то интересный способ защиты видел. Какой-то форумный движок, а вот какой - не помню. Идея в том, что без лицензии он работает, но вставляет в страничку некое уникальное слово которое не видно (спрятано стилем). Автор время от времени, тем же гуглом, ищет такие вот сайты. Если находит - пишет телегу хостеру.
Как Вам вариант, проверять лицензию на сервере. При запуске программа обращается на сервер, но не за ответом "да/нет", а за определенным куском кода, скомпилированный в .so и зашифрованным ассимметрично. Если кусок скачался, то начинаем работать, если не скачался и/или не расшифровался, то не заработает и тут уже не нахачишь и проверку не обойдешь.
Можно скачивать не при каждом обращении, а, например, раз в месяц, либо просто при установке.
Для коммерческих клиентов можно предложить вариант техподдержки и поставки обновлений. Заодно эта штука и обновления будет выкачивать.
Плохо и не будет работать по нескольким причинам.
1. Поддерживать сразу кучу платформ надо (пыхпых работает почти везде)
2. "Нормальный" админ не разрешит чего-то там скачивать и запускать в автоматическом режиме. Разве что он безгранично доверяет разработчику.
3. Какой кусок функциональности должен быть реализован в .so/.dll файле, что бы его нельзя было дописать в самом PHP?
Да, будет непросто.
1. Думаю должно хватить Linux пару веток, Freebsd. Но в этом есть и преимущество: вы можете скомпилировать под нужную платформу, тем самым оптимизируете производительсноть.
2. Есть такая тема: либо качать при установке.
3. Часть бизнес-логики. Дописать, конечно, можно. Но тогда уже надо разбираться как это все сделано, как связано с другими частями — а это уже приближается к сложности разработки такой системы самостоятельно. Кроме того, чтобы не слишком убиваться сложностью - если разработка использует какой-либо опен-сорс фреймворк (что весьма позитивно сказывается на проекте и уменьшает кол-во вашего кода), то фреймворк можно не шифровать, а зашифровать только свою разработку.
составьте правильно лицензию и не парьтесь. все равно, если ваш продукт будет популярным - его поламают, как бы вы с ключами не извращались. с этим нужно бороться по другому.
у оракла, например, на сайте можно сказать субд, поставить и узать сколько влезет без всяких лицензий, но если они тебя вычислят...
а то, что вы выдаете ключь... так мелкомягкие,например, тоже выдают ключь, а толку? вы сейчас наверное из-под ломанной винды это читаете? :)
Нет, не из-под ломаной. Но я думаю, если бы винду не защищали, ее бы покупали еще меньше
ну прям уж так и меньше. как раз её зашишают потому что её так много покупают, но все равно это никому не мешает её "крякать"...

З.ы. Я тоже на работе под лицензией, но её купил работодатель и то только потому, что ходят постоянные проверки...
> тот же Битрикс (фу)
Кстати года три назад мы его пытались форкнуть. Создать битрикс-совместимую CMS, бесплатную. И это даже удалось на 75% (большего и не требовалось на тот момент, да и битрикс-софту в кашу плевать не планировалось). Да только такое изделие на халяву никому не понадобилось. Вся прелесть битрикса в его коробочности.
Объясните мне, что такое коробочность? Я что-то до сих пор не в курсе что это слово значит. Мой скрипт поставляется на фирменном DVD, с глянцевой инструкцией, в прозрачной красивой коробочке. Значит ли это что у меня тоже коробочный? :)
Смысл в том, что насяльника видит большую цену в прайсе, и коробочку глянцевую - CMS автоматически считается хорошей вне зависимости от качества.
Так что значит что ваш скрипт коробочный. Вероятно он очень хорош, но за те-же деньги, или большие можно было не парится и засунуть что попало, большой насяльник все-равно велит купить.
Думаю да, коробочный. Это значит, что можно купить, самому установить и настроить при помощи инструкции, без обращения к разработчику. (ну кроме сложных спорных ситуаций)
А есть адрес этого проекта? Где-то CMS еще лежит?
есть еще вариант писать для РНР либу и прикомпиливать. а уже в либу выносить часть логики скрипта и саму проверку лицензии, но это опять же - нужен второй мозг умеющий кодить на С и заморочки с отладкой под разные оси.
хотя, это немного затруднит взлом... но не сильно :)
направление мыслей - говно
опен сорс должен быть опен сорсом. и правильно тебе говорили, что твой код никому нахрен не нужен
2) Проверка $_SERVER["REMOTE_ADDR"]. Проверяем наличие '127' в начале ip-адреса. Недостаток — можно переопределить эту переменную перед выполнением скрипта.


Я буду пользоваться Вашим скриптом бесплатно :)
Поясню. На сервер ставится фронт-енд(Nginx) и бэк-енд(apache).
Apache вешается на 127.0.0.1, nginx светит по главному адресу.
И собственно у меня бесплатный скрипт без лицензий :)
Нулификация а-ля велосипед :)

Второй вариант - подделка REMOTE_ADDR через окружение. Эффект будет таким же.
В целом проверка REMOTE_ADDR вообще не выглядит разумной
nginx полезнее :) с ним будет статика отдаваться быстрее :)
Однако, если стоит вопрос не ускорения работы, а чистой нулификации – на nginx может оказаться попросту жалко памяти (ага, такое тоже бывает). Хотя в глобальном плане использование nginx/lighttpd/tinyhttpd методологически более верно.
улыбнуло. если обойти обфускацию, то всё остальное не составит проблемы убрать.
защита офигенно замедлит работу самого скрипта.
Может в код размещать бэкдор?
От копирования кода не спасёт, но акт личной мести совершить удастся :)
Что если инфу брать из результата вывода phpinfo()? Там есть и 127.0.0.1 и быть может другие переменные которые сложно подменить простым $_SERVER['SERVER_ADDR'] = ...
Придумалось вот кое что. Как и все ранее предложенные методы не претендует на идеальность защиты, но в качестве усложнения нулла вполне подойдет.
Все инклуды, все пути к файлам прописаны в абсолютном виде. Ну тоесть от самого корня диска. Допустим /home/user/public_html/inc/main.inc. Причем все эти пути прописаны в одном зашифрованном конфиг файле. А файл этот или скачивается во время инсталла с вашего сервера, или высылается по почте..
Так мы можем быть уверены (ну если допустить уверенность том что файл все еще зашифрован), что скрипты установлены только в одной папке, а так как два сайта в одну папку поставить проблемматично, то можно и лицензии выдавать на папки.

Ну в общем, как-то так. Идея сыровата еще, додумать надо ее. Но, как мне кажется, тоже имеет право на жизнь.
>а так как два сайта в одну папку поставить проблемматично
только в пределах одного сервера :)
Ну в принципе да. Но это надо на каждый свой новый сайт новый сервер. А с виртуальными хостерами еще договариваться нужно чтобы они создавали юзера с таким же путем к домашней папке как и на другом сервере. Ведь что cpanel что DirectAdmin создают папки в качестве имени которой используется название домена. В общем гемороя гораздо больше чем занулить, а уж от нулла спастись можно если только в C++ скомпилить и в cgi-bin кинуть файл. Вот кстати как раз вспомнил про C++. Можно же скомпилить бинарник и запускать его из папки cgi-bin. Причем можно прямо из php к нему и обращаться. А тут уж и нормальную защиту можно сделать и проверку на серверные железяки.
По последнему пункту -

Достаточно пользователю давать однодневную лицензию, для тестирования, на введенный им домен.
Привет, Игорь.

Как там Олег и Колян? Собираются нас обогатить? :)
Zend SafeGuard Suite — это кодер и создатель лицензий в одном лице. зачем придумывать велосипед, если он уже есть? — и защита на уровне
Sign up to leave a comment.

Articles