.htaccess和linux权限

我有一些我试图保护的inheritance的PHP代码。 但是,从file upload目录中删除执行权限会引发权限错误。 这是一个快速简要说明:

apache指向/ root / www /(只有系统上的用户是root)

图片上传通过/ root / www / admin / files中的符号链接保存到/文件(我不知道为什么文件保存到/)

权限:

drwxrwxrwx 8 root root 4096 2011-04-06 16:51 root (root home directory) drwxr-xr-x 8 www-data www-data 4096 2011-04-01 19:34 www (folder in /root/) lrwxrwxrwx 1 root root 21 2011-03-04 20:32 files -> /files/ (symlink) drw------- 4 www-data www-data 61440 2011-04-06 16:12 files (folder in root directory) -rwxrwx--- 1 www-data www-data 81 2011-04-06 15:56 .htaccess (file in /files/) 

Apache错误日志摘录:

 [Wed Apr 06 16:58:24 2011] [crit] [client 1.2.3.4] (13)Permission denied: /root/www/admin/files/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://example.com 

我想将/ files /上的权限从700更改为600.我不知道为什么.htaccess只有在设置执行权限时才可读。

我怀疑你在这里的困惑是源于对Unix类文件许可的常见误解,特别是:在目录上,“执行”并不意味着“执行”。

我怀疑你正试图确保上传到上传目录的文件不能被执行,是正确的? 这是很好的常识。 然而,你的方法是有缺陷的:在一个目录中,“执行”位并不意味着“允许在这里执行文件”,而是“允许用户遍历这个目录”。 换句话说,删除用户/组/世界的目录上的执行位将会删除相关用户访问其中的任何文件或目录的能力 – 正是Apache现在抱怨它无法做到的事情。

您需要上传目录保持“可执行”。 你需要在那里有一个umask来确保上传的文件不可执行。 (其实,即使这不是必须的,因为默认文件不能在* nix上执行)。

由于.htaccess位于/文件内,如果当前用户没有对/文件执行权限,则无法访问该文件。 以普通用户身份尝试一下:创build一个新目录,在其中放置一个文件,然后删除该目录的执行位。 你不应该能够到达文件里面。

想要删除特定执行位的原理是什么? 我看不出有什么安全优势,但是让我知道我是否错过了一些东西。

虽然你的主要问题已经解决了,但是如果不允许上传的文件被执行,另一个可能的解决scheme是使用noexec挂载/文件。 这将需要一个新的分区。