解析PHP代码以提取函数名称?

Ars*_*eep 4 php security

我必须在PHP中创建一个脚本,它将扫描其他PHP文件以检查危险的函数调用,如eval,exec.有没有可用的解析器可以给我一个逻辑的代码结构.

或者我必须使用正则表达式.

谢谢,欢迎任何类型的建议.

Arshdeep

编辑:我不认为它是"一枪杀死所有".我也有其他一些想法,但它仍然是我必须做的事情.

Nik*_*kiC 6

,你只会用脚射击自己.

PHP是一种高度动态的语言.您甚至无法想象执行代码的可能性.我有一些尝试,在预处理PHP的沙盒,并从我的经验,我可以告诉你,这是非常难占所有案件.要大致了解您所面临的情况,请查看可利用的功能列表,该列表是随着时间的推移而创建的,但仍然不完美.

为了回答你的实际问题,我维护了一个用PHP编写PHP解析器.您可以通过定义一个大致如下所示的节点访问者来拦截所有函数调用:

class MyNodeVisitor extends PHPParser_NodeVisitorAbstract {
    public function enterNode(PHPParser_Node $node) {
        if ($node instanceof PHPParser_Node_Expr_FuncCall) {
            if ($node->name instanceof PHPParser_Node_Name) {
                // static function name
            } else {
                // dynamic function name
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Fab*_*bio 2

您可以使用分词器来做到这一点:

print_r(token_get_all('<?php exec("rm -rf *"); ?>'));
Run Code Online (Sandbox Code Playgroud)

请注意输出中的第三个元素:

[1] => Array
    (
        [0] => 307
        [1] => exec
        [2] => 1
    )
Run Code Online (Sandbox Code Playgroud)