ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • php 함수 모음 이것저것
    프로그램/Php 2024. 1. 23. 12:02
    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

    ########################################################

    equals()메서드가 있지요.  문자열을 비교할때 쓰는 

    ########################################################
    그런데 얼핏생각하면

    String str1;
    String str2; 

    가 있다고 했을때 두 변수에 저장되 있는 문자가 같은지를 볼려면

    if(str1 == str2)< /FONT > 

    요렇게 하면 될 것 같은데 자꾸 엉뚱한 값이 나오더라고요.

    if(str1.equals(str2)) 하면 해결되는데요.


    문자열 변수, 즉 String은 기본자료형 변수가 아니라 참조자료형 변수입니다.
    즉 이말은 int나 char 등과 같은 일반변수가 아니라 객체라는 뜻이죠.

    자바에서는 기본자료형 변수들을 제외하곤 모든것이 객체로 표현되는데요..
    이것은 C언어에서의 포인터 개념이라고 생각하시면 됩니다. 데이타의 실체가
    아니라 주소값으로 표현되는 것이죠.

    따라서 기본자료형 변수의 데이타를 비교하는 연산자 '==' 으로는 정확한 비교가
    이루어 지지 않을 수 있습니다. 데이타의 실체가 아니고 객체이기 때문이죠.
    그러므로 객체를 비교하는 equals()메소드를 사용해야 해당 객체가 참조하는
    데이타의 실체에 대한 정확한 비교가 이루어 질 수 있습니다.

    ########################################################

    include(), require(), require_once() 차이점 | PHP 2004/06/24 18:32  

     ########################################################

     
    * include()
      - 이 문장을 만날 때 마다 매번 재평가되어 재실행된다
      - include 문장을 만날때마다 지정한 파일을 포함한다.
      - loop나 if 문 등에서 사용하여 필요한 경우에만 파일을 포함하도록 할 수 있다.
      - 해당 구문에 도달해야만 읽어 온다

    * require()
      - C에서 #include와 똑같은 의미로 사용
      - #include 처럼 무조건 파일을 포함
      - loop 구조 안에 두어, 매번 다른 파일을 읽어들일 수 없다는 것을 의미
      - 무조건 파일을 읽어 온다.

    * require_once()
      - 한번만 require한다는뜻
      - 중복된 require를 방지하는 제어문 입니다.
      - 즉 A.php라는 파일에 function A() 라는 사용자 함수가 정의되어 있을때...
        A.php를 여기 저기서 include or require하게되면 중복된 함수 정의라는 에러가 발생합니다.. 
        이것을 막고자 할때 사용합니다..
        require_once() or include_once()를 사용하면 이미 로딩된 파일은 중복해서 읽어 들이지 않습니다.

     

    * Example

    if (조건)
      require(...)

    > 하면 설령 if 문 안으로 들어가든 들어가지 않든 require 하고

    if (조건)
      include(..)

    > 하면 if 문으로 들어가야만 include 합니다.

    단, include()는 특별한 구조이므로, 만약 이것이 조건절 안에 놓여있다면 반드시 {}(statement block)으로 둘러싸야 한다.
     

     ########################################################
     
    게시판 자동등록 방지 팁
     
     ########################################################

    == 쓰기 부분 폼 ==
    $var_4=str_replace(".","_","var_$REMOTE_ADDR");
    $tag_key4=base64_encode(time());
    <input type=Hidden name='$var_4'  value=\"$tag_key4\">

    == 등록 부분 검증 ==
    $var_4=str_replace(".","_","var_$REMOTE_ADDR");
    $i=time()-intval(base64_decode($$var_4));
    if ($i<3||$i>3600) {
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("죄송합니다. 다시 등록하세요..");
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;
    }

    설명:
    쓰기에 IP 부분을 변수로 만들어서 히든으로 넘김니다.
    등록시 IP로 만들어진 변수가 있는가? 
    있다면 넘어온시간변수가 decode 해서 숫자로 되는가?
    숫자면 현재시간과 비교해서 1시간이내의 변수로 만든 숫자인가?

    이방법은 결국 write 의 버튼을 로봇이 직접 access 해서 form 문을 분석해서
    날리지 않는한 단순한 form 변수를 날리는 방식으로는 모든 변수를 직접 만들어서
    날릴수 없으니 자동글쓰기가 불가능하다는 이야기입니다.


     ########################################################
     
    최대한 간략하게 한글 자르는 팁
     
     ########################################################


    $end 값에 마이너스 값을 주시면 값만큼 뒤가 짤립니다.


    function ksubstr($str, $start, $end=1)
    {
      $lenth = strlen($str);
      
      //$str을 $str_a에 한글자씩 저장
      $j=0;
      for($i=0;$i < $lenth;$i++){
        $tmp = substr($str,$i,1);
        if(ord($tmp) > 127){  //2바이트 문자라면
          $str_a[$j] = substr($str,$i,2); //2바이트를 먹고
          ++$i; //i값을 증가시킨다.
        }
        else{ $str_a[$j] = $tmp; }
        ++$j;
      }
      
      //시작에 따른 끝을 설정
      if($end > 0) $end += $start;
      else $end = sizeof($str_a) + $end;
      
      //$str_r에 $str_a[시작] 부터 끝까지 하나씩 붙여서 리턴
      for($i=$start;$i < $end;$i++){
        $str_r .= $str_a[$i];
      }
      
      return $str_r;
    }

    //위 함수 테스트
    $src2="123 한번 써보아요. 잘될까요?";

    echo ksubstr($src2, 0, 8); //결과 : "123 한번 써"

    echo ksubstr($src2, 0, -5); //결과 : "123 한번 써보아요. "

    echo ksubstr($src2, 4, -3); //결과 : "한번 써보아요. 잘될" 



     ########################################################
     
    첨부파일 등록시 신경써야 할것들 
     
     ########################################################



    파일업로드를 할 때 form 에서 사용된 file control 이름이 attach 라고 하고,

    이를 처리하기 위해 $attach, $attach_name, $attach_size, $attach_type 등을 바로 쓰게되면 편법을 써서 서버의 파일을 빼낼 수 있는 위험이 있기 때문에 이를 방지하기 위한 코딩 방법

     

     

    ▶ is_uploaded_file() 함수 사용


    정말 업로드된 파일인지 확인

    사용 예)
    if (!is_uploaded_file($_FILES['attach'])) {
    exit;
    }

     

     


    ▶ 변수 명 지정 방식

     

    파일 이름
    $_FILES['attach']['name']

     

    파일 종류 (예: "image/png")
    $_FILES['attach']['type']

     

    파일 크기
    $_FILES['attach']['size']

     

    임시 디렉토리에 저장된 이름
    $_FILES['attach']['tmp_name']

     

    에러 코드
    $_FILES['attach']['error']

    UPLOAD_ERR_OK (0) - 업로드 성공
    UPLOAD_ERR_INI_SIZE (1) - php.ini 에서 제한한 MAX_FILE_SIZE 초과
    UPLOAD_ERR_FORM_SIZE (2) - HTML 폼에서 제한한 MAX_FILE_SIZE 초과
    UPLOAD_ERR_PARTIAL (3) - 파일의 일부분만 업로드 되었음
    UPLOAD_ERR_NO_FILE (4) - 업로드된 파일이 없음

    상수는 PHP 4.3.0 이상 부터 지원됨, 이전버전은 숫자로 지원

    $_FILES[] 는 PHP 4.0.0 이상 부터 지원됨
    error 속성은 PHP 4.2.0 이상 부터 지원

    $_FILES[] 대신 $HTTP_POST_FILES[] 로 써도 됨



    기존에 name="MAX_FILE_SIZE" 이부분을 생략하시는
    분들이 많은데 꼭선언해주세요 그리고 value="1000" 
    이부분에 값은 파일크기 최대값을 적어주시면 됩니다.
    선언하지 않아도 업로드는 됩니다.

    그리고 최근 서버보안에 민감한 곳에서는 php.ini파일에
    register_globals 값을 Off 해놓습니다. 이럴경우
    일반적으로
    <input type=text name=email size=20>
    의 폼을통해 넘어간 값은 $email 이란 전역변수로 
    사용할 수 있었는데 register_globals = Off 에서는
    명시적으로 한번더 선언해 주어야 합니다. 예로
    $email = $HTTP_POST_VARS["email"] 이런식으로
    잠깐 딴예기를 했는데 다시 파일업로드로 넘어가서
    위 폼으로 넘기면 php는 4개의 변수를 만들어 냅니다.

    $HTTP_POST_FILES['userfile']['name']
    이변수는 파일에 실제 이름입니다. 

    $HTTP_POST_FILES['userfile']['type']
    이변수는 파일의 성질을 나타냅니다.
    mime 타입에 정의된 값을 반환합니다.

    $HTTP_POST_FILES['userfile']['size']
    bytes 크기로 파일크기를 반환하는 변수입니다.

    $HTTP_POST_FILES['userfile']['tmp_name']
    이것은 php가 파일업로드시 서버측에 임시로 저장시킨
    파일의 이름입니다.


    ################################################
    ###   EXTRACT()
    ################################################




    음.. 먼저 PHP 버전이 어떻게 되시는지모르겠네여..

     

    PHP3 에서는 이전의 HTML 화일의 폼에서 넘어온값을 바로 이용할 수 있었지만

     

    PHP4 부터는 $_GET['sex'] 또는 $_POST['sex'] 와 같은 형식으로 가져와야 합니다.

     

    보안때문에 입력받은 값들이 배열로 넘어온답니다.

     

    물론 php.ini 화일에서 register_globals=on 으로 해주시면 PHP3 에서와 같은

     

    방식으로 이용가능하구여..

     

    또 일일이 $_GET[] 이나 $_POST[] 하기 귀찮으면

     

    extract( $_GET );

    extract( $_POST );



    ###################################################
    ###                게시판으로 접근 크랙하는 방법
    ###################################################


    1) system, exec, passthru 함수 사용시 주의할점 

    Cracker 가 Web Hacking 시에 가장 궁극적인 목적은 (원하는) 바로 System 
    명령어 실행일 것이다. 개발자가 Web 프로그래밍을 할때 프로그램에 필요한 기능으로 
    Language 에서 제공하는 System Execute Fucntion 을 사용하는 경우가 많이 있다. 

    이러한 기능을 하는 Function 으로써, PHP 를 예를 들자면 system() 나 exec() 
    Function 을 들 수 있다. 이와 같은 System Execute Function 들은 Web 에서 
    System 으로 명령을 Execute 를 할 수 있게끔 도와준다. 그리고 실행되는 
    Process 들의 권한은 현재 돌아가고 있는 WebServer 의 uid, gid, euid, guid 로 
    실행된다. (프로세스가 가지는 것은 effective uid 이다.) 

    uid (user identifier) 같은 것들은 like unix 에서 사용자를 구별하기 위해 
    사용되는 숫자 또는 이름이다. like unix 에서는 보안을 위하여 uid 나 혹은 
    euid 를 갖고 그 사용자의 권한을 Check 하는 경우가 많다. 

    Web 어플리케이션 개발자로서 이러한 부분은 크게 신경쓰지 않아도 된다. 
    실질적으로 Web 에서 System Execute 를 하였다고 하여도, 커널 내부적으로는 
    보통의 uid 를 가진 user 가 Shell 상에서 System call 을 요청하는 것이랑 별반 
    다를바가 없지만 Web 어플리케이션 개발자는 그런 깊숙한 부분은 신경쓸 필요가 
    없다는 이야기이다. Web 어플리케이션 개발자는 Cracker 가 System 에 침입할 수 
    없게끔 1 차 적인 보안 조취를 취하도록 프로그래밍을 하면 된다. 

    그러면 실제로 Web 프로그래밍을 할시에 system(), exec() 같은 Function 을 
    사용하는 경우는 어떤 경우인가. 가장 대표적인 예를 들자면 게시판을 들 수가 
    있다. 예를 들어 사용자가 Upload Board 를 이용해 특정 자료를 Server 에 
    올렸다고 하자. 그런데 자료 Upload 에 실수를 하여 게시물을 지우고자 할때는 
    Delete 메뉴를 이용한다. Delete 메뉴를 이용하여 해당 게시물을 지우고, 
    같이 올려진 파일도 지워야 한다. 예를 들어 다음과 같이 지운다고 하자. 

    http://beist.org/delete.php?text=1.txt&file=1.zip 

    /* delete.php 파일을 요청할때 argument 로 text 와 file 을 건내주었고 
    그 값은 해당 게시물이 담긴 txt 파일과 Upload 시에 올린 자료명이다. */ 

    sample1.php 

    <? 

    /* 생략 */ 

    system("/bin/rm -f data/$text"); 
    system("/bin/rm -f data/$file"); 

    /* 생략 */ 

    ?> 

    /* system() Function 을 이용하여 OS 내부에 있는 /bin/rm 이라는 프로그램을 
    이용하여 data 디렉토리 밑의 1.txt 를 지우게 한 프로그램이다. 
    /bin/rm 은 지우기를 시도하는 사용자의 ID 가 해당 지우려고 하는 파일의 
    소유자와 일치할때 그 파일을 지워주는 프로그램이다. /bin/rm 을 실행할때 
    준 -f 옵션은 force 의 의미로써 조건만 만족한다면 무조건 지우는 옵션을 
    뜻한다. */ 

    sample1.php 에는 게시물 처리를 위하여 다른 부분도 필요하겠지만 여기서는 
    이해를 쉽게 하기 위하여 프로그램에서 취약한 부분만을 적게 되었다. 

    이런 식으로 Web CGI 에서 System Execute Function 은 이용된다. 그러면 이제 
    실제로 존재하는 CGI 에서 System Execute Function 을 잘못 사용하였을때 일어 
    나는 취약점을 알아보자. 

    실제로 필자가 발견한 버그를 이용할 것이다. 해당되는 Web CGI 는 게시판으로 
    유명한 Zeroboard 3.5.x 이다. 이 글을 쓰는 지금, Zeroboard 의 버전은 4.0.x 
    버전까지 나와있지만 잘못된 System Execute Function 사용으로 인한 결과를 
    설명하기에 적절한 코드인것 같아 이것으로 설명하겠다. 


    문제가 되는 부분은 zeroboard 의 delete_list.php3 파일이다. 

    delete_list.php3 

    1 <? 
    2 // 지금 삭제할려는 글의 데이타를 가져옴 
    3 $data=mysql_fetch_array(mysql_query("select * from zeroboard_$id where 
    4 no=''$no''",$connect)); 
    5 // 이 글에 답글이 있는지 없는지를 검사 
    6 $check=mysql_fetch_array(mysql_query("select count(*) from zeroboard_$id 
    7 where headnum=''$data[headnum]'' and arrangenum>''$data[arrangenum]'' and 
    8 depth>''$data[depth]''", $connect)); 
    9 if($check[0]>0) Error("답글이 있는 글은 삭제할수 없습니다"); 
    10 
    11 // 파일삭제 
    12 if($data[file_name]||$data[file_name2]) 
    13 { 
    14 @system("rm -rf data/$id/$data[reg_date]/$data[file_name]"); 
    15 @system("rm -rf data/$id/$data[reg_date]/$data[file_name2]"); 
    17 @system("rm -rf data/$id/$data[reg_date]"); 
    18 @unlink("data/$id/$data[reg_date]/$data[file_name]"); 
    19 @unlink("data/$id/$data[reg_date]/$data[file_name2]"); 
    20 @unlink("data/$id/$data[reg_date]"); 
    21 } 
    22 
    23 // 글 삭제 
    24 mysql_query("delete from zeroboard_$id where no=''$no''",$connect); 
    25 mysql_query("delete from zeroboard_memo_$id where parent=''$no''",$connect); 
    26 $temp=mysql_fetch_array(mysql_query("select count(no) from zeroboard_$id", 
    27 $connect)); 
    28 mysql_query("update $admin_table set total=''$temp[0]'' where name=''$id''", 
    29 $connect); 
    30 
    31 // 간단한 답글 삭제 
    32 mysql_query("delete from $comment_table where table_name=''$id'' and parent=''$no''", 
    33 $connect); 
    34 ?> 

    이 script 의 기능은 특정 게시물을 지우는 것이다. 지울 때 file 도 같이 삭제를 한다. 
    중요 취약성이 되는 부분은 14~17 라인이다. $data[file_name] 과 $data[file_name2] 
    변수는 file name 이다. 

    zeroboard 에서 upload 된 file 이 놓이는 위치는 data/$id/$data[reg_date] 이다. 
    $id 는 board name 을 뜻하고 $data[reg_date] 는 게시물을 쓴 시간을 뜻한다. 
    이 것들은 mysql database 에 담겨있으며 3 번째 라인에서처럼 가져와 $data 변수에 
    담는다. 

    file 을 지울때 System Execute Function 인 system 함수를 이용하는데 Cracker 는 
    이를 이용하여 System 에 침입할 수가 있다. 

    자세한 방법을 알아보자. Cracker 는 Write Form 에서 File upload 할때 File 의 
    이름을 임의로 설정할 수 있다. 

    write_main.php3 

    1 <? 
    2 // 자료실 사용시 
    3 if($data[file_name]) 
    4 { 
    5 $file_exist=$data[file_name]."파일이 등록되어 있습니다 
    6 <br>";$file_del="<input type=checkbox name=del_file value=1> 삭제"; 
    7 } 
    8 if($data[file_name2]) 
    9 { 
    10 $file_exist2=$data[file_name2]."파일이 등록되어 있습니다<br>"; 
    11 $file_del2="<input type=checkbox name=del_file2 value=1> 삭제"; 
    12 } 
    13 if($setup[use_pds]) 
    14 { 
    15 ?> 
    16 <tr> 
    17 <td align=right>Upload File  </td> 
    18 <td><div style=line-height:160%> 
    19 <? echo $file_exist;?> <input type=file name=file 
    20 size=<?echo $size[8];?> maxlength=255 class=input> 
    21 <? echo $file_del; ?><br> 
    22 <? echo $file_exist2;?> <input type=file name=file2 
    23 size=<?echo $size[8];?> maxlength=255 class=input> 
    24 <? echo $file_del2; ?> 
    25 </tr> 
    26 <? 
    27 } 
    28 ?> 

    위 소스는 write_main.php3 의 일부이다. 취약성이 되는 부분은 아니고 사용자가 
    Write 버튼을 클릭했을때 보여주는 Write Form 이다. 13 번째 줄에서 Admin 이 
    해당 게시판에 File Upload 를 허용했다면 16~25 줄까지의 내용을 뿌린다. 잠깐 
    살펴보면 

    <input type=file name=file size=200000000 maxlength=255 class=input> 

    이 정도일 것이다. 우리는 이 필드를 이용하여 File 을 Upload 할 수 있는데, 
    여기서 악의적인 조취를 취하면 Server 에 특정 Command 를 실행할 수 있다. 

    delete_list.php3 에서 봤듯이 file 을 지울때 rm 을 이용하여 지우게 된다. 
    이는 shell 을 사용한다는 것이다. ; 와 | 는 연속, 연결을 의미하니까 file 
    name 에서 악의적인 file name 을 주면 cracker 는 원하는 일을 할 수 있다. 

    ex) 

    filename : test;/usr/bin/touch /tmp/imbeist 

    이런 식으로 file name 을 주어 Server 에 올린다면 mysql Database 에도 
    test;/usr/bin/touch /tmp/imbeist 가 올라가게 될 것이다. 그리고 해당 게시물을 
    다시 지운다면 delete_list.php3 에 의해서 

    @system("rm -rf data/test1/4444444/test;/usr/bin/touch /tmp/imbeist"); 

    의 명령이 실행될 것이다. 
    (여기서 test1 과 4444444 는 임의로 만든 것이다) 

    그렇다면 세미콜론에 의해서 두 명령이 내려질 것이고 touch 를 이용하여 
    cracker 는 /tmp directory 밑에 imbeist 라는 file 을 생성시킬 수 있다. 
    이 것을 이용하여 term 이라든가 port 를 열어서 shell 을 실행 시킬수 있게끔 
    해놓는다던가 방법은 많다. Cracker 에게 있어서 이 Security Hole 은 Web hacking 
    에 있어서 궁극적인 목표까지 다달은 것이다. 

    해결책을 알아 보자. 

    필자가 생각하는 해결 방법은 (위의 상황으로만 프로그래밍을 해야할때) 
    file name 을 체크하는 것이다. file name 에는 정상적인 알파벳이나 숫자, 그리고 
    . 를 제외하고 나머지의 문자가 들어갈 필요가 없다. 그래서 file name 을 검사할때 
    만약 ../ or ; or | 같은 문자가 들어온다면 script 실행을 중지하는 것이 좋을것 
    같다. 

    if(eregi(";", $file_name)) 

    echo "장난하니?.. file 이름에 ; 가 들어있습니다."; 
    exit; 


    if(eregi("\|", $file_name)) 

    echo "장난하니?.. file 이름에 | 가 들어있습니다."; 
    exit; 


    (여기에서는 ; 과 | 만 처리를 하였다.) 

    위와 같은 방법으로 script 실행을 중지하는 것을 원치 않는다면 eregi_replace 
    같은 function 을 이용하여 빈칸으로 만드는 방법도 괜찮은 방법이다


    ####################################3
    # DUMP MYSQL
    ####################################3


    mysqldump를 이용한 백업하는 법입니다.

    1) 전체 DB를 백업
    mysqldump -u myhome -p -A > mysql_backup_all.sql

    2) 데이타베이스별로 백업 (--databases 뒤에 myhome mysql 등 줄줄이 나열함)
    mysqldump -u myhome -p --databases myhome mysql > mysql_backup.sql

    3) 특정 테이블 백업 (myhome의 tablea만 백업)
    mysqldump -u myhome -p --myhome tablea > mysql_backup_tablea.sql

    -------

    다음으로 복구하는 법입니다.
    mysql -u myhome -p myhome < 백업한파일명.sql

    간단하죠?


    database 전체 백업
    ]$ mysqldump -p database > 'filename'

    database 전체 복구
    ]$ mysql -p database < 'filename'


    table 백업
    mysql> LOCK TABLES employee READ;
    mysql> SELECT * INTO OUTFILE 'filename' FROM employee;

    table 복구
    mysql> LOAD DATA INFILE 'filename' INTO TABLE employee;
    mysql> UNLOCK TABLES;

    ##############################################
    # 새창을 열때 부모창에서 새창으로 SUBMIT시키기
    ##############################################


    frm = document.forms.frm_Reservation04;
    window.open('','ReservationComplete','width=470,height=750,scrollbar=no');
    //showModelessDialog('','ReservationComplete','dialogwidth:450px;dialogheight:600px;status:no;resizable:yes');
    frm.target = "ReservationComplete";
    frm.submit();


    ################################################
    # 자바스크립트 eval쓰면서 먹히게 하기...
    ################################################

    ////////////////////////////////////////////////////////////////////////////////////
    //eval("document." + frm);  ==>  ff.value = ""; ff.focus(); return

    v_imsi = new Object(eval("frm.sgl_cnt_"+arr[i]));

    ################################################
    $ 변수와 변수를 합친 변수 만들기
    ################################################

    for($i=0;$i<3;$i++){
    $k=$i+1;
    $v_file = "v_file".$k;
    echo ${$v_file};

    $a = 'a';
    $b = '2';

    $d = $a.$b;

    echo ${$d};

    $pans = "po_ans".$i;
    $phit = "po_hit".$i;
    $$pans = $row[$pans];
    $$phit = $row[$phit];


    $PdaInfo_Arr  = array("PPC",".NET","Palm","Linux");
    $PdaInfo_Arr_Sub0  = array("Samsung","LG","HP","Dell","Mitac","Toshiba","Fujitsu","Asus","기타");
    $PdaInfo_Arr_Sub1 = array("Samsung","기타");
    $PdaInfo_Arr_Sub2 = array("PalmOne","Sony","기타");
    $PdaInfo_Arr_Sub3 = array("Sharp","GMate","기타");

    $amade 값은 대카테고리값 숫자 0.1.2.3
    $amade2 값은 중카테고리값 숫자 
    $v_amade = 'PdaInfo_Arr_Sub'.$amade;
    $v_amade = ${$v_amade}[$amade2];
    echo $v_amade;


    //아래처럼 하면 안됨.
    $v_amade = 'PdaInfo_Arr_Sub'.$amade."[$amade2]";



    $a = "bb";
    $bb = "Hello! php";

    echo $$a;

    즉, 변수의 값을 변수 이름으로 지정한겁니다. 
    배열이면..


    ${"a[1]"} = "1234";
    $bb = "a[1]";
    echo $$bb;



    ####################################################
    # 테이블을 넘어가면 출력안됨.
    ####################################################

    style='table-layout:fixed;'


    ##############################################
    #  날짜 계산에서 01일이 1로 왔을때 0을 붙여주는 부분
    ##############################################

    str_pad($d,2,0,STR_PAD_LEFT);  // 두자리를 읽어서 두자리가 안차여있음 0으로 채워라


    #######################################################
    ##   웹에서 DB 백업하기...
    #######################################################


    class DatabaseBackup {
        var $Dba;
        var $DbaPassword;
        var $Bindir;

        function DatabaseBackup2($u,$p,$b) {
          $this->Dba = $u;
          $this->DbaPassword = $p;
          $this->Bindir = $b;
        }

        function databaseDump($dbn,$filename) {
          $file_name = $filename.".sql";
          $fp = popen("$this->Bindir/mysqldump -u$this->Dba -p$this->DbaPassword $dbn ","r");
    //      $fq = fopen("/home/site5/docs/data/backup/".$file_name,  "w" );
          $fq = fopen("/hosting2/nisoft36/docs/admin/db_back/".$file_name,  "w" );
          while (!feof($fp)) {
            $a = fgets($fp,4096);
            fwrite($fq,$a);
          }
          fclose($fq);
          pclose($fp);
          return $file_name;
        }
    }

    $time = date("YmdHis");

    $db = new DatabaseBackup;
    $db -> databaseBackup2('nisoft36','0069b336','/usr/local/mysql/bin');
    $filename = $db -> databaseDump('nisoft36_db',$time);

    #####################################################
    #                                      이미지 싸이즈 가로세로 비율 맞추기
    #####################################################


    $size_imsi = getimagesize("./gallery/gallery_img/$BBS/$img_view");
    $size_width =  $size_imsi[0];
    $size_height =  $size_imsi[1];

    $x_max='150';
    $y_max='150';

    if($size_width > $size_height){

    for($i=0.99;$i>=0.01;$i=$i-0.01){

    if($x_max >= ($i*$size_width)){
    break;
    }
    }
    }else{

    for($i=0.99;$i>=0.01;$i=$i-0.01){

    if($y_max >= ($i*$size_height)){
    break;
    }
    }
    }


    echo (int)($size_width*$i)." 가로<br>";
    echo (int)($size_height*$i)." 세로<br>";


    #############################################################
    #
    # 이전날짜와 다음 날짜를 mktime으로 구하는법 간단.
    #
    #############################################################
    <?

    $y = '2004';
    $m = '09';
    $d = '12';
    $day = mktime(0,0,0,$m,$d,$y);
    for($i=0;$i<5;$i++){

    $next_day = date('Y-m-d',$day-($i)*24*60*60);
    echo $next_day."<br>";
    }
    ?>

    #################################################################3
    #
    # 플래쉬 밖에서 링크걸기
    #
    #################################################################3




    <embed src='aaa.swf?click=http://www.naver'></embed>


    ###################################################################
    #
    # select box에서 선택한 인덱스값 찾기
    #
    ###################################################################


    var myindex = frm_2.ea_select.selectedIndex;


    ##################################################################
    #
    # 새창에서 부모창 닫을때(부모창이 프래임이 었을때)
    #
    ##################################################################

    code ==> 프래임 이름.
    parent.code
    opener.parent.code.location.href


    #################################################################
    #
    #                                               세션시간 등록하기.....
    #
    #################################################################

    <?
    echo "기본설정<br>";
    echo "cache_expire : ".ini_get("session.cache_expire");
    echo "<br>";
    echo "gc_maxlifetime : ".ini_get("session.gc_maxlifetime");
    ini_set("session.cache_expire", "86400");
    ini_set("session.gc_maxlifetime", "86400");
    echo "<br><br>수정된설정<br>";
    echo "cache_expire : ".ini_get("session.cache_expire");
    echo "<br>";
    echo "gc_maxlifetime : ".ini_get("session.gc_maxlifetime");
    ?>


    $##################################################################
                           var 지역변수선언
    $##################################################################

    함수 내에서 써야 지역변수가 된다.

    var aaa; 전역변수

    function aa(){
    var aaa; 지역변수
    }


    #####################################################################
    파일찾기 이미지로 바꾸기...
    #####################################################################
            document.forhttp://m.file.click();
            document.forhttp://m.text1.value=document.form.file.value; 

    <script> 
    function file() 

    document.forhttp://m.file.click(); 
    document.forhttp://m.text1.value=document.form.file.value; 

    </script> 
    <p> 
    <form name="form">
    <input type="file" name= "file" style="display='none';"><input type="text" name="text1"><a href="javascript: file
    ()">파일찾아보기</a> 
    </form> 
    </p> 



    #####################################################################
    팝업창 ModalDialog
    #####################################################################
    문법

    vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])

     

    파라메타 값

    sURL : 디스플레이될 웹페이지의 url

    vArguments (선택사항)

    다이얼로그 박스로 넘겨줄 값

    메세지 박스에서는 document.write(window.dialogArguments) 이런 형태로 값을 찍어주면 됩니다.

    sFeafures

    dialogHeight:sHeight - 다이얼로그 창의 높이를 지정

    dialogLeft:sXPo - 창의 왼쪽에서 부터의 위치

    dialogTop:sYPos - 창의 상단에서의 위치

    dialogWidth:sWidth - 다이얼로그 창의 길이를 지정

    center:{ yes | no | 1 | 0 | on | off } - 위치를 지정하지 않을경우 창의 위치를 중앙에 놓을지 여부

    help:{ yes | no | 1 | 0 | on | off } - 도움말 보이기/보이지 않기

    resizable:{ yes | no | 1 | 0 | on | off } - 창크기변형을 할수 있나 없나

    scroll:{ yes | no | 1 | 0 | on | off } - 스크롤바의 유/무

    status:{ yes | no | 1 | 0 | on | off } - 상태바를 표시/표시안함

     

    간단히 이렇게만 설명해 놓겠습니다.

    관심 있으신 분들은 상단 링크를 보세요~

     

    사용예
    document.write(window.dialogArguments)


    키보드를 쓸수 없음...(단축키) 한가지 예외는 프린터는 가능(Ctrl+P)


    단점... 
    opener를 못씀

    ##############################################################3
    style.top => 2px
    style.pixelTop => 2

    ############################################################


    ##################    $PHP_AUTH_USER    ################################
    HTTP 인증을 사용하는 모듈로서 아파치에서 수행될때, 이 변수는 유저에 의해 제공되는
    username으로 설정된다. 

    #################################
    style="BORDER-COLLAPSE: collapse"


    ##############################################################
    음 참고로 위에 있는 것들은 PHP 가 지정해 놓은 constants 들이구요...
    우리가 원하면 지정해서 사용할 수도 있는데...그때 사용하는 함수가 define() 함수랍니다.

    define("TEST","안녕하세요.방갑습니다.");

    echo TEST;

    이렇게 사용한답니다. 하지만 대소문자 구분을 하지요.
    그런데 만약 대소문자 구분을 없애고 싶으시다면...

    define("TEST","안녕하세요.방갑습니다.",true);


    ##############################################################
      @error_reporting(E_ALL ^ E_NOTICE);
    @extract($HTTP_GET_VARS); 
    @extract($HTTP_POST_VARS); 
    @extract($HTTP_SERVER_VARS); 
    @extract($HTTP_ENV_VARS);

    error_reporting = E_ALL; 이 디폴트로 되어있을겁니다. 이부분을 주석처리해버리시고 
    error_reporting = E_ALL & ~E_NOTICE 로 사용하시면 변수가 지정되지 않았다는 메세지가
    사라지고 리눅스와 같은 환경(??) 에서 사용하실수 있으실겁니다. 

    두번째는 알지?
    ##############################################################


    history.back() 했을 때 폼의 내용을 유지하는 문제와 관련해서
    session_cache_limiter("nocache, must-revalidate");
    라는 게 자꾸 올라오는데요, 잘못된 글이 자꾸 퍼져나가는 것 같아 씁니다.
    (Tip & Tech에 올리는 게 좀 부적당한 것 같기도 하지만;;; 양해해주셔요.)

    우선 HTTP 1.1 RFC 중 한 가지만 보죠.

    cache-response-directive =
    "public"
    | "private" [ "=" <"> 1#field-name <"> ]
    | "no-cache" [ "=" <"> 1#field-name <"> ]
    | "no-store"
    | "no-transform"
    | "must-revalidate"
    | "proxy-revalidate"
    | "max-age" "=" delta-seconds
    | "s-maxage" "=" delta-seconds
    | cache-extension

    여기서 no-cache는 말 그대로 캐시하지 말라는 것이므로
    브라우저에서 페이지 저장하지 말라는 거고요,
    must-revalidate는 멋대로 하지 말고 확인하라는 거죠.
    (정확한 역할은 RFC를 찾아 읽어보세요. 강추!)
    그러니까 "nocache, must-revalidate"는
    원래 "캐시를 절대 하지 마라!" 라는 뜻입니다.

    그러니까 이렇게 넣어놓고 "우아~ 폼 내용이 안 사라지네!"라고 하는 건
    눈 감고 Copy & Paste 혹은 개그콘서트인 겁니다. ㅡ.ㅡ;
    왜 history.back() 해도 폼이 유지되는 걸까? 하고
    의문을 가져보지 않으셨나요?



    <?php
    session_cache_limiter("nocache");
    session_start();
    ?>

    위와 같은 파일 하나 만들어서 Response Header 가 어떻게 나오는지 살펴보세요.
    살펴보는 방법 중 하나는 간단하게... Linux 쉘에서...

    /usr/bin/wget -d -O /dev/null "http://kr.yahoo.com/"

    실제 어떻게 나오는지는 직접 확인해보세요.
    남의 글 백번 보는 것보다 직접 한번 해보는 게 낫습니다.
    자, 눈에 띄는 게 있나요? 없나요? ;;;



    이번엔 아무 것도 없는 문자열만 넣어서 확인해보죠.

    <?php
    session_cache_limiter("");
    session_start();
    ?>

    Cache-Control과 관련된 것은 안 나올 겁니다.



    이번엔 nocache, must-revalidate를 넣어서
    위와 같은 방법으로 확인해보세요.

    <?php
    session_cache_limiter("nocache, must-revalidate");
    session_start();
    ?>

    뭔가 좀 이상한 거 없습니까?
    그렇습니다. ""랑 똑같이 Cache-Control 과 관련된 것은 안 나옵니다.
    왜 그럴까요? 왜 그럴까요? 알~아~맞~추~어 봅시다. ㅡoㅡ;;;


    PHP에서 session_cache_limiter()에 쓸 수 있는 것은
    public, private, no-cache 뿐입니다.
    (Ver. 4.2.0부터 private와 유사한 private_no_expire 추가되었음.)
    http://kr.php.net/manual/en/function.session-cache-limiter.php
    그 외에는 어떤 걸 넣든 Cache-Control를 포함하지 않습니다.
    그러니까 "" = "nocache, must-revalidate" = "Fencer" = "phpschool"
    Response Header에 Cache-Control이 없으면
    캐시에 관한 한(!) 세션을 쓰지 않을 때와 같다고 보아도 무방합니다.
    즉, 일반 HTML 문서와 별 차이가 안 납니다.




    왜 선택할 수 있는 게 이렇게 적은 거지? 라고 의문을 갖는다면
    PHP session 부분의 C 소스를 보면 확실합니다.
    어떻게 보면 이런 제한 때문에 쉽기도 하고
    동시에 자유롭고 세밀한 제어가 힘들기도 하죠.
    (필요한 사람은 C 소스를 수정하여 컴파일하면 되겠죠.)

    처음에 누군가 확인도 해보지 않고
    session_cache_limiter("nocache, must-revalidate"); 를 넣으세요~
    하니까 확인도 되지 않은 채 여기저기 퍼져나간 것 같은데요...
    [결론] 세상에 믿을 놈 하나 없습니다. ㅡ_ㅡ;;;
    물론 제가 뻥 치는 것일 수도 있으니까 위에 적은 거 직접 확인해보세요.




    Form 전송 후 history.back() 시 데이터 살리기... | PHP 2005/09/20 13:05  
     
    http://blog.naver.com/osicky/40017734356 
     
    form 이 있는 파일에

    session_cache_limiter("private_no_expire");

    이걸 추가해준다..

    단, session_start() 가 있을 경우 session_start() 위에다가
    session_cache_limiter("private_no_expire");
    이걸 넣어 준다.

    ※ 주의할점
    session_cache_limiter("private_no_expire") 를 설정하면.. 말 그대로 캐시가 지워지지 않는다..
    따라서 아무데나 넣어 놓으면 새로운 글이 등록되어도 적용시키지 못한다..
    따라서 form 문이 있는 파일에만 넣어주는게 상책...
    끝.

     


    ###################################################################

    forhttp://m.S4.options.length = 0 //옵션박스의 내용을 다지움

    var ch1 = new Option("◈◈◈선택하세요◈◈◈",'', true); // 기본옵션박스 다시살림
    var ch2 = new Option("◈◈◈선택하세요◈◈◈",'', true);
    var ch3 = new Option("◈◈◈선택하세요◈◈◈",'', true);
    form.S2.options[0] = ch1;




    ###################################################################
                 쿠키 cookie
    ###################################################################







    이제 setcookie() 함수에 대해 설명하겠습니다.

    PHP에서 setcookie() 함수는 거의 100% 잘 작동합니다.

    생성이 잘 안된다면 그건 사용자가 쿠키를 거부한다거나 setcookie() 함수를 잘 못 사용했을 수도 있습니다.

     

    우선 setcookie() 함수의 사용방법입니다.

    (대괄호[] 로 둘러싸여진 부분은 생략가능한 부분입니다. 하지만 쿠키생성시 최소한 4개 즉 path 부분까지는 입력하시는 것이 좋습니다.)

     

    bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]] )

     

     - name : 쿠키변수명

     - value : 변수값

     - expire : 쿠키를 사용할 수 있는 시간(unix timestamp 로 입력)

     - path : 쿠키가 사용될 위치지정

    (기본적으로 '/' 를 지정하지만 '/test/' 로 지정하면 test 폴더와 그 하위폴더에서만 작동됩니다.)

     - domain : 쿠키가 사용될 도메인 지정

    ('http://www.test.com' 으로 지정하면 무조건 그 도메인에서만 작동되지만 '.test.com' 으로 지정하면 섭도메인인 ('test1.test.com', 'test2.test.com') 등에서도 사용됩니다.)

     - secure : https 프로토콜에서만 작동할지 여부 (0 또는 1 값을 같습니다. 기본 0 값)

     

    간단한 쿠키생성 예)

     

    if(setcookie("test", "안녕하세요", time()+3600, "/")) echo "쿠키가 정상적으로 생성되었습니다.";

    else echo "쿠키생성에 실패했습니다.";

     

    위 예제는 1시간동안 홈페이지 전체에서 사용가능한 쿠키를 생성하는 예제입니다.

     

    쿠키사용시 한가지 중요한 것이 있습니다. 쿠키는 생성직 후 사용이 불가능 합니다.

    'test.php' 라는 파일에서 쿠키를 생성했다면 이 페이지를 새로고침을 하시던지 아님 다른 페이지로 이동을 해야 사용이 가능하다는 것입니다.

    위의 예제 처럼 생성 후 바로 밑에서 echo $_COOKIE[test]; 해봤자 아무것도 출력되지 않습니다. 소스 코딩시 이점 유의 하시기 바랍니다.



    ###################################################################






    input/textarea에 한/영키 사용않고 한글이나 영문 자동으로 나오게하는 소스. (웹 지식)   2004/08/28 (Sat)


    내용은 제목 그대로입니다. 

    소스는 참 간단하구요.

    먼저 첫번째 <input  type=text> 이렇게 소스를 적용하면 한/영키를 눌러야지만 한글이 써지죠..

    한/영 키를 누르지 안은 상태에서 바로 글 입력시 한글이 나오게 할려면 IME-MODE: active를 적용하면 됩니다.
    <input type=text style='IME-MODE: active'> 

    이렇게 소스를 적용하면 글 입력시 바로 한글이 나오죠.

    textarea도 마찬가지로 아래와 같이 하시면 됩니다.
    <textarea cols="50" rows="10" style='IME-MODE: active'>
    </textarea>


    그리고 영어를 나오게 할려면 active 대신 inactive를 넣습니다.
    이건 굳이 쓰지 안아도 페이지 로딩시 처음에 영어로 나오니까 쓰지 안아도 됩니다.
    <input type=text style='IME-MODE: inactive'>

    또, auto는 이전의 인풋이나 텍스트리어에 적용한 것을 그대로 나타냅니다.
    무슨 말이냐 하면 아래 처럼 소스를 적용했다구 하면요.
    <input type=text style='IME-MODE: active'>
    <input type=text style='IME-MODE: auto'>
    <input type=text style='IME-MODE: inactive'>
    <input type=text style='IME-MODE: auto'>

    첫번째에 한글 쓰기가 되었죠. 그럼 두번째도 마찬가지로 한글이 써집니다.
    세번째는 영문 쓰기가 되었구요. 네번째는 세번째 영향을 받아서 영문이 써집니다.

    그리고, 한가지가 더 있는데 이건 잘 모르겠습니다. 아시는 분 댓글 달아주세요.
    active, inactive, auto 이거 말구도 deactivated 이게 있는데 이건 모르겠네요.
    뭘 해제한다는 것인지 소스 적용해봐도 뭔지 모른다는....^^;


    위 소스는 아마 IE5 이상에서 적용되는 걸로 아는데 이하 버전에서는 테스트 안해봤습니다.
    이 이하 버전 쓰는 곳은 pc방 밖에 없겠죠...
     
    <input type="text" value="기본 텍스트"> 

    <input type="text" style="background;" value="투명텍스트필드"> 

    <textarea style="background;" rows="3">투명텍스트리어</textarea> 

    style="background;"를 사용하면 투명 처리가 됩니다.
    즉, 배경 컬러가 검정이라면 input나 텍스트에리어가 투명 처리가 되기 때문에 배경이 검정이 됩니다.
    문서의 백그라운드 이미지가 있을 경우도 당근 다 보입니다. 


    #######################################################################################


    php 세션 유지 시간 연장 
    session_start(); 
    session_cache_limiter('private'); 
    ini_set("session.cookie_lifetime", "86400"); 
    ini_set("session.cache_expire", "86400"); 
    ini_set("session.gc_maxlifetime", "86400"); 

    아래와 같이 php 소스 제일 상단에 추가해보시기 바랍니다. 
    세션 자동 실행하셨다면 제일 위에줄 삭제해보시구요.. 


    ------------------------------------------------------------------------------------- 
    [Session] 
    session.save_handler      = files     ; 데이터를 저장하고 보여줄 핸들러 
    session.save_path         = /tmp      ; 세션 파일을 저장할 경로 
    session.use_cookies       = 1         ; 쿠키를 이용한 세션 On 
    session.name              = PHPSESSID ; 세션이름 (쿠키이름) 
    session.auto_start        = 0         ; 세션자동시작 Off, 요청해야만 시작. 
    session.cookie_lifetime   = 0         ; 쿠키의 저장시간 
    session.cookie_path       = /         ; 쿠키 유효 경로 
    session.gc_maxlifetime    = 1440      ; 1440초 후에 사용되지 않는 것으로 보이는 세션데이터 삭제. 
    session.cache_expire      = 180       ; 180분 후에 세션을 삭제한다. 
    ------------------------------------------------------------------------------------- 


    #######################################################################################

    정규표현식 

    include $DOCUMENT_ROOT."../../func/dbcon.inc";

    (include \$DOCUMENT_ROOT\.\".*[.\/][^a-z])

    include $DOCUMENT_ROOT."../../           <== 이렇게 나옴
    확인 필요 모든걸 다지울때도 있음 --;


    @@@################################################################################
    그럼 2005년 1월부터 100일 지난 날은 몇일인지 strtotime 을 이용해서 확인해봅시다.
    응용 date("Y-m-d", strtotime("2005-01-01 +100 day")); ==> 2005년 04월 11일


    두날짜의 연산은 타임스탬프로 두날짜의 차이값을 얻어서 86400 (60초*60분*24시) 로 나누면 몇일인지 나옵니다.
    intval((strtotime("2005-01-10")-strtotime("2005-01-02"))/86400)    =>     8


    Mysql 날짜 관련함수
    select date_sub(now(), interval 5 day);
    5일후...
    select date_add(now(), interval 5 day);
    5일 전...

    @@###################################################################################

    PHP는 약간의 기본적인 상수들을 제공하고, 실행 시 상수를 설정할 수 있는 메커니즘을 지원한다. 상수는 변수와 비슷하다. 그러나 define()함수를 사용하여 선언한다는 것과 나중에 다른 값으로 바꿀 수 없다는 점이 차이가 있다.
    미리 지정된 상수는 다음과 같다.

     

    __FILE__ : 현재 처리중인 스크립트의 파일명. 현재 파일이 include나 require로 포함된 파일이라면, include 함수 등을 호출한 부모 파일이 아닌, 포함된 파일의 이름을 가진다.

     

    __LINE__ : 현재 처리중인 명령의 스크립트 내에서의 라인 번호. 현재 파일이 include나 require로 포함된 파일이라면, include 함수 등을 호출한 부모 파일이 아닌, 포함된 파일 내에서의 라인 번호를 가진다.

     

    PHP_VERSION : 현재 사용중인 PHP 파서의 버전

     

    PHP_OS : PHP 파서가 실행되고 있는 OS의 이름

     

    TRUE : 참(true) 값

     

    FALSE : 거짓(false) 값

     

    E_ERROR : 문법 오류가 아닌 복구가 불가능한 에러를 표시한다.

     

    E_WARNING : PHP가 어떤 계속 수행 가능한 오류를 감지했음을 표시한다. 예를 들어 ereg()에 regexp가 잘못된 경우 등이다.

     

    E_PARSE : 파서가 스크립트 파일에서 문법적으로 잘못된 명령을 만난 경우이다. 복구는 불가능하다.

     

    E_NOTICE : 에러는 아니지만 어떤 알려질 사항이 있음을 나타낸다. 실행은 계속된다. 예를 들어 hash 인덱스에 따옴표가 없는 문자열이 사용되었다든지, 이전에 선언되지 않은 변수의 값을 읽는 다던지 하는 경우이다.

     

    E_* : 대개 error_reporting() 함수에서 reporting 레벨을 정할 때 흔히 사용된다. 주의할 점은 상수는 C에서의 macro 값이 아니다. 단지 scalar 값을 가질 수 있을 뿐이다.

     

    예)

     

    <?
        function report_error($file, $line, $message) {
            echo "An error occured in $file on line $line : $message.";
        }
        report_error(__FILE__, __LINE__, "Something went wrong!");
    ?>


    @@@@@@@@@@@@@@@@@   마지막 등록 키값



    SELECT LAST_INSERT_ID();


    @@@@@@@@@@@@@@@@@   mysql 에서 blob로 저장한 이미지 출력 

    <img src="data:image/jpeg;base64,<?php echo base64_encode($rows["guide_file"]); ?>"  height='50px' />

    '프로그램 > Php' 카테고리의 다른 글

    php 배열함수 모음  (1) 2024.01.23
    php 함수 모음 정리  (0) 2024.01.23
    이클립스에서 php사용 (sftp 연결)  (0) 2016.09.28
    이미지 썸네일  (0) 2016.09.06
    php 배열함수  (0) 2016.09.05
Designed by Tistory.