目前,我无法将文件上传到 Web 文件夹。无论我做什么,即使将文件夹权限设置为 0777,我也无法将文件上传到该文件夹。出于好奇,我搜索了将文件权限设置为 0777 时相关的风险。
找到一个问题 这里,但并没有找到我所寻找的答案。
我完全不了解这个。有什么风险?
答案1
在(我这里谈论的是文件夹,而不是文件)上设置 0777folder
并不像某些人所说的那样涉及任何执行安全风险。
Execute is needed on a directory to access the inode information of the files within. You need this to search a directory to read the inodes of the files within. For this reason the execute permission on a directory is often called search permission instead.
看http://content.hccfl.edu/pollock/aunix1/filepermissions.htm
风险在于:
- 任何人都可以读取此文件夹中的文件(前提是该文件本身具有
r
尝试读取它的用户/组的权限,或者others
) - 任何人都可以在此文件夹中创建文件(并可选择执行它们,但仅限于由该特定用户创建的文件)
- 任何人都可以删除此文件夹中其他人拥有的文件(无论他们的所有者/权限如何,您的文件都不安全)
如果您想要保护某些文件的安全,您必须创建另一个具有“正常”权限的文件夹(仅您有 rw 权限,或者您和您的组有 rw 权限)并将文件放入其中。
另一方面,没有人可以将不可执行文件转变为可执行文件(如果您不拥有该文件,则不允许使用 chmod)。
不存在什么风险?
有些人认为 0777 会被文件夹内的每个文件继承。这是错误的。由于文件的父文件夹是 0777,所以如果没有权限,则无法编辑文件。w
如果没有权限,则无法读取文件r
。
如何确保其安全?
如果您有权访问某些 shell,或者您的 FTP 客户端允许您更改文件的所有者,并且您知道需要哪个所有者,那么您可以创建文件夹并将其所有者设置为 apache 进程(通常是或nobody
),然后只需设置 0700 权限。问题是,其他用户(例如使用 FTP 客户端浏览时的用户)将无法读取 PHP 稍后创建的文件,但这不一定是个问题。daemon
apache
好的,但是文件怎么办?
我并不是在谈论files
执行所固有的风险,因为没有理由强制执行x
一个不应该执行的文件的权限。
如果某些 Web 应用程序需要在现有文件中写入内容,则将其设置为 0666(如果所有者是 apache 用户,则设置为 0600)就足够了。
答案2
有权访问该文件夹的每个人(即x
路径中每个文件夹的权限)都可以读取、修改和执行该文件。
bash
如果它实际上是可执行的,那么恶意用户添加恶意代码,然后等待您执行它以使您执行一些邪恶代码(例如创建设置为 setuid 并可由攻击者执行的副本)的风险很高。
如果您使用的是共享主机,请检查 0770 是否不够用 - 如果您的 FTP 用户与 Web 服务器位于同一组,则足够了。在这种情况下,上述风险通常不适用,因为您永远不会执行上传目标文件夹中的内容,并且 PHP 必须open_basedir
限制其他用户访问您的文件。但是,如果主机还支持 CGI 脚本(例如使用 Perl),则可以轻松规避。
答案3
我可能没有回答你关于风险的问题,但我可以猜到你为什么不能写。
父文件夹可能没有该用户的写权限......
以递归方式使用父文件夹中的某些内容,chmod ugo+w whateverfile
直到可以在其中创建文件:)
答案4
假设您已经排除了一些基本的 PHP 安全设置(open_basedir 限制等) - 调试和error_reporting(E_ALL);
(确保记录错误而不是在生产系统上显示它们)对于检查这一点非常有用:p。
如果您将文件夹权限设置为 777(全球可写),而某个进程仍然无法写入该文件夹,那么可能正在运行 MAC 实现来阻止此类事情发生(如果您使用的是 Linux,SELinux 或 AppArmor 可能是候选者)。如果是这种情况,那么更改它们实施的策略将有助于解决此问题。将文件夹设置为全球可写可能是一个安全问题(尤其是当相关文件夹暴露给外界时),而且也很可能可以避免。