纠正PHP文件上载权限

时间:2010-09-04 12:21:00

标签: mysql file file-upload ftp file-permissions

我开发了一个下载/上传管理器脚本。

当我通过POST方法上传文件时,它存储在名为 files 的文件夹中,files文件夹位于另一个名为download-manager的文件夹中。

现在看来当我通过POST方法上传时0666 CHMOD工作时我想重命名,删除文件但是download-manager文件夹和files文件夹需要为0777 CHMOD才能工作。现在有人可以告诉我这是否危险?

1)我在.htaccess中全部拒绝,所以没人能通过浏览器访问文件目录

2)上传脚本受用户名和密码的保护,使用该脚本的人显然会发生变化,因此只有管理员才能基本上传,重命名,编辑,删除MySQL数据库中的文件和记录。

当上传文件时,会将记录添加到数据库中,其中包含文件类型,文件名,文件大小等信息,然后将唯一ID(由MySQL自动递增)附加到获取文件的process.php文件中从目录和mime类型等未显示,process.php基本上进行检查以查看记录和文件是否存在,如果是,则强制下载该文件。

基本上下载URL如下:wwww.mydomain.com/process.php?file = 57,检查是为了显然确保数据库中存在id,并且存在文件名存储在具有该id的数据库。

现在所有这一切在使用POST方法通过表单上传文件时都能正常工作,但我还添加了手动上传,因此对于想要上传大于其webhost允许的文件大小的人来说,只需上传文件即可例如,一个FTP程序,然后通过管理区域中的表单手动添加文件名和文件详细信息,以将记录与文件链接起来。问题是一个权限问题,因为如果文件是通过FTP上传的,或者他们通过php脚本上传文件的任何方式无法重命名,将来如果需要删除该文件,因为php脚本没有正确的权限。所以从我收集的内容来看,唯一的选择是告诉使用脚本的人将文件chmod更改为0777以使其工作,我认为这会使它工作吗?

但是我的问题是0777也是可执行的。该脚本允许任何文件类型上传,因为它是一个下载/上传管理器脚本,但同时我稍微混淆了所有这些权限,以及我应该做的事情。由于php受主机设置的最大上传大小限制,我想添加手动上传,以便用户可以通过其他方法上传文件并将文件分配给数据库记录但是如上所述我想要重命名,删除时出现问题该文件通过PHP脚本。

我已经开发了脚本来检测这些问题并通知用户等但是我想尝试让这个脚本完成所有的工作或几乎所有的工作,而不必在手册中说明管理员必须当他们希望脚本重命名,删除文件时chmod文件到0777,虽然我不知道是否只是将文件chmodding到0777实际上会允许php脚本重命名,删除它等等但是安全性则是一个问题。

已更新

好的,谢谢你在上传文件之前将文件chown了吗?

我只是在文件周围使用chown()而没有其他任何东西,这将使它由服务器进程拥有并使其成为私有?因为我看到你了

chown apache:apache '/path/to/files' ;

我是否需要添加apache:apache bit?

我确实认为这是一个更简单的解决方案,如果管理员进行手动上传,告诉他们如果将来需要他们必须手动重命名/删除文件,因为脚本没有这样做的正确权限,这将使这成为一个简单的解决方案,因为manualupload脚本可以只重命名db记录以使其链接到文件。这样就不用担心文件权限问题了。

只需通过ftp手动将用户更改文件从myfile.zip手动放到somefile.zip然后他们编辑该文件的db记录,并从旧文件名myfile.zip将文件名更改为somefile.zip,这样一切都是关联仍然但不担心许可问题。正如我一直在阅读的那样,chown()并不总是有效或无法依赖。

2 个答案:

答案 0 :(得分:1)

  

1)我在.htaccess中全部拒绝,所以没人能通过浏览器访问文件目录

将文件存储在一个单独的文件夹中,远离PHP文件的目录结构。

就目录的权限而言,有三种方法可以设置文件夹的权限:

  1. 将其设为世界可写(chmod 0777 '/path/to/files/'

    建议不要这样做,因为它会对非专用服务器产生重大安全隐患;任何拥有帐户或可以告诉服务器上的进程写入/删除该文件夹的人都可以更改其内容。

  2. 将其设为临时(chmod 1777 '/path/to/files/'

    这也带来了安全问题,但不如选项1那样,原因如下:用户无法修改目录 - 只能修改他们拥有的文件。

  3. 使其归服务器进程所有,并将其设为私有(chown apache:apache '/path/to/files' ; chmod 0700 '/path/to/files'

    这可以说是最好的解决方案。

答案 1 :(得分:0)

放松和放松享受。
在许多共享主机上,无论如何它是唯一可行的解​​决方案 还有另一种选择 - 向用户询问ftp pass并使用ftp从tmp复制文件,就像wordpress一样。但我认为它更不安全。