2013-02-21 98 views
2

为了安全起见,我已禁用了php.ini中的函数glob并且它按预期工作,但我也注意到phpinfo显示以下信息:如何取消注册特定的“注册PHP流”?

注册的PHP流:php,file,glob,data,http ,FTP,ZIP,compress.zlib,药业

所以,如果我采取以下来源:

$it = new DirectoryIterator("glob://C:\wamp\www\*"); 
foreach($it as $f) {  
    printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024); 
} 

它仍然会返回指定目录的内容。

如何全局注销PHP流如glob?

+1

这是为了什么“安全原因”?我没有看到任何 – KingCrunch 2013-02-21 08:53:02

+0

安全在硬化的意义上。如果应用程序不需要它,则只是防止攻击者获得目录内容信息的另一步骤,例如,他们能够上传任意文件。当然,如果有人能够上传任意文件,还有很多其他的含义,但这不是问题。 – Steven 2013-02-21 09:17:22

回答

2

简短的答案是:甚至不打扰尝试。

PHP是一种足够完整的语言,如果有人要写脏的易受攻击的代码,他们可以通过任何你设置的块来完成。禁用这样的函数只会让应用程序开发人员的生活变得糟糕。

它已经证明,之类的东西safe_modeopen_basedir实际上安全的东西。原因是双重的:

  1. 黑名单(这是什么safe_mode是)不起作用。这已经被反复证明。

  2. 你不能在不安全的基地上安全。已经太晚了。 PHP本身已经有足够的访问权限,即使你禁用了所有有趣的部分,人们仍然可以绕过它。

相反,保护自下而上。安装一个chroot监狱,并在其中运行PHP。使用适当的权限。查看您在服务器上运行的代码。监视服务器是否存在入侵。没有什么花哨。只是良好的老式SYS-管理工作...

要回答你原来的问题

,你可以注销流包装是通过stream_wrapper_unregister()自己做的唯一途径。你可以使用一个自动prepend文件为你做(在每个脚本之前运行该代码)。

但意识到在PHP中实现glob是微不足道的。所以真的没有太多的意义,在禁用它...