본문 바로가기

IT, Computer/Linux

그누보드5 설치(php7, mysql8)

이 글은 앞서 포스팅한 'CENTOS7 APM 설치' 시리즈에서 설치한 환경에서는 정확히 동작합니다.

또한 앞서 포스팅한 3개의 글을 참고하시는게 도움이됩니다.

 

사용중인버전

centos 7 apache mysql php openssl
1810 2.4.38 8.0.15 7.3.3 1.1.1b

??? : php7에 mysql8에다가 그누5를 설치하신다구요~~?

제맘입니다 ㅎ

 

 

 

그누보드5는 php5용 프레임워크입니다. 작게는 게시판, 크게는 프레임워크 자체를 사이트에서 사용합니다.

꽤 보편적인 프레임워크이지요.

 

https://sir.kr/g5_pds 

 

그누보드5 다운로드 > SIR

그누보드, 영카트 개발사로 웹사이트와 쇼핑몰을 무료로 만들수 있는 수많은 솔루션을 무료로 제공하고 있으며 다국어버전도 배포하고 있습니다.

sir.kr

여기서 그누보드5를 다운받으실 수 있습니다.

 

저는 그누보드5 설치에 앞서서

여기서 저는 유저goat를 이용할것이며 /home/goat/public_html/gnuboard 에서 사용할 예정입니다.

DNS셋팅에서 gnu.goatasriel.com 도메인을 활성화 시켰으며

apache vhost에서 gnu.goatasriel.com이 /home/goat/public_html/gnuboard 로 프록시 할 수 있게 셋팅하였습니다.

mysql에서 goat계정을 만들고 gnu_goat라는 데이터베이스를 만들고 그에대한모든권한을 goat계정에 할당했습니다.

마지막으로 httpd, mysqld, named의 서비스를 활성화 시켰습니다.

이에 대해선 자세히 포스팅 하지않을예정입니다.

(제가 앞서 쓴글에서 참고가능하며, 모두가 다 환경도 다르니...)

 

 

 

우선 작업을 진행할 디렉토리로 이동합니다.

$ cd /home/goat/public_html/gnuboard

 

다운로드한 그누보드5를 ftp나 wget등등으로 옮깁니다.(전ftp로 옮겼습니다.)

 

다운받은 압축파일을 풉니다.

$ tar -xvzf gnuboard5.3.2.8.tar.gz

 

웹브라우저에서 gnu.goatasriel.com으로 접속을 합니다.

여기서 그누보드5를 설치하기를 누르면 좋겠지만

아시다 싶이 php7에 mysql8..

특히 문제되는게 mysql8에서 설치를 시도하는것이기 때문에 그누5가 당연히 있다고 생각하고 설계된 PASSWORD함수를 사용할 수 없습니다.

PASSWORD함수를 대체할것을 찾고 그것에 맞게 수정해야합니다.

 

※ 저도 이게 정답인진 모르겠습니다.

 

암호화알고리즘은 https://offbyone.tistory.com/347 를 참고하였습니다.

저는 아래의 4개의 파일을 수정할 것입니다.

lib/common.lib.php

bbs/login_check.php

bbs/register_from_update.php

install/install_db.php

common파일은 순수해야한다는 분들은 입맛에 맞게 수정하셔도됩니다.

 

$ vi lib/common.lib.php

//순백염소수정
function sql_password($value)
{
    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
    //$row = sql_fetch(" select password('$value') as pass ");
    $row = sql_fetch(" select md5('$value') as pass ");

    return $row['pass'];
}
//순백염소끝

1557번 라인부터입니다

기존 password함수를 md5함수로 변경합니다.

비회원비밀번호등에 쓰이게 될것입니다.

 

// 순백염소수정
// openssl_encrypt 함수를 이용한 문자열 암호화
function get_opensslEncrypt_string($plainText)
{
    // 256 bit 키를 만들기 위해서 비밀번호를 해시해서 첫 32바이트를 사용합니다.
    $hash = substr(hash('sha256', $plainText, true), 0, 32);
    // Initial Vector(IV)는 128 bit(16 byte)입니다.
    $iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
    // 암호화
    $encrypted = base64_encode(openssl_encrypt($plainText, 'aes-256-cbc', $hash, OPENSSL_RAW_DATA, $iv));

    return $encrypted;
}
// openssl_decrypt 함수를 이용한 문자열 복호화
function check_password_openssl($pass, $plainText)
{
    $hash = substr(hash('sha256', $pass, true), 0, 32);
    $iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
    $decrypted = openssl_decrypt(base64_decode($plainText), 'aes-256-cbc', $hash, OPENSSL_RAW_DATA, $iv);
    return ($pass===$decrypted);
}
// 순백염소

함수2개를 추가합니다. 참고로 저는 3053번 라인에 추가작성했습니다.

회원로그인, 회원가입등에 사용될 것입니다.

 

$ vi bbs/login_check.php

//소셜 로그인이 맞다면 패스워드를 체크하지 않습니다.
// 가입된 회원이 아니다. 비밀번호가 틀리다. 라는 메세지를 따로 보여주지 않는 이유는
// 회원아이디를 입력해 보고 맞으면 또 비밀번호를 입력해보는 경우를 방지하기 위해서입니다.
// 불법사용자의 경우 회원아이디가 틀린지, 비밀번호가 틀린지를 알기까지는 많은 시간이 소요되기 때문입니다.
if (!$is_social_password_check && (!$mb['mb_id'] || !check_password_openssl($mb_password, $mb['mb_password'])) ) { //순백염소 수정 (if (!$is_social_password_check && (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) ) {)
    alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}

