【问题标题】:Is there an alternative to php readfile() in safe mode server?在安全模式服务器中是否有替代 php readfile() 的方法?
【发布时间】:2011-09-13 19:50:45
【问题描述】:

我在共享主机上托管我的网站,最近将服务器更改为安全模式(甚至没有通知)。 我使用从服务器下载文件的功能,使用 readfile() 函数(我使用 php)。 现在,在安全模式下,此功能不再可用。 是否有替代或解决方法来处理用户能够下载文件的情况?

谢谢

【问题讨论】:

  • 不工作,我已经尝试过了,但 .docx 文件出现空白 Word 屏幕,或者 pdf 文件等出现错误。
  • 您收到什么错误信息?鉴于safe_mode is deprecated,如果他们最近才启用它,您可能想要切换主机。在任何情况下,给你的主人发一封电子邮件,要求放松safe_mode
  • 这无济于事,因为他们声称它可以减少对服务器的黑客攻击,而且它是共享主机,所以我无法说服他们 - 这是他们的新政策,我可以如果我愿意,只需切换主机,但我有大约 20 个客户站点,现在开始移动所有这些站点将是一件令人头疼的事情。我想知道是否有一种解决方法来处理文件下载,关于那个该死的托管,我稍后会考虑该怎么做..
  • 在这种情况下,readfile() 并没有真正受到安全模式的影响。 Docs 说文件和目录必须属于执行脚本的同一个用户,这就是在安全模式中检查的内容。在这种情况下,readfile() 被完全禁用,而是由disable_functions 完成。
  • @Maor,虽然它不能解决问题,但它可能会引导您朝着正确的方向前进。了解问题的原因是解决方案的一部分。

标签: php readfile safe-mode php-safe-mode


【解决方案1】:

正如我在 cmets 中所写,readfile() 通过将其包含在 disable_functions php.ini 指令中而被禁用。它与安全模式无关。尝试检查哪些功能被禁用,看看您是否可以使用任何其他文件系统功能(-s)来执行readfile() 所做的事情。

要查看禁用功能列表,请使用:

var_dump(ini_get('disable_functions'));

你可能会使用:

// for any file
$file = fopen($filename, 'rb');
if ( $file !== false ) {
    fpassthru($file);
    fclose($file);
}

// for any file, if fpassthru() is disabled
$file = fopen($filename, 'rb');
if ( $file !== false ) {
    while ( !feof($file) ) {
        echo fread($file, 4096);
    }
    fclose($file);
}

// for small files;
// this should not be used for large files, as it loads whole file into memory
$data = file_get_contents($filename);
if ( $data !== false ) {
    echo $data;
}

// if and only if everything else fails, there is a *very dirty* alternative;
// this is *dirty* mainly because it "explodes" data into "lines" as if it was
// textual data
$data = file($filename);
if ( $data !== false ) {
    echo implode('', $data);
}

【讨论】:

  • 这些是禁用的函数 - "readfile, system, shell_exec, proc_terminate, proc_nice, proc_open, pclose, popen, passthru, pcntl_fork, pcntl_exec, posix_kill, pcntl_signal, ini_restore, posix_getpwuid, escapeshellarg, escapeshellcmd。我'我会试试你上面的建议
  • 你是国王! fpassthru 似乎工作得很好。非常感谢。我也想投票支持它,但我不能再获得 2 个声誉分数(这里是新用户..)
【解决方案2】:

我假设您正在使用readfile 加载远程文件,正如您所说的“从服务器”。如果正确,您的问题不是安全模式,而是不再允许使用普通 php 文件功能打开 URL(设置 allow_url_fopen 禁用)。

在这种情况下,您可以使用 PHP 的 curl functions 来下载文件。此外,file_get_contents 是一个有效的替代方案。

【讨论】:

  • 嗯,这是我使用的一个小插件,它使用 readfile() 函数将文件从站点(服务器)下载到用户的 PC。直到最近托管公司启用了安全模式,这一切都很好。这是我收到的错误消息 - 警告>:出于安全原因,readfile() 在第 146 行的 /home/full/path/to/my/script.php 中已被禁用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多