有人知道让PHP脚本自我限制访问文件系统(fopen
,file_get_contents
等)的技巧吗?
除少数选定的文件名(日志文件、对/tmp
的访问和类似名称)外,应阻止此类调用。
这不是安全问题,而是迫使开发团队不直接访问文件系统的一种手段(并检测现有代码中的斑点,这种情况已经存在)。我们希望在这种情况下看到异常(被捕获并报告),因为必须通过其他方式访问此类文件的内容。
我正在考虑为 file://
协议实现我自己的 streamWrapper,但显然没有办法扩展内置的文件包装器类。
选项 #1
您可以使用 php.ini 指令open_basedir来限制应用程序可以访问的目录。这些目录可以用分号分隔,因此您可以只列出希望应用访问的目录,包括/tmp 文件夹。
需要注意的是,这也会影响包含、要求等内容。
选项 #2
您可以使用 rename_function 或 runkit_function_rename 重命名它们,然后使用您自己的逻辑包装重命名的版本。
引用文档:
将orig_name重命名为全局函数表中的new_name。有用 用于临时覆盖内置函数。
例:
rename_function('file_get_contents', 'nouse_file_get_contents');
function file_get_contents($filename, $use_include_path = false, $context, $offset = -1, $maxlen) {
//
// Do some validation here
//
return nouse_file_get_contents($filename, $use_include_path, $context, $offset, $maxlen);
}
选项 #3
您可以为开发人员设置一些编码标准,并编写一些单元测试,这些测试在将内容推送到生产环境之前作为部署的一部分运行。不确定您的发布程序是什么,但这些类型的东西应该在生产之前捕获。
当然,您可以让每个人都以用户身份开发运行PHP,该用户只能访问所需的文件。 但这是一个操作系统级别的解决方案。