Защита PHP скрипта путям привязки к доменному имени

Тема в разделе PHP, создана пользователем Hangman666, 13 июн 2016.

Войдите для ответа
  1. Hangman666 Хранитель Идей

    Hangman666
    Статус:
    Вне сети
    Сообщения:
    474
    Симпатии:
    271
    Регистрация:
    10.03.16
    Думаю, многие сталкивались с тем, что иногда необходимо защитить ваш скрипт от копирования, и вы использовали разные Ioncube, PHPLockit, но многим неудобно каждый раз кодировать. Понимаю, что в Ioncube есть такая штука, благодаря которой можно генерировать ключи безопасности и т.д., но многим невыгодно покупать или же пользоваться чужими услугами, а то мало ли, все бывает.

    Некоторым хочется кодировать не весь код, а лишь его часть, и для этого многие используют такой «массив» для защиты:

    $_SERVER['HTTP_HOST']

    Но его легко обойти:

    $_SERVER['HTTP_HOST']='разрешенный домен';

    Поэтому есть решение данной проблемы, и её может решить любой человек с начальным знанием PHP, MySQL.

    В итоге у нас получится:
    • Скрипт будет закодирован путем обфускатора, который посылает API запрос к сайту, где API ищет доменное имя и ключ в базе данных; если он есть, то скрипт будет работать, если нет, то он будет переадресовывать основному сайту (пример будет таким: domain.com/api.php?domain=mysite1.ru&key=4024B-C0876-4FF0C-9A298-80EFA);
    • Также у нас будет скрипт api.php, который будет отвечать за работу проверки лицензии и т.д.;
    • Также хочу выделить лицензионный ключ, который мы будем получать. Лицензионный ключ — это md5 хэш домена, который будет проверятся через api, а в базе данных будет записан лишь сам домен и его статус.
    Решение

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

    Код:
    <?php
    
    $config = array(
    
        'host' => 'localhost',
        'user' => 'root',
        'pass' => '',
        'base' => 'lic'
       
    );
    
    $db = new mysqli($config['host'], $config['user'], $config['pass'], $config['base']);
    if($db->connect_errno) {
        exit('Ошибка: Не удалось подключиться к базе данных!');
    }
    $db->set_charset("utf8");
    
    class Main {
        public     function keygen($domain){
            $key[0] = strtoupper(md5($domain));
            $key[1] = substr($key[0], 0, 5);
            $key[2] = substr($key[0], 5, 5);
            $key[3] = substr($key[0], 10, 5);
            $key[4] = substr($key[0], 15, 5);
            $key[5] = substr($key[0], 20, 5);
           
            return $key[1].'-'.$key[2].'-'.$key[3].'-'.$key[4].'-'.$key[5];
        }
    
        public function getLicInfo($domain){
            global $db, $config;
           
            $sql = "SELECT * FROM `licenses` WHERE `domain` = '{$domain}' LIMIT 1";
            $result = $db->query($sql);
    
            if($result->num_rows == 1){
                return $result->fetch_assoc();
            }
            return false;
        }
    }
    
    $main = new Main;
    
    $domain = "".$_GET['domain']."";
    $key = strtoupper($_GET['key']);
    
    
    
    if($lic = $main->getLicInfo($domain)){
        if($lic['license_status']){
            $twokey = $main->keygen($lic['license_domain']);
            if($twokey == $key){
                $a = 'OK_'.$lic['license_domain'];
            } else {
                $a = 'ERROR_wrongkey';
            }
        } else {
            $a = 'ERROR_nolicense';
        }
    } else {
        $a = 'ERROR_nolicense';
    }
    
    echo $a;
    exit();
    ?>

    Вот сам код api.php. Тут я хотел бы обратить ваше внимание на следующий код:

    Код:
    class Main {
        public     function keygen($domain){
            $key[0] = strtoupper(md5($domain));
            $key[1] = substr($key[0], 0, 5);
            $key[2] = substr($key[0], 5, 5);
            $key[3] = substr($key[0], 10, 5);
            $key[4] = substr($key[0], 15, 5);
            $key[5] = substr($key[0], 20, 5);
           
            return $key[1].'-'.$key[2].'-'.$key[3].'-'.$key[4].'-'.$key[5];
        }

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

    2.Проверка доменного имена на наличие в базе данных
    В 1 пункте мы с вами обозревали код api.php, который отвечает за работу скрипта. Хочу выделить код, который я уже выделял:

    Код:
    public function getLicInfo($domain){
            global $db, $config;
           
            $sql = "SELECT * FROM `licenses` WHERE `domain` = '{$domain}' LIMIT 1";
            $result = $db->query($sql);
    
            if($result->num_rows == 1){
                return $result->fetch_assoc();
            }
            return false;
        }
    }

    Данный класс проверяет доменное имя на наличие в базе данных, и если все удачно, то скрипт работает; если нет, то он переадресует на основной сайт.

    Вот мы с вами закончили обозревать код api.php, который отвечает за основную работу проверки лицензии, но теперь стоит вопрос: «А как его реализовать в самом скрипте?»

    Делается оно благодаря следующему коду:

    Код:
    public function __destruct() {
            $request = file_get_contents("http://domain.com/api.php?domain=". $_SERVER['HTTP_HOST'] ."&key=".$this->config->lic_key);
            $status = explode("_", $request);
           
            if($status[0] != "OK" && "".$_SERVER['HTTP_HOST']."" != $status[1]){
                header("Location: http://domain.com/");
            }

    Этот код отправляет запрос в API и если имеется в базе данных, и если доменное имя есть в базе данных, то скрипт работает, если нет, то не работает. Такая же ситуация, если код неправильный, для этого в api.php существует следующий «отрезок» кода:

    Код:
    if($lic = $main->getLicInfo($domain)){
        if($lic['license_status']){
            $twokey = $main->keygen($lic['license_domain']);
            if($twokey == $key){
                $a = 'OK_'.$lic['license_domain'];
            } else {
                $a = 'ERROR_wrongkey';
            }
        } else {
            $a = 'ERROR_nolicense';
        }
    } else {
        $a = 'ERROR_nolicense';
    }
    
    echo $a;
    exit();[SRC]
    
    Думаю, тут понятно: если все правильно, то «выходит» сообщение ok_myssite.com и это удовлетворяет, то скрипт продолжает работу, а если введен неверный ключ или доменное имя, то «выходит» следующие сообщения (смотря где есть ошибка):
    
    ERROR_nolicense
    
    или же
    
    ERROR_wrongkey
    
    Думаю, все.
     
    13 июн 2016 #1
  2. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    От какого копирования? Не понял, зачем всё-таки нужен скрипт
     
    13 июн 2016 #2
  3. Hangman666 Хранитель Идей

    Hangman666
    Статус:
    Вне сети
    Сообщения:
    474
    Симпатии:
    271
    Регистрация:
    10.03.16
    Вот в этом пункте написано подробно

    • Скрипт будет закодирован путем обфускатора, который посылает API запрос к сайту, где API ищет доменное имя и ключ в базе данных; если он есть, то скрипт будет работать, если нет, то он будет переадресовывать основному сайту (пример будет таким:domain.com/api.php?domain=mysite1.ru&key=4024B-C0876-4FF0C-9A298-80EFA);
    Тоесть если скрипт стащат с сайта, он не будет функционировать, так как привязан к домену!
     
    13 июн 2016 #3
  4. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    Как его стащат? Если только шелл зальют
     
    13 июн 2016 #4
  5. Hangman666 Хранитель Идей

    Hangman666
    Статус:
    Вне сети
    Сообщения:
    474
    Симпатии:
    271
    Регистрация:
    10.03.16
    Ну может и так))
    Но соль в том что скрипт будет привязан к домену и небудет функционировать, а только перенаправлять на домен к которому привязан))
     
    13 июн 2016 #5
  6. #Arman Новорег

    #Arman
    Статус:
    Вне сети
    Сообщения:
    8
    Симпатии:
    0
    Регистрация:
    09.06.16
    На что вам бог криптование даровал ?
    люди очнитесь !!
    криптуй файл и живи счастливо !
     
    13 июн 2016 #6
  7. #Arman Новорег

    #Arman
    Статус:
    Вне сети
    Сообщения:
    8
    Симпатии:
    0
    Регистрация:
    09.06.16
    легко!
    можно всю твою базу mysql еба**ть и управлять ею!
    можно слить любой скрипт! конечно если человек грамотный и знает своё дело!
     
    13 июн 2016 #7
  8. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    Ну, я говорю, только в случае взлома. Уверен, что есть способ расшифровать этот код
     
    13 июн 2016 #8
  9. #Arman Новорег

    #Arman
    Статус:
    Вне сети
    Сообщения:
    8
    Симпатии:
    0
    Регистрация:
    09.06.16
    10р я рассшифрую код + солью весь код )
     
    13 июн 2016 #9
  10. Dom!no* Местный

    Dom!no*
    Статус:
    Вне сети
    Сообщения:
    55
    Симпатии:
    11
    Регистрация:
    02.06.16
    полезно
     
    13 июн 2016 #10
  11. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    Тем более, секретный ключ хранится в БД, когда сайт будет взломан, можно достать из БД этот ключик
     
    13 июн 2016 #11
  12. #Arman Новорег

    #Arman
    Статус:
    Вне сети
    Сообщения:
    8
    Симпатии:
    0
    Регистрация:
    09.06.16
    не особо чел ,со базовами знаниями php шатнёт этот скрипт
     
    13 июн 2016 #12
  13. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    @Dom!no*, ты это будешь юзать у себя на проекте? :bad:
     
    13 июн 2016 #13
  14. ERROR404 Администратор

    ERROR404
    Статус:
    Вне сети
    @#Arman,
    Как дела, реверсер? Или не взяли тебя? :kek:
     
    13 июн 2016 #14
    Hangman666 нравится это.
  15. Hangman666 Хранитель Идей

    Hangman666
    Статус:
    Вне сети
    Сообщения:
    474
    Симпатии:
    271
    Регистрация:
    10.03.16
    Ну понятя что все можно взломать.. но люди ведь зачем то шифруют всё.
    Так что невижу смысла писать что можно взломать расшифровать.
     
    13 июн 2016 #15
  16. r00t3rsec Новорег

    r00t3rsec
    Статус:
    Вне сети
    Сообщения:
    23
    Симпатии:
    1
    Регистрация:
    05.10.16
    Это работает
     
    5 окт 2016 #16
  17. inwin Новорег

    inwin
    Статус:
    Вне сети
    Сообщения:
    5
    Симпатии:
    0
    Регистрация:
    04.11.16
    Спасибо а через исходный код можно копировать проверял кто?
     
    4 ноя 2016 #17
Top