PHP文件系统操作安全问题


PHP Filesystem manipulation security concerns

我正在寻找通过PHP应用程序安全地进行文件系统操作的最佳实践、模块等。类似CMS的应用程序不会使用数据库,而是将标记文件放在文件夹中,并在显示时进行处理。因此,会有很多移动文件、重命名文件、写入文件等。

我希望找到一些库(例如,相当于ORM),它们将有助于管理此类操作、输入清理和移动文件。等等,而不是从头开始。如果没有这样的可用性,我希望列出最佳实践等。

到目前为止,我只从PHP.net找到了指导。

更多信息:该计划是建立一个基于网络的最终用户界面,它位于Stacey之上。我会有一个带有最终用户界面的测试环境,当更改准备就绪时,它们就会同步到生产环境。这是一个非基于数据库的系统。从开发人员的角度来看,Stacey很方便管理和使用,但用户不想直接使用markdown和移动文件等。

另外:请将答案限制在PHP问题上;服务器的事情,比如记录或锁定服务器,将取决于用户的个人环境和需求。从开发的角度来看,我想集中精力保护我的分布式代码。

我不知道有什么特定的库可以做到这一点——PHP中的文件系统支持非常广泛,所以我不知道为什么它们是必要的。你最好从一个现有的CMS开始,然后修改它来做你想做的事情——但我知道这可能是不可能的。这听起来也像是应该使用数据库的事情,但我想你已经知道了。

我不能声称知道确切的最佳实践,这是更一般的建议。

首先,您的web服务器——因此您的PHP脚本——将作为特定用户运行。这取决于您的配置、特定的服务器以及底层操作系统。理想情况下,您希望确保该用户只能访问您用作存储的文件系统区域。拒绝对其他地方的所有访问,除了对真正需要的地方(脚本等)的读取访问和对存储区域的读写访问。具体的方法取决于您的系统。

这是你的最后一道防线,不要依赖它,它是一个安全网。

目前尚不清楚是什么原因导致文件被重命名、移动和更改,但可以肯定的是,这是来自用户输入的。因此,你需要确保你清除了所有用户输入,如果他们的页面名称变成了你想要的文件名,你不想让一些人输入../../index.php作为页面名称,并破坏你的主网站。

总是假设最坏的情况:一个用户非常了解你的系统内部,并打算造成最大的损害。不要依赖"默默无闻的安全"或"没有人会那样做"。

我会做(以前也做过)两件事。首先,将所有文件系统函数封装到一个类中,该类提供与方法相同的函数。这个类的工作是检查是否允许发生任何事情,这意味着它可能必须读取路径和文件名,并确定更改的位置。

其次,当用户输入第一次到达时,清除所有可能是恶意的。根据您的输入,您可能需要考虑使用escapeshellarg或URL编码,或其他方式

您还提到文件是在运行时处理的,如果允许用户编写脚本(或者更糟糕的是,执行PHP),那么您会遇到更多问题,可能会遇到根本问题。但你的问题并不清楚。

希望能有所帮助。