【发布时间】:2011-04-08 05:17:17
【问题描述】:
我开发了一个下载/上传管理器脚本。
当我通过 POST 方法上传文件时,它存储在一个名为 files 的文件夹中,该文件夹位于另一个名为 download-manager 的文件夹中。
现在,当我通过 POST 方法上传时,似乎 0666 CHMOD 在我想重命名、删除文件时工作,但下载管理器文件夹和文件夹需要是 0777 CHMOD 才能工作。现在有人可以告诉我这是否危险吗?
1) 我在 .htaccess 中被拒绝,所以没有人可以通过浏览器访问文件目录
2) 上传脚本受用户名和密码保护,使用该脚本的人显然会更改,因此基本上只有管理员可以上传、重命名、编辑、删除文件和 MySQL 数据库中的记录。
上传文件时,会向数据库中添加一条记录,其中包含文件类型、文件名、文件大小等信息,然后将唯一 ID(由 MySQL 自动递增)附加到获取文件的 process.php 文件中从未显示的目录和 mime 类型等,process.php 基本上会检查记录和文件是否存在,如果存在则强制下载该文件。
基本上下载 URL 是这样的:www.mydomain.com/process.php?file=57,进行检查以确保 id 存在于数据库中,并且存在一个文件名存储在具有该 ID 的数据库。
现在,当使用 POST 方法通过表单上传文件时,这一切都可以正常工作,但我还添加了手动上传,因此对于想要上传大于其网络主机允许的文件大小的文件的人,他们可以简单地通过以下方式上传文件例如 FTP 程序,然后只需通过管理区域中的表单手动添加文件名和文件详细信息,以将记录与文件链接。那么问题是权限问题,因为如果文件是通过 FTP 上传的,或者他们通过 php 脚本上传文件的任何方式无法重命名,如果将来需要,请删除该文件,因为 php 脚本没有正确的权限。所以从我收集的信息来看,唯一的选择是告诉使用脚本的人将文件 chmod 更改为 0777 以使其工作,我认为这将使它工作?
但是我遇到了 0777 也可以执行的问题。该脚本允许任何文件类型的上传,因为它是一个下载/上传管理器脚本,但同时我对所有这些权限有点困惑,我实际上应该做什么。由于 php 受主机设置的最大上传大小的限制,我想添加手动上传,以便用户可以通过另一种方法上传文件并将文件分配给数据库记录,但如前所述,我在想要重命名时遇到问题,删除通过php脚本文件。
我已开发脚本来检测此类问题并通知用户等,但我想尝试让此脚本完成所有或几乎所有工作,而无需在手册中说明管理员必须当他们想要脚本重命名时,将文件chmod到0777,删除文件,虽然我不知道是否只是将文件chmoding到0777实际上会允许php脚本重命名,删除它等等,但安全性也是如此担心。
更新
好的,谢谢,在上传时修改文件之前先修改文件?
我是否只在文件周围使用 chown() 而没有其他任何东西,这将使它归服务器进程所有并使其私有?我看你有
chown apache:apache '/path/to/files' ;
我需要添加 apache:apache 位吗?
我确实认为这是更简单的解决方案,如果管理员手动上传,告诉他们将来如果需要,他们将不得不手动重命名/删除文件,因为脚本没有正确的权限这样做,这将使它成为一个简单的解决方案,因为手动上传脚本可以重命名 db 记录以使其链接到文件。这样就不用担心文件权限问题了。
只需通过 ftp 手动将用户更改文件,例如从 myfile.zip 更改为 somefile.zip,然后他们编辑该文件的数据库记录并将文件名从旧文件名 myfile.zip 更改为 somefile.zip,这样一切都是仍然链接,但不用担心权限问题。正如我也一直在阅读的那样, chown() 并不总是有效或无论出于何种原因都不能依赖。
【问题讨论】:
标签: mysql file file-upload ftp file-permissions