2010-10-05 48 views
4

在一个项目中,我目前工作,我们正在考虑把system()为php.ini中的disable_functions声明。现在,我们的一个元模块最终也会成为这种限制的牺牲品,它是用system("php -l");调用语法检查文件 - 促使我寻找替代品。替代系统('php -l')?

原来曾经有一个php_check_syntax(),但不是唯一这样做不会限制自己只检查语法,并进而包括该文件,如果是语法有效,但它是作为PHP 5.0.5被移除。本手册建议使用php -l代替,但考虑到我确定在PHP中禁用系统调用函数是一种相当普遍的做法,我想知道是否有可接受的,更好的语法检查方式来检查PHP文件中的PHP文件。

(顺便说一下,我对此并不感冒,一个'不'完全就够了(我期待它,真的)我们可以超出这个限制模块 - 但我问这个问题既出于好奇以及更优美的解决方案的希望。)

+0

包括文件和捕获异常:P – 2010-10-05 08:23:18

+1

@Ignacio:万一未舌状(尽管我认为是这样):用错误处理程序将致命错误转换为异常不起作用,更不用说包含该文件将执行它,而这个模块不应该这样做。 – pinkgothic 2010-10-05 08:37:20

+0

绝对是舌尖。正确的方法是告诉编译器编译它,然后捕获异常。 – 2010-10-05 08:39:38

回答

3

我发现使用PECL runkit_lint_file()替代。

它做相同的检查为php_check_syntax()。

我觉得值得一看。

+0

哦!绝对。这看起来和我一直在寻找的一样。我想知道我们是否有PECL runkit - 关闭调查!出于好奇,你知道关于这个函数的任何安全公告吗(虽然他们对我来说是轶事,被检查的文件是可信的)? – pinkgothic 2010-10-05 08:40:28

+0

据我可以从手册中读它应该是安全的,因为它只是试图解析php文件,然后返回,如果解析是成功的。它不应该执行任何执行,所以我认为它是安全的;-) – ITroubs 2010-10-05 08:43:27

+0

好吧,历史上一直有像'highlight_file()'这样的函数的安全建议,因为你可以避开'假设'处理正确的有效载荷 - 因此是一个问题。但是,正如我所说,传闻 - 我并不担心在我的情况下,只是一个奇怪的饼干。 – pinkgothic 2010-10-05 08:46:51

0

查看我们的PHP Formatter。这个命令行工具使用格式良好的PHP文件并很好地格式化它。

它不仅格式,它也语法检查,并返回命令行状态,告诉您该文件是否是“良好形成”;它包含一个完整的PHP 5解析器。因为它是一个命令行工具,所以如果这是您需要做的事情,那么从PHP脚本启动将很容易,并且通过检查返回的状态,您可以知道该文件是否合法。

+0

“这个命令行工具” - 我试图远离命令行,但 - 这个想法是禁止在PHP中调用它的任何东西,毕竟('system' /'passthru' /等)。尽管如此,谢谢。 :) – pinkgothic 2010-10-07 07:12:27

2

这可能也是一种选择: When (if ever) is eval NOT evil?

,似乎来得更快:

$nTestTiempo0 = microtime(true); 
exec('php -l yourfile.php',$arrMsgError,$nCodeError); 
$nTestTiempo1 = microtime(true); 
echo "\n", '<p>Time in verify file with exec : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>'; 
//Time in verify file with exec : 0.033198118209839 secs. 

$nTestTiempo0 = microtime(true); 
ob_start(); 
var_dump(eval('return true; if(0){?>'.file_get_contents('yourfile.php').'<?php };')); 
$arrMsgError = explode("\n",trim(ob_get_contents())); 
ob_end_clean(); 
$nTestTiempo1 = microtime(true); 
echo "\n", '<p>Time in verify file with eval : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>'; 
//Time in verify file with eval : 0.00030803680419922 secs. 

$nTestTiempo0 = microtime(true); 
@system('php -l yourfile.php',$nCodeError); 
$nTestTiempo1 = microtime(true); 
echo "\n", '<p>Time in verify file with system : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>'; 
//Time in verify file with system : 0.032964944839478 secs. 
+0

+1为一种新颖的方法! (顺便说一句,'microtime'有一个你可能想看的参数:)它会让你的示例代码更加紧凑并且更容易阅读。)尽管如此,为了完成:尽管我们也不允许使用'eval'通过不同的渠道。 – pinkgothic 2011-05-10 21:01:35

+0

OKas!我改变了代码。 – Galled 2011-05-12 15:28:22