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]); } } ?>
结果如图: