如何在 PHP 中限制文件系统访问


How to restrict file system access in PHP?

有人知道让PHP脚本自我限制访问文件系统(fopenfile_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,该用户只能访问所需的文件。 但这是一个操作系统级别的解决方案。