인터넷정보

파일네임 금지

알 수 없는 사용자 2007. 10. 16. 16:25

<?
# Auth : shkim
# filename :
# Email : isunnyk@empal.com, idxzone@naver.com
# Start Date : 2004.03.16.Tues
# Last Date :
# Description : filename


$ff = '신촌하하__1234abcd_+=|!@#$%^&*().gif';
$t = file_allowed($ff);
echo '$ff==' . $ff. '<br>';
echo '$t='. $t. '<p>';

$ff = '가   나{파}[학].--ㄴㅍㅎ_11_ㄱㄴㅍㅎ_99_1290_abyzABYZ_+=|!@#$%^&*().gif';
#$ff = 0;
$t = file_allowed($ff);
echo '$ff==' . $ff. '<br>';
echo '$t='. $t. '<p>';
echo file_nameDeny_hanGul($ff);


    function file_allowed($given_filename){
        //우선, 파일명에 부적합한것들 없애기
        $str = $given_filename;


        $b = array();

        $a = array( "/\*/", "/\?/",  "/\//", "/\|/");  //반드시 역슬래쉬
        $str = preg_replace($a, $b, $str);


        //$a2 = array('/"/', "/'/", "/ /", "/:/", "/;/", "/>/", "/</"); //역슬래쉬는 선택
        $a2 = array('/\"/', "/\'/", "/ /", "/\:/", "/\;/", "/\>/", "/\</"); //역슬래쉬는 선택
        $str = preg_replace($a2, $b, $str);


        //추가적으로... `~  !@#$%^&
        $c4 = array("/`/", "/~/", "/!/", "/@/", "/#/",  "/%/",  "/&/", "/^/", "/$/");
        $str = preg_replace($c4, $b, $str);


        $c5 = array("/\^/", "/\$/");  // 역슬래쉬 필수적.
        $str = preg_replace($c5, $b, $str);


        //역슬래쉬는 어케 제거하나??
        //  $ \ 를 어케 하나.


        //appended....2004.03.16.
        #$str = eregi_replace('$', '',  $str); #wrong
        #$str = eregi_replace("$", '',  $str);    #wrong
        $str = eregi_replace('\$', '',  $str);     #success
        #$str = eregi_replace("\$", '',  $str);    ## wrong


        return $str;
    }



    function file_nameDeny_hanGul($filename){
        //파일명 허용... 영문 숫자  [.], [_()-]  , []{},

        $newFileName = '';

        $l = strlen($filename);


        for( $i=0 ; $i<$l; $i++){
            $c_one = substr($filename, $i, 1);
            $d_ord = ord($c_one);
            #echo $i. '::       '. $c_one. ' == '. $d_ord.  "\t<br>\n";


            if( $d_ord >=48 && $d_ord <= 57 ){ //0~9
                $ok_name = true;
            }else if( $d_ord>=97 && $d_ord<=122 ){ //a~z
                $ok_name = true;
            }else if( $d_ord>=65 && $d_ord<=90 ){    //A~Z
                $ok_name = true;
            }else if(  $d_ord == 46 ){    //.
                $ok_name = true;
            }else if( $d_ord == 95 || $d_ord == 45 || $d_ord == 40 || $d_ord == 41 ){ //_ -  ( )
                $ok_name = true;
            }else if( $d_ord == 123 ||  $d_ord == 125 ||  $d_ord == 91 ||  $d_ord == 93 ){    //{} []
                //$ok_name = true;
            }else{
                $ok_name = false;
            }


            if( $ok_name ==  true ){
                $newFileName = $newFileName . $c_one;
            }
        }


        //파일명이 .으로 시작한다면, 앞에 뭔가 하나를 덧붙인다. 왜냐면, 숨김파일이니까..
        if( $newFileName ){
            if( eregi('^[.]', $newFileName) ){
                $f_head = date('Ymd');
                $newFileName = $f_head . $newFileName;
            }
        }


        #echo '<hr>$newFileName=' . $newFileName;

        return $newFileName;
    }

?>

반응형