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

时间:2011-12-09 13:23:48

标签: php security

我必须在PHP中创建一个脚本来扫描其他PHP文件以检查危险的函数调用,如eval,exec。 是否有任何可用的解析器可以为我提供代码的逻辑结构。

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

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

Arshdeep

编辑:我不认为这是“一枪一击”。我也有其他一些想法,但它仍然是我必须做的事情。

3 个答案:

答案 0 :(得分:6)

不要,你只能用脚射击自己。

PHP是一种高度动态的语言。您可能甚至无法想象执行代码的可能性。我有一些尝试预处理PHP沙盒,根据我的经验,我可以告诉你,非常难以解决所有情况。要粗略了解您所面临的情况,请查看exploitable functions list,它是随着时间的推移而创建的,但仍然不完美。

为了回答您的实际问题,我保留了PHP parser written in 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
            }
        }
    }
}

答案 1 :(得分:2)

只需使用disable_function and disable_classes 这只能在php.ini级别更改。

答案 2 :(得分:1)

您可以使用tokenizer执行此操作:

print_r(token_get_all('<?php exec("rm -rf *"); ?>'));

在输出中注意第三个元素是:

[1] => Array
    (
        [0] => 307
        [1] => exec
        [2] => 1
    )
相关问题