【问题标题】:Correct PHP file upload permissions正确的 PHP 文件上传权限
【发布时间】: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


    【解决方案1】:

    只是放松和享受。
    在许多共享主机上,这是唯一可能的解决方案。
    还有另一种选择 - 要求用户提供 ftp 通行证并使用 ftp 从 tmp 复制文件,就像 wordpress 一样。但我认为它更不安全。

    【讨论】:

    • 嗨,我并没有真正回答我在原始帖子中更新的问题,如前所述回到 amphetamachine,嗨,感谢您的及时回复,我的字符数有限,所以更新了我的原始帖子,如果你不要介意阅读它并回复它会很棒。我已将 UPDATED 以粗体显示,因此您现在可以看到我在问什么。谢谢 PHPLOVER ,将等待回复,谢谢。
    【解决方案2】:

    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')

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

    【讨论】:

    • 您好,感谢您的及时回复,我的字符数有限,因此更新了我的原始帖子,如果您不介意阅读并回复,那就太好了。我已将 UPDATED 以粗体显示,因此您现在可以看到我在问什么。谢谢 PHPLOVER
    • chown 仅在您以超级用户(即 root)帐户登录时才有效,PHP 永远不应在该帐户下运行; PHP 内部的chown 要么失败,要么无效。
    • 感谢您的回复。我想我会选择简单的选项,例如,当管理员想要重命名/删除通过 ftp 上传的文件时,只会告诉他们必须自己手动重命名/删除文件,然后告诉他们更新db 记录通过编辑网页到新名称,因此 db 记录和文件保持链接。似乎是最简单的解决方案。谢谢:)
    猜你喜欢
    • 2014-10-23
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2010-09-05
    • 2011-02-20
    • 2012-05-26
    • 2016-05-07
    相关资源
    最近更新 更多