【问题标题】:PHP is_readable returns true for non-readable filePHP is_readable 对不可读文件返回 true
【发布时间】:2012-12-22 23:29:36
【问题描述】:

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

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

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

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

在这种情况下,/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"; ?>

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

1

然后我以同一个用户的身份运行 strace。这些是我使用的命令。结果是一个 70KB+ 的文件,所以我不让我完整地发布它,所以它发布在 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

不确定我在寻找什么。请指教。

【问题讨论】:

  • “请记住,PHP 可能会以 Web 服务器运行的用户 ID(通常是“nobody”)访问文件。”
  • 结果也可以被缓存。试试clearstatcache()
  • 什么用户拥有该文件以及您的 Web 服务器以什么用户身份运行?
  • 你能运行这段代码吗,var_dump($fullFile, is_dir($fullFile), is_readable($fullFile));
  • 一个bugreport 已经提交了一个可能与此相关的问题。

标签: php file-permissions getimagesize


【解决方案1】:

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

【讨论】:

  • 帮助我度过难关,谢谢。我用过: >>> if (fileperms(&fullFile) & 0x04 == 0x04) { >> if (is_readable(&fullFile)) {
猜你喜欢
  • 2016-10-15
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
相关资源
最近更新 更多