rips中如何使用PHP虚拟机自带函数--token_get_all

这两天在看rips源码,发现,它在审计php代码时调用了php虚拟机自带的token_get_all此函数。

这一函数会将php源码按照内置的规则进行归纳,并输出成数组格式。

如:

<?php


$tokens = token_get_all('<?php echo(123); ?>');

for($i=0 ; $i<count($tokens);$i++){
    for($j=1 ; $j<count($tokens[$i]);$j++){
        echo "</br>";
//token_name可以将数字表示的字符串的类型转化为php中固定名称,此函数PHP自带
        $token_name = token_name($tokens[$i][0]);
        echo $token_name;
        echo "</br>";
        
        echo htmlspecialchars($tokens[$i][$j]);
    }
}


?>

页面展示为:

使用token_name时:

不使用token_name时:

<?php

$tokens = token_get_all('<?php echo(123); ?>');
        
for($i=0 ; $i<count($tokens);$i++){
    for($j=0 ; $j<count($tokens[$i]);$j++){
        echo "</br>";
        echo "</br>";
        
        echo htmlspecialchars($tokens[$i][$j]);
    }
}

?>

如图:

rips使用token_get_all对文件进行整理时:

<?php


                $lines_stack = array();
//读取文件内容并转化成数组
        $lines_stack[] = file("C:\\wamp\\www\\test\\index.php");
        echo "</br>";
//对数组进行整理
        $lines_pointer = end($lines_stack);
//将数组转化成String型,并使用token_get_all
        $tokens = token_get_all(implode(' ',$lines_pointer));
//遍历并输出
                 for($i=0 ; $i<count($tokens);$i++){
//token_get_all所整理出的数组第0位代表字符串类型,第1位代表字符串内容,第2位是字符串所在文件中的行数。
                     for($j=1 ; $j<count($tokens[$i]);$j++){
                         echo "</br>";
                         $token_name = token_name($tokens[$i][0]);
                         echo $token_name;
                         echo "</br>";
        
                         echo htmlspecialchars($tokens[$i][$j]);
                     }
                 }
    
?>

结果如图:

 

posted @ 2017-02-10 10:14  ermei  阅读(1177)  评论(0编辑  收藏  举报