静态分析工具,用于检测PHP应用程序中的表依赖项

时间:2011-09-02 17:08:31

标签: php static-analysis

我正在开发一个大型遗留PHP项​​目。我们面临的问题是许多PHP脚本与数据库紧密耦合,这使得管理和更改应用程序非常困难,因为我们不清楚哪种更改会破坏什么。

代码并不是那么聪明。大多数db调用看起来像

$theQuery = "select * from $theDatabase.TABLEName";
$theResult = mysql_query($theQuery);
//Do some rendering

因此,大多数表依赖项应该可以直接在代码中检测到,而无需分析代码的运行时行为。是否有工具(付费或免费),您可以将其指向一个php文件并为其提供要查找的表名列表,它将查看该文件以及该文件的所有包含并为您提供表的列表受php脚本影响的是什么?

如果它不能保证正确,那也没关系。任何信息都会比我们现在更好!

谢谢!

2 个答案:

答案 0 :(得分:1)

有两个级别可以执行此操作。

  • 一个完整的静态分析,它将字符串片段的程序集跟踪到SQL调用中,将字符串作为SQL文本(解析)检查并提取所需的信息。由于您的程序可能正在与多个数据库通信,因此您还需要跟踪数据库连接步骤('theDatabase'值的来源),以便确定表和列应该是什么。这真的很难:需要一个完整的PHP解析器,控制和数据流分析(面对动态语言,呃),SQL解析和提取。这样的工具可能存在,但它会让我感到惊讶。 (我的公司构建自定义工具,我们试图跟踪这种事情。)

  • 从您的代码中提取所有字符串片段(“select * from”和“TABLEName”)的hueristic,并尝试从中猜测表和列。为此,你需要能够提取所有琴弦的东西,并将它们分开以寻找证据。您的示例中唯一的证据是“select *”(表示“所有列”)和“TABLEName”;如果您有一组数据库模式,则可以与表名匹配以确定列。

在任何一种情况下,你都需要能在某种程度上解析PHP的东西;第一种情况比PHP解释器更好(你必须对可能涉及的所有文件进行流量分析),第二种情况是在lexemes级别。

我们的DMS Software Reengineering Toolkit及其PHP Front End将成为深层语义分析工具的起点。需要做很多工作。

我们的Source Code Search Engine可能是一个很好的起始工具。它可以轻松地提取所有字符串片段(即使对于比它看起来更难的PHP也是如此)。 [也许PHP令牌化器做得很好。]有了这些信息,从字符串片段中提取表名的附加代码不应该太难。

答案 1 :(得分:0)

JetBrains PHPStorm IDE中的重构/替换工具可以做到这一点。

查看rename dialogfind usages dialog的文档。

如果您需要澄清,请告诉我。