Разбирайте PHP-код для извлечения имен функций?

Я должен сделать скрипт на PHP, который будет сканировать другие файлы PHP, чтобы проверять опасные вызовы функций, такие как eval, exec. Есть ли доступный парсер, который может дать мне логическую структуру кода.

Или я должен пойти с Regex.

Спасибо, предложения любого типа приветствуются.

Arshdeep

Редактировать: я не рассматриваю это как «один выстрел убить всех». У меня есть и другие вещи, но это еще что-то, что я должен сделать.

Вы можете использовать токенизатор для этого:

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

Обратите внимание, что на выходе третий элемент:

 [1] => Array ( [0] => 307 [1] => exec [2] => 1 ) 

Не надо , ты только стреляешь в ногу.

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 } } } } 

Просто используйте disable_function и disable_classes .
Это можно изменить только на уровне php.ini.