MySQL 4.0이하 생성된 회원password 및 비회원 게시글 비밀번호를 MySQL 4.1, 5.x로 > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

MySQL 4.0이하 생성된 회원password 및 비회원 게시글 비밀번호를 MySQL 4.1, 5.x로 정보

MySQL 4.0이하 생성된 회원password 및 비회원 게시글 비밀번호를 MySQL 4.1, 5.x로

본문

제로보드와 GNU보드 둘다 회원들의 password를 관리할때 MySQL의 password()를 사용하는데 이 함수가 4.0이하와 4.1이상에서 다른 hashing value를 가집니다. 다 아시겠지만 4.0이하는 16바이트,
4.1이상은 40바이트의 hashed value를 가집니다.

패스워드가 모두 옛날 password()함수로 되어있습니다.
최근에 호스트쪽에서 MySQL 4.1.X로 업그레이드를 해서 지금 설치된 그누보드는 password()를 쓸때에 모두 16바이트 대신 40바이트의 hashed value를 돌려주게 됩니다.

즉, 회원정보를 옮겨오면 로그인이 안되는것이죠.
다음과 같이하면 됩니다.


1. 그누보드 / lib / common.lib.php 의 1111번째 줄에
function sql_password($value) 를 검색해서 아래와 같이 함수를 추가합니다.

function sql_old_password($value)
{
    $row = sql_fetch(" select old_password('$value') as pass ");
    return $row[pass];
}

function sql_password($value)
{
    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
    $row = sql_fetch(" select password('$value') as pass ");
    return $row[pass];
}


2. 그누보드 / bbs / login_check.php 의 25번째줄의
// 수정전
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
    alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}

// 수정후
if (sql_old_password($mb_password) == $mb[mb_password]) { // 옛날 패스워드를 새로운 패스워드로 바꿉니다.
    $sql = " update $g4[member_table] set mb_password='" . sql_password($mb_password) . "' where mb_id='$mb_id' ";
    sql_query($sql);
} elseif (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
    alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}


3. 그누보드 / bbs / register_form.php 의 73번째 줄을  <<== 요거는 안해도 되어요...

// 원본
    if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]))
        alert("패스워드가 틀립니다.");
// 수정
if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]) && !($member[mb_password] == sql_old_password($_POST[mb_password]) && $_POST[mb_password]))
        alert("패스워드가 틀립니다.");


옛날 사용자가 mysql 4.0.x 패스워드방식(16 bytes)을 사용하여 로그인하면 mysql 4.1.x 버젼의 패스워드(41 bytes)를 멤버테이블의 mb_password 에 저장하게 됩니다.
 
로그인할때에만 현재의 패스워드 방식을 확인하고 새로운 패스워드 포맷으로 DB 에 업데이트 하므로 /bbs/register_form.php, /bbs/member_leave.php 를 수정할 필요가 없습니다.
모든 회원이 한번이라도 로그인하게 되면 패스워드가 모두 새로운 패스워드 포맷으로 저장되게 되므로 그누보드가 버젼업될때마다 해당코드를 수정하지 않아도 됩니다.


4. 그누보드 / bbs / password_check.php 의 9~10 줄
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된  16byte 패스워드을 허용하면서 41byte 로 변경 저장하기

// 원본
    if (sql_password($wr_password) != $wr[wr_password])
        alert("패스워드가 틀립니다.");
// 수정
    //if (sql_password($wr_password) != $wr[wr_password])
    //    alert("패스워드가 틀립니다.");
    if (sql_old_password($wr_password) == $wr[wr_password]) { // 옛날 패스워드를 새로운 패스워드로 바꿉니다.
      $sql = "update ". $g4['write_prefix'] . $bo_table ." set wr_password='". sql_password($wr_password) ."' where wr_id='$wr_id' ";
      sql_query($sql);
    } elseif (sql_password($wr_password) != $wr[wr_password]) {
      alert("패스워드가 틀립니다.");
    }


참고자료
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=1212
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=21757
추천
0

댓글 8개

전체 85 |RSS
그누4 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT