对于不可读的文件,PHP is_readable返回true

Den*_*is 5 php file-permissions getimagesize

我有一个图像处理器PHP脚本,它包含以下代码:

        if (!is_dir($fullFile)) {
            if (is_readable($fullFile)) {
                $im = getimagesize($fullFile); // Will be FALSE if not an image
Run Code Online (Sandbox Code Playgroud)

在某些情况下,脚本将在getimagesize失败,并出现以下错误:

getimagesize(/path/to/file.jpg) [function.getimagesize]: failed to open stream: Permission denied at www.yada.yada/page.php
Run Code Online (Sandbox Code Playgroud)

在这种情况下,/ path/to/file.jpg的权限肯定是禁止的(400),所以我期望is_readable测试阻止我达到这一点.除了以不同方式设置权限之外,我还可以做些什么来解决这个问题?为什么似乎is_readable的结果不正确?is_readable是否可能与文件所有者的EUID一起运行,而getimagesize不是?这是对我有意义的唯一解释,但即使这些知识也没有帮助解决.

由@ hek2mgl提示我创建了这个名为readable.php的超复杂脚本:

<?php echo is_readable("/stora2/Pics/2009/2009-07-26/DSC00532.JPG") . "\n\n"; ?>
Run Code Online (Sandbox Code Playgroud)

然后我将用户切换到Web服务器用户(实际上是此服务器上的www-data)并运行它.结果是

1
Run Code Online (Sandbox Code Playgroud)

然后我作为同一个用户运行strace.这些是我使用的命令.结果是70KB +文件,SO不会让我完整发布,所以它发布在http://pastebin.com/mFqiSBiz

dennis@luke:~$ sudo su - www-data

$ ls -l "/stora2/Pics/2009/2009-07-26/DSC00532.JPG"
-rw------- 1 dennis dennis 524288 2012-02-11 08:18 /stora2/Pics/2009/2009-07-26/DSC00532.JPG

$ file "/stora2/Pics/2009/2009-07-26/DSC00532.JPG"
/stora2/Pics/2009/2009-07-26/DSC00532.JPG: writable, regular file, no read permission

$ php /home/dennis/readable.php
1

$ strace php /home/dennis/readable.php > /tmp/strace.out 2>&1
Run Code Online (Sandbox Code Playgroud)

不知道我在找什么.请指教.

Jor*_*dir 2

根据您运行的 php 版本,这可能是一个错误,正如 hek2mgl 在评论中所说。如果您想解决此问题,可以使用fileperms添加基于文件权限的逻辑