如何取消注册特定的“已注册的PHP Streams”?

时间:2013-02-21 08:49:27

标签: php security

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

注册的PHP Streams: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?

1 个答案:

答案 0 :(得分:2)

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

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

事实证明safe_modeopen_basedir之类的内容并非实际上保护任何内容。原因有两个:

  1. 黑名单(这是safe_mode)不起作用。这已经被一遍又一遍地证明。

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

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

    回答原始问题

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

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