MySQL 4.0이하에서 만들어진 회원들의 정보및 password 데이타를 MySQL 4.1 이상에서 그냥 이용하기 > 그누4 팁자료실

그누4 팁자료실

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

MySQL 4.0이하에서 만들어진 회원들의 정보및 password 데이타를 MySQL 4.1 이상에서 그냥 이용하기 정보

MySQL 4.0이하에서 만들어진 회원들의 정보및 password 데이타를 MySQL 4.1 이상에서 그냥 이용하기

본문

상당히 특이한 경우지만 저처럼 걸리는 경우가 있어서 -_-

혹시 필요하실 분들을 위해 올립니다.

제로보드와 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를 돌려주게 됩니다. 즉, 회원정보를 옮겨오면

로그인이 안되는것이죠.

다음과 같이하면 됩니다.

common.lib.php에 아래 함수를 넣어줍니다.

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

그리고 login_check.php의 15번째줄을

if (!$mb[mb_id]) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
} else { //id가 있는경우
if ( (sql_password($mb_password) != $mb[mb_password]) && (sql_old_password($mb_password) != $mb[mb_password]) ) {
    alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
}

로 바꾸어 줍니다. 더 간단하게도 쓸수 있지만 논리 에러를 내지 않으려고 일부러 길게 썼습니다.

그리고 register_form.php의 66-67번째 줄을

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("패스워드가 틀립니다.");

로 바꾸어 줍니다. 회원 정보 수정시에 한번더 비밀번호를 체크하기에 여기도 넣어주어야 합니다.

이렇게 해주면 나중에 회원이 비밀번호를 바꾸었을경우에도 제대로 로그인이 됩니다.

그리고 회원들이 모두 비밀번호를 40바이트짜리로 바꾸었을경우에는 위에 바꾼것을 원래대로

돌려 놓는것이 좋습니다.
추천
5

댓글 28개

역시나 해도 안되는군요 ㅎㅎ
그리고 register_form.php의 67-68번째 줄 아닌가요??
파일이 어느 폴더에있는지도 알려줬으면 더 좋았을텐데요...
1. 그누보드 / lib / common.lib.php 의 1096번째 줄에
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 (!$mb[mb_id]) {
  alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
  } else { //id가 있는경우
    if ( (sql_password($mb_password) != $mb[mb_password]) && (sql_old_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("패스워드가 틀립니다.");
2. 그누보드 / bbs / login_check.php의 25번째줄의
로직의 심각한 오류 발견됨 아래 내용으로 교체해주세요.

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패스워드는 대소문자를 구분합니다.");
}
놀랍군요.신규추가되는 건 32비트고 구 회원 16비트도 인식되게 하는 방식이군요.대단합니다.
이런걸 공짜로 알다니 송구스럽네요.
이런 팁은 만원을 주고 사도 아깝지 않은데...
회원정보 수정시 문제가 있습니다.
최신버젼을 깔았더니, 위 코드는 주석처리되서 인제는 사용하지 않은 코드라서요.
그래서, 위에서 말씀하신 이것을
----------------------------------------------------------
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("패스워드가 틀립니다.");


-------------------------------------------------

바뀐 코드에맞도록, 이렇게 바꿔야 됩니다. ^^

    if ($_POST['mb_password']) {
        // 수정된 정보를 업데이트후 되돌아 온것이라면 패스워드가 암호화 된채로 넘어온것임
        if ($_POST['is_update'])
            $tmp_password = $_POST['mb_password'];
        else
{
            $tmp_password = sql_password($_POST['mb_password']);
$tmp_old_password = sql_old_password($_POST['mb_password']);
}

        if ($member['mb_password'] != $tmp_password && $member['mb_password'] != $tmp_old_password)
            alert("패스워드가 틀립니다.");
    }
그누4에서 그누5로 갈아타는데 10년전 이팁이 적용이 잘되네요.
이글 말고 2013년도 팁들은 g4로 나온부분을 g5로 변경해줘도 전 오류가 나던데
이 10년전 팁을 적용하니 로그인 잘됩니다. 감사합니다.
전체 3,313 |RSS
그누4 팁자료실 내용 검색

회원로그인

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