2

出于安全原因,我在 php.ini 中禁用了 glob 函数,它按预期工作,但我也注意到 phpinfo 显示以下信息:

已注册的 PHP 流:php、file、glob、data、http、ftp、zip、compress.zlib、phar

因此,如果我采用以下来源:

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

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

如何全局注销 PHP 流,例如 glob?

4

1 回答 1

2

简短的回答是:甚至不要费心去尝试。

PHP 是一种足够完整的语言,如果有人要编写易受攻击的脏代码,他们可以通过您设置的任何块来完成。像这样禁用功能的唯一事情就是让应用程序开发人员的生活陷入困境。

事实证明,类似的东西实际上safe_modeopen_basedir不能保护任何东西。原因有两个:

  1. 黑名单(这就是安全模式)不起作用。这已经被一遍又一遍地证明了。

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

相反,从下往上保护。安装一个chroot监狱,并在里面运行 PHP。使用适当的权限。审查您在服务器上运行的代码。监视服务器的入侵。没有什么花哨。只是好的老式系统管理员工作......

回答你原来的问题

取消注册流包装器的唯一方法是自己通过stream_wrapper_unregister(). 您可以使用自动前置文件为您执行此操作(在每个脚本之前运行该代码)。

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

于 2013-06-21T00:34:13.240 回答