首页 >后端开发 >php教程 >is_writeable函数bug问题

is_writeable函数bug问题

WBOY
WBOY原创
2016-07-29 09:03:351024浏览

【题目】PHP的is_writeable()函数存在Bug,无法准确判断一个目录/文件是否可写,请写一个函数来判断目录/文件是否绝对可写。
【级别】六级
【解决】 下面是CodeIgniter 中的is_really_writable函数解决方案,详见函数注释
其中bug存在两个方面,
1、在windowns中,当文件只有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不一定是可写的。
如果是目录,在目录中新建文件并通过打开文件来判断;
如果是文件,可以通过打开文件(fopen),来测试文件是否可写。
2、在Unix中,当php配置文件中开启safe_mode时(safe_mode=on),is_writeable()同样不可用。
读取配置文件是否safe_mode是否开启。

<code><span>/**
 * 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.
 *
 *<span> @access</span>  private
 *<span> @return</span>  void
 */</span><span>if</span> ( ! function_exists(<span>'is_really_writable'</span>))
{
    <span><span>function</span><span>is_really_writable</span><span>(<span>$file</span>)</span>
    {</span><span>// If we're on a Unix server with safe_mode off we call is_writable</span><span>if</span> (DIRECTORY_SEPARATOR == <span>'/'</span><span>AND</span> @ini_get(<span>"safe_mode"</span>) == <span>FALSE</span>)
        {
            <span>return</span> is_writable(<span>$file</span>);
        }

        <span>// For windows servers and safe_mode "on" installations we'll actually</span><span>// write a file then read it.  Bah...</span><span>if</span> (is_dir(<span>$file</span>))
        {
            <span>$file</span> = rtrim(<span>$file</span>, <span>'/'</span>).<span>'/'</span>.md5(mt_rand(<span>1</span>,<span>100</span>).mt_rand(<span>1</span>,<span>100</span>));

            <span>if</span> ((<span>$fp</span> = @fopen(<span>$file</span>, FOPEN_WRITE_CREATE)) === <span>FALSE</span>)
            {
                <span>return</span><span>FALSE</span>;
            }

            fclose(<span>$fp</span>);
            @chmod(<span>$file</span>, DIR_WRITE_MODE);
            @unlink(<span>$file</span>);
            <span>return</span><span>TRUE</span>;
        }
        <span>elseif</span> ( ! is_file(<span>$file</span>) <span>OR</span> (<span>$fp</span> = @fopen(<span>$file</span>, FOPEN_WRITE_CREATE)) === <span>FALSE</span>)
        {
            <span>return</span><span>FALSE</span>;
        }

        fclose(<span>$fp</span>);
        <span>return</span><span>TRUE</span>;
    }
}</code>
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了is_writeable函数bug问题,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn