通过 PHP 检测包含混合内容 (PHP/HTML) 的文件中的 PHP 代码以进行混淆?

Detect PHP code in files with mixed content (PHP/HTML) by PHP for Obfuscate?

只是想知道 class 或函数是否只允许检测和替换 php 文件中的 php 代码。我只想混淆 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;

上面的示例由于某些原因不起作用,例如我想要得到的东西。

Detect PHP code in files with mixed content (PHP/HTML) by PHP for Obfuscate?

您可以使用 PHP 分词器扩展来实现此 properly.An 例如下面的函数:

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 代码和 return 包含所有 PHP 代码出现的数组。

然后你所要做的就是像你一样使用你的混淆器want.All,它说你可以稍微改变上面的功能来实现你的purpose.Example:

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 的行,您只需取消注释,该功能就可以在您的应用程序中使用了。