28번 라인부터입니다.

기존에 check_password 함수를 check_password_openssl 함수로 변경합니다.

 

$ vi bbs/register_from_update.php

//순백염소수정(mb_password = '".get_encrypt_string($mb_password)."')
if ($w == '') {
    $sql = " insert into {$g5['member_table']}
                set mb_id = '{$mb_id}',
                     mb_password = '".get_opensslEncrypt_string($mb_password)."',
                     mb_name = '{$mb_name}',
                     mb_nick = '{$mb_nick}',
                     mb_nick_date = '".G5_TIME_YMD."',
                     mb_email = '{$mb_email}',
                     mb_homepage = '{$mb_homepage}',
                     mb_tel = '{$mb_tel}',
                     mb_zip1 = '{$mb_zip1}',
                     mb_zip2 = '{$mb_zip2}',
                     mb_addr1 = '{$mb_addr1}',
                     mb_addr2 = '{$mb_addr2}',
                     mb_addr3 = '{$mb_addr3}',
                     mb_addr_jibeon = '{$mb_addr_jibeon}',
                     mb_signature = '{$mb_signature}',
                     mb_profile = '{$mb_profile}',
                     mb_today_login = '".G5_TIME_YMDHIS."',
                     mb_datetime = '".G5_TIME_YMDHIS."',
                     mb_ip = '{$_SERVER['REMOTE_ADDR']}',
                     mb_level = '{$config['cf_register_level']}',
                     mb_recommend = '{$mb_recommend}',
                     mb_login_ip = '{$_SERVER['REMOTE_ADDR']}',
                     mb_mailling = '{$mb_mailling}',
                     mb_sms = '{$mb_sms}',
                     mb_open = '{$mb_open}',
                     mb_open_date = '".G5_TIME_YMD."',
                     mb_1 = '{$mb_1}',
                     mb_2 = '{$mb_2}',
                     mb_3 = '{$mb_3}',
                     mb_4 = '{$mb_4}',
                     mb_5 = '{$mb_5}',
                     mb_6 = '{$mb_6}',
                     mb_7 = '{$mb_7}',
                     mb_8 = '{$mb_8}',
                     mb_9 = '{$mb_9}',
                     mb_10 = '{$mb_10}'
                     {$sql_certify} ";
//순백염소끝

200번 라인부터입니다.

sql 구문에서 mb_password 부분이 변경되었습니다. (위 주석에 기존에 쓰였던 함수가있으니 참고)

 

$ vi install/install_db.php

// 관리자 회원가입
//순백염소수정 (mb_password = PASSWORD('$admin_pass'),)
$sql = " insert into `{$table_prefix}member`
            set mb_id = '$admin_id',
                 mb_password = '".get_opensslEncrypt_string($admin_pass)."',
                 mb_name = '$admin_name',
                 mb_nick = '$admin_name',
                 mb_email = '$admin_email',
                 mb_level = '10',
                 mb_mailling = '1',
                 mb_open = '1',
                 mb_email_certify = '".G5_TIME_YMDHIS."',
                 mb_datetime = '".G5_TIME_YMDHIS."',
                 mb_ip = '{$_SERVER['REMOTE_ADDR']}'
                 ";
sql_query($sql, true, $dblink);
//순백염소끝

176번 라인부터입니다.

sql 구문에서 mb_password 부분이 변경되었습니다. (위 주석에 기존에 쓰였던 함수가있으니 참고)

 

제가 암호화쪽은 잼병이라 이 방법이 기존의 암호보다 더 강한지 약한지 잘모르겠네요;

이 부분은 여러분이 연습하면서 다른글도 참고해보면서 새로운것을 첨가해보면서 발전하는게 좋을것 같습니다.

 

모든게 수정이 완료가 됬다면 웹페이지 새로고침 한번해주시고

대망의 '그누보드 설치하기' 버튼을 누르시길 바랍니다.

설명대로 진행합니다.

$ mkdir data

$ chmod 707 data/

브라우저 새로고침

 

동의합니다를 체크후 다음을 누릅니다.
사진에서 패스워드는 생략되어있습니다.

host는 mysql이 서비스되고있는 서버의 ip주소를

(httpd와 mysqld가 같은ip에서 서비스를 한다면 localhost 혹은 127.0.0.1로 설정하시면됩니다.)

user는 mysql에서 사용될 유저

password 는 그 mysql 유저의 패스워드

db는 mysql에 할당할 db(비어있는 db를 권장합니다) 입니다.

테이블명 접두사는 가능한 변경하지 말라니까 변경하지 않고 그대로둡니다.

 

아래의 최고관리자정보입력은 웹내에서 사용할 관리자의 아이디와 패스워드를 요구하는거니 편한걸 기입하세요.

다 작성했으면 다음을 누릅니다.

오류없이 여기까지 떴다면, 실수없이 잘진행하신겁니다.

사실 오류를 겪는게 더 좋긴한데,,,  그래야 공부되죠 ㅎ

저는 이까지오는데 엄청 오류가 많았습니다...password함수 오류고친다고말이죠 ..

 

바로 최고관리자 로그인을 시도했습니다.

다행이 로그인을 성공하는군요.

 

테스트를 해봅니다.

일반회원 회원가입후 로그인 정상적으로 되는것 확인

글작성확인 글수정확인 글삭제확인

jpg png gif 사진 업로드확인

비회원수정확....... 실패 md5 구문 추가하고 비회원에서도 글수정확인(그와중에 실패를 맛본..)

 

후 다 끝난것 같습니다.