노벨보드 만들기 [1] > 자유게시판

자유게시판

노벨보드 만들기 [1] 정보

기타 노벨보드 만들기 [1]

본문

안녕하세요. 하노입니다.
전에 게시판 만드는 방법을 연재하겠다고 글을 몇편 올린적이 있었습니다.
그러나 여러 이유로 정상연재가 불가하여 연재같은 연재가 이루어 지지 않았습니다.
가장 큰 이유는 만들면서 연재하겠다는 무식(?)한 생각으로 인해 직장생활을 하는 저로서는 시간 부족으로 게시판 제작 조차 이루어 지지 않았습니다.
간단히 정리하면 이미 만들어 놓은 게시판도 연재하기 빠듣한 시간으로 만들면서 같이 연재하려는 어리석은 저의 욕심 때문이었습니다.
 ToT
최근에 그누보드의 일부소스를 활용한 노벨보드를 어느정도 완성하였기에 다시 연재를 시작하려 합니다.


게시판 만들기 1화

  만들 게시판 이름 : 노벨보드
  만든 이유 : 하노가 운영중인 환타지/무협 소설 연재 사이트에서 사용하기 위해 제작중
  기능 : 엄청 단순, 간단한 게시판 기능과 간단한 회원관리 기능 ^^;;
  완성도 : 소스 자체가 엄청 초보 스러움, 완성도 떨어지나 쉬움
  특징 : 소설 연재를 목적으로 함, 사용자에 의한 게시판 생성이 가능
      , 사용자는 게시판 설정을 직접 수정할 수 있음
      , 상/하단 파일을 붙이더라도 상/하단 파일이 붙지 않는 게시판으로 링크 가능
      , 기능 엄청 단순 - 그룹, 카테고리, 메모, 포인트, 투표 등등 암것도 없음, 단순한 게시판

  사용환경 : PHP 4.3 이상, MySQL 4.0이상


이번시간에는 노벨보드에서 사용할 간단한 함수 몇가지에 대해 알아 보겠습니다.
게시판에서 공통적으로 쓰는 함수가 있습니다.

  1. 암호
    게시물을 저장할 때 암호를 저장합니다.
    다른 사람이 함부로 수정하지 못하게 하기 위함입니다.
    암호화 하는 방법은 여러가지가 있는데 MySQL 자체에서 지원하는 암호화 함수 password()를 가장 많이 사용하는 듯 합니다.
    ( 최근 버전의 MySQL에서는 함수 이름이 다르다고 하는데 잘모르겠습니다 ^^;; )
    전에는 password()로 암호화 한 암호는 해석이 불가능하다 했지만 최근 몇 달전 이 함수로 암호화된 암호를 해석할 수 있는 알고리즘이 인터넷을 떠들석 하게 한 적이 있습니다.
    designboard.net 사이트에서는 이문제를 심각하게 받아 들였던 것으로 기억합니다.
    ( designboard.net에서는 구누보드 처럼 저작권 표시를 하지 않아도 되는 게시판을 개발하고 있습니다. - 소스 내부의 저작권 표시는 삭제 불가 )
    그누보드와 제로보드에서는 이 함수를 사용하여 암호화 하고 있습니다.
    노벨보드에서는 PHP에서 지원하는 암호화 함수를 사용합니다.
    소스는 아래와 같습니다.

    <?

    /* 문자를 암호화 */
    function pass_make( $nm_passwd ) {
        $num = crypt( md5( '$nm_passwd' ), chr( mt_rand( 176, 223 ) ).chr( mt_rand( 176, 223 ) ) );
    return $num;
    }

    /* 문자를 암호와 비교 */
    function pass_chek( $nm_passwd,  $db_passwd ) {
        $chek = substr( $db_passwd, 0, 2 );
        $num = crypt( md5( '$nm_passwd' ), $chek );
        if( $db_passwd != $num ) return 0;
        return 1;
    }

    ?>

    먼저 pass_make() 함수를 살펴 보도록 하겠습니다.
    crypt() 와 md5() 두 함수를 사용하여 입력 받은 문자를 암호화 합니다.
    md5( '문자' ) 의 형식으로 문자를 입력하면 암호화 합니다.
    그러면 32자리(맞나?!)의 암호 코드를 출력합니다.
    같은 문자를 다시 입력하면 똑같은 암호 코드가 출력됩니다.
    이것을 렌덤하게 암호화 시키기 위해 crypt() 함수를 사용합니다.
    렌덤하게 암호화 시킨다는 의미는 같은 문자를 암호화 하더라도 매번 다른 암호 코드가 만들어 진다는 의미 입니다.
    crypt( '문자', '2자리 암호 코드' ) 의 형식으로 사용하며 함수는 두 자리의 코드를 입력 받아 이것을 이용해 암호화 합니다.
    이 두자리의 코드를 렌덤하게 만들어 주면 암호하 할 때 마다 항상 다른 암호 코드가 만들어 지게 됩니다.
    소스에서 chr( mt_rand( 176, 223 ) ) 라는 부분을 볼 수 있는데 mt_rand가 렌덤 숫자를 만들어 주는 함수 인데 mt_rand( 시작 숫자, 마지막 숫자 ) 형식으로 사용합니다.
    시작 숫자 부터 마지막 숫자 사이의 숫자로 렌덤하게 만들어 줍니다.
    이 것을 chr()의 입력으로 사용합니다.
    chr() 함수는 숫자를 문자로 바꾸어 주는 함수 입니다.
    여기서 주의해야 할 점은 아무 숫자나 사용하면 문제가 발생합니다.
    어떤 특정 동작을 하는 문자가 있기 때문입니다.
    예를 들면 키보드의 백스페이스(뒤로 한글자 지우는) 키가 있습니다.
    컴퓨터에서는 이런 키도 하나의 문자로 정의 되어 있습니다.
    그런 이유로 저는 176에서 223사이만을 사용합니다.

    요약합니다.
    일정한 숫자 사이의 수를 렘덤하게 만든다 -> 문자로 변환( 암호 코드로 사용할 문자 ) -> md5() 함수로 암호로 바꿀 문자를 암호화 한다 -> crypt() 함수를 이용해 암호화된 문자를 암호 코드를 이용해 암호화 한다.

    장점 : 2번 암호화 하므로 더 안전
    단점 : 느리다 그러나 암호화 하는 것은 첨 가입했을 때와 로그인 할 때 뿐이므로 부담이 적습니다.

    로그인 할 때 마다 입력받은 암호를 저장되어 있는 것과 비교해야 하는데 이것을 위한 함수가 위의 pass_chek() 함수입니다.
    저장되어 있는 암호 앞 두자리는 crypt() 함수에서 사용한 두자리 암호 코드 이므로 이것을 뽑아 비교할 암호를 md5() 함수로 암호화 하고 두자리 암호 코드를 이용해 crypt() 암호화 해서 최종 결과를 저장되어 있는 암호와 비교하는 것입니다.

    솔직히 렌덤하게 암호화 한다는 것보다는 두번 암호화 한다는데 의의가 있습니다.

    두 자리 암호 코드 까지 암호화 하면 비교할 수 가 없으므로 이것을 고정으로 하고 DB에 입력할 때 password()함수로 다시 암호화 한다면 더 안전하겠지요.
    그러나 이렇게 까지 할 필요는 없겠지요? 3번 암호화 ^^;;
    두 번 암호화 한것도 해석이 불가능 할듯.....

  2. URL 이동 / 경고 메세지 출력
    이 기능은 구누보드에 있는 소스를 사용했습니다.
    소스에서 어려운 부분은 없습니다.
    그냥 읽어 보시면 다들 아실듯...

  <?

    // 메타태그를 이용한 URL 이동
    function gotourl($url) {
        echo "<meta http-equiv=\"refresh\" content=\"0;url=$url\">";
        exit;
    }

    // 경고 메세지 출력
    function alert($msg, $url='')
    {
        if (!$msg) $msg = "올바른 방법으로 이용해 주십시오.";

        echo "<script language='javascript'>alert('$msg');";
        if (!$url) echo "history.go(-1);";
        echo "</script>";
        if ($url) echo "<meta http-equiv='refresh' content='0;url=$url'>";
        exit;
    }

    ?>

다음에는 MySQL 접속 방법과 그 사용 예를 다루도록 하겠습니다. ^^
추천
0
  • 복사

댓글 1개

© SIRSOFT
현재 페이지 제일 처음으로