>백엔드 개발 >PHP 튜토리얼 >is_writeable 함수 버그 문제

is_writeable 함수 버그 문제

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2016-07-29 09:03:351045검색

[제목] PHP의 is_writeable() 함수에 버그가 있어서 디렉토리/파일이 쓰기 가능한지 여부를 정확하게 판별할 수 없습니다. 디렉토리/파일이 절대 쓰기 가능한지 판별하는 함수를 작성해 주세요.
【레벨】레벨 6
[해결책] 다음은 CodeIgniter의 is_really_writable 함수에 대한 해결 방법입니다. 자세한 내용은 함수 설명을 참조하세요
버그에는 두 가지 측면이 있습니다.
1. Windows에서 파일에 읽기 전용 속성만 있는 경우 is_writeable() 함수가 false를 반환하면 파일이 반드시 쓰기 가능한 것은 아닙니다.
디렉토리라면 해당 디렉토리에 새 파일을 생성하고 파일을 열어서 판단하세요.
파일인 경우 파일을 열어(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 함수 버그 문제를 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.