Обнаружить код PHP в файлах со смешанным содержимым (PHP/HTML) с помощью PHP для Obfuscate?

Просто подумайте, существует ли класс или функция, позволяющая обнаруживать и заменять только php-код внутри php-файла. Я хочу, чтобы Obfuscate только PHP-код и не тронул HTML, и я не думаю, что preg_match - лучший способ сделать это. Пока у меня есть это:

function replace_between($str) {
require_once 'plugins/Obfuscator.php';
$search = "/(<?php )(.*?)( ?>)/";
$check_str = preg_match($search,$str,$match);

 $sData = <<<'DATA'
    echo $match[1];
DATA;
$sObfusationData = new Obfuscator($sData, 'Class/Code NAME');

$new = preg_replace($search,$sObfusationData,$str);
return $new;

Пример выше не работает по нескольким причинам, например, что я хочу получить.

1 ответ

Решение

Обнаружить код PHP в файлах со смешанным содержимым (PHP/HTML) с помощью PHP для Obfuscate?

Вы можете использовать расширение PHP tokenizer для достижения этого должным образом. Примером является функция ниже:

function findPHP($string){
        if(!is_string($string)) return false;

        $tokens=token_get_all($string);
        $php_code='';
        $result=array();
        $start=false;
        foreach($tokens as $key=>$token){
                if(is_array($token)&&token_name($token[0])==="T_OPEN_TAG"){
                    $start=true;
                    continue;
                }
                if(is_array($token)&&token_name($token[0])==="T_CLOSE_TAG"){
                    $start=false;
                    $result[]=$php_code;
                    $php_code='';
                    continue;
                }
                if($start){
                    if(is_array($token))
                        $php_code.=$token[1];
                    else
                        $php_code.=$token;
                }

        }
        return $result;
    }

    print_r(findPHP(file_get_contents('get_path.php')));

Эта функция обнаруживает только код PHP в любом файле со смешанным содержимым и возвращает массив, содержащий все вхождения кода PHP.

Тогда все, что вам нужно сделать, это использовать свой выключатель по своему усмотрению. Все это говорит о том, что вы можете слегка изменить вышеприведенную функцию для достижения своей цели. Пример:

function find_and_offuscate_PHP($string){
        if(!is_string($string)) return false;

        $tokens=token_get_all($string);
        $php_code='';
        $result=array();
        $start=false;
        $from=false;
        foreach($tokens as $key=>$token){
                if(is_array($token)&&token_name($token[0])==="T_OPEN_TAG"){
                    $from=$key;
                    $start=true;
                    continue;
                }
                if(is_array($token)&&token_name($token[0])==="T_CLOSE_TAG"){
                    $start=false;
                    $result[$from]=$php_code;
                    $from=false;
                    $php_code='';
                    continue;
                }
                if($start){
                    if(is_array($token))
                        $php_code.=$token[1];
                    else
                        $php_code.=$token;
                    unset($tokens[$key]);
                }

        }
        if($start&&$from&&$php_code){
            $result[$from]=$php_code;
            unset($start,$from,$php_code);
        }
        // require_once 'plugins/Obfuscator.php';
        $result=array_map(function($php_code){
              // return  new Obfuscator($php_code, 'Class/Code NAME');
              return base64_encode($php_code);
        },$result);
        $tokens=array_map(function($token){return is_array($token)?$token[1]:$token;},$tokens);

        foreach($result as $from=> $offuscated){
            $tokens[$from] .= " $offuscated";
            unset($result[$from]);
        }

        return join(' ',$tokens);
    }

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

Другие вопросы по тегам