Обнаружить код 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;

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

2

Решение

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

Вы можете использовать расширение 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, вам просто нужно раскомментировать, и функция будет готова к использованию в вашем приложении.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]