开发者社区> 问答> 正文

HP的is_writeable()函数存在Bug,无法准确判断一个目录/文件是否可写

HP的is_writeable()函数存在Bug,无法准确判断一个目录/文件是否可写,请写一个函数来判断目录/文件是否绝对可写

展开
收起
珍宝珠 2019-11-18 15:02:04 1147 0
1 条回答
写回答
取消 提交回答
  • 其中bug存在两个方面,

    1、在windowns中,当文件只有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不一定是可写的。

    如果是目录,在目录中新建文件并通过打开文件来判断;

    如果是文件,可以通过打开文件(fopen),来测试文件是否可写。

    2、在Unix中,当php配置文件中开启safe_mode时(safe_mode=on),is_writeable()同样不可用。

    读取配置文件是否safe_mode是否开启。

    /**
    * Tests for file writability
    *
    * is_writable() returns TRUE on Windows servers when you really can't write to
    * the file, based on the read-only attribute. is_writable() is also unreliable
    * on Unix servers if safe_mode is on.
    *
    * @access   private
    * @return   void
    */if ( ! function_exists('is_really_writable'))
    {
        function is_really_writable($file)
        {
        // If we're on a Unix server with safe_mode off we call is_writable
        if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
        {
            return is_writable($file);
        }
     
        // For windows servers and safe_mode "on" installations we'll actually
        // write a file then read it. Bah...
        if (is_dir($file))
        {
            $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
     
            if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
            {
                return FALSE;
            }
     
            fclose($fp);
            @chmod($file, DIR_WRITE_MODE);
            @unlink($file);
            return TRUE;
        } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
            return FALSE;
        }
     
        fclose($fp);
        return TRUE;
        }
    }
    
    2019-11-18 15:02:52
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Flash Player最新安全特性分析 及绕过思路 立即下载
Flash Player最新安全特性分析及绕过思路 立即下载
低代码开发师(初级)实战教程 立即下载