Zend Framework的PHP安全模式限制

时间:2011-08-19 16:14:15

标签: php zend-framework safe-mode

我想将Zend Framework项目上传到“safe_mode”所在的网站,我无法控制它。

我从PHP收到以下警告消息:

  

PHP警告:realpath()[function.realpath]:安全模式限制生效。 uid / gid为954/815的脚本不允许在第185行的/blabla/phpapps/include/library/Zend/Cache/Backend.php中访问uid / gid 0/0所拥有的/ tmp

我不使用Zend_Cache,为什么safe_mode对我的脚本感到生气?

如何在项目中设置默认/ tmp目录以避免此错误?

THX

1 个答案:

答案 0 :(得分:1)

  

我不使用Zend_Cache,为什么safe_mode对我的脚本感到生气?

因为Zend_Cache也在内部使用来自其他一些ZF组件(Zend_DbZend_Translate等)。

  

如何在项目中设置默认/ tmp目录以避免此错误?

你有两个选择:

  1. 跟踪哪个组件使用Zend_Cache并将其配置为使用自定义缓存实例,其中定义的后端不使用/tmp存储(检查Apc or Memcached
  2. 查看第185行附近的Zend_Cache_Backend实施并更新您的代码以避免该错误。
  3. 我会选择选项1以获得更好的性能(apc或memcached是比文件系统更快的存储),并且可以更好地控制项目中发生的事情。但是,这可能需要对项目进行多次更改,因为可能需要配置多个组件。

    如果您选择选项2,您可以通过一次更改来破解整个事情,它将反映使用默认缓存实例的所有组件,但是因为您的代码被黑客攻击以使用内部实现ZF的未来版本可能会破坏你的代码。也就是说,您可以通过使用ZF检查的其中一个键定义ENVSERVER变量来实现此目的。这些是发出警告之前的行:

    public function getTmpDir()
    {
        $tmpdir = array();
        foreach (array($_ENV, $_SERVER) as $tab) {
            foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $key) {
                if (isset($tab[$key])) {
                    if (($key == 'windir') or ($key == 'SystemRoot')) {
                        $dir = realpath($tab[$key] . '\\temp');
                    } else {
                        $dir = realpath($tab[$key]);
                    }
                    if ($this->_isGoodTmpDir($dir)) {
                        return $dir;
                    }
                }
            }
        }
    

    因此,引导程序中的这样的代码将解决您的问题:

    // I assume you're using the default ZF project structure
    // and that your-root/data/tmp is both writable and readable for
    // the webserver user, because the _isGoodTmpDir method will check for that
    $_SERVER['TMP'] = APPLICATION_PATH . '/../data/tmp';