오즈 ::: ozzo.kr

기타 [G4/G5~5.4] MySQL 4.0 의 password(16byte)를 MySQL 4.1.x, 5.x, 5.7x (41by…

페이지 정보

작성자 누보 댓글 0건 조회 71회 작성일 20-11-26 18:01

본문

[G4/G5~5.4] MySQL 4.0 의 password(16byte)를 MySQL 4.1.x, 5.x, 5.7x (41byte)로 변경



2020-11-21
비밀번호 체크 로직개선


Ⅰ. 그누보드 5


1. 그누보드5 / 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 ");

    return $row['pass'];
}

아래위에 내용을 추가합니다

// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- Start --
// mysql 클라이언트 버전확인함수 (by happyjung.com)
function sql_get_client_info($link=null)
{
    global $g5;

    if(!$link)
        $link = $g5['connect_db'];

    if(function_exists('mysqli_get_client_info') && G5_MYSQLI_USE)
        return mysqli_get_client_info($link);
    else
        return mysql_get_client_info($link);
}
if (sql_get_client_info() < '5.7') {
    function sql_old_password($value)
    {
        $row = sql_fetch(" select old_password('{$value}') as pass ");
        return $row['pass'];
    }
} else {
    // mysql 5.7 이상일때
    function sql_old_password($value) {
        if ($value == '')
            return '';

        $nr = 1345345333;
        $add = 7;
        $nr2 = 0x12345671;
        foreach(str_split($value) as $c) {
            if ($c == ' ' or $c == "\t")
                continue;
            $tmp = ord($c);
            $nr ^= ((($nr & 63) + $add) * $tmp) + (($nr << 8) & 0xFFFFFFFF);
            $nr2 += (($nr2 << 8) & 0xFFFFFFFF) ^ $nr;
            $add += $tmp;
        }

        if ($nr2 > PHP_INT_MAX)
            $nr2 += PHP_INT_MAX + 1;

        $bit = (1 << 31) -1;

        return sprintf("%08lx%08lx", $nr & $bit, $nr2 & $bit);
    }
}
// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --



2-1. 그누보드5.2 / bbs / login_check.php
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 {$g5['member_table']} set mb_password='".sql_password($mb_password)."' where mb_id='{$mb_id}' ";
    sql_query($sql);
}



2-2. 그누보드5.3 / bbs / login_check.php
if (!$is_social_password_check && (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) ) {
    alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
if (sql_old_password($mb_password) == $mb['mb_password']) {
    $sql = " update {$g5['member_table']} set mb_password='" . sql_password($mb_password) . "' where mb_id='{$mb_id}' ";
    sql_query($sql);
}



2-3. 그누보드5.4 / bbs / login_check.php
if (!$is_social_password_check && (!$mb['mb_id'] || !login_password_check($mb, $mb_password, $mb['mb_password'])) ) {

    run_event('password_is_wrong', 'login', $mb);

    alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}

위에 내용을 추가합니다 ( 주의: 변경이 아닌 추가 입니다 )

// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
if (sql_old_password($mb_password) == $mb['mb_password']) {
    $sql = " update {$g5['member_table']} set mb_password='".get_encrypt_string($mb_password)."', mb_password2='".sql_password($mb_password)."' where mb_id='{$mb_id}' ";
    sql_query($sql);
}



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

    if (sql_password($wr_password) != $wr[wr_password])
        alert("패스워드가 틀립니다.");

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

    // 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
    if (sql_old_password($wr_password) == $wr['wr_password']) {
      $sql = "update {$g5['write_prefix']}{$bo_table} set wr_password='".sql_password($wr_password)."' where wr_id='{$wr_id}' ";
      sql_query($sql);
    }



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

    if (!check_password($wr_password, $wr['wr_password']))
        alert('비밀번호가 틀립니다.');

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

    // 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
    if (sql_old_password($wr_password) == $wr['wr_password']) {
        $sql = "update {$g5['write_prefix']}{$bo_table} set wr_password='".sql_password($wr_password)."' where wr_id='{$wr_id}' ";
        sql_query($sql);
    }


3-3. 그누보드5.4 / bbs / password_check.php  37줄
    if (!check_password($wr_password, $wr['wr_password'])) {
        run_event('password_is_wrong', 'bbs', $wr, $qstr);
        alert('비밀번호가 틀립니다.');
    }

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

    // 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
    if (sql_old_password($wr_password) == $wr['wr_password']) {
        $sql = "update {$g5['write_prefix']}{$bo_table} set wr_password='".sql_password($wr_password)."' where wr_id='{$wr_id}' ";
        sql_query($sql);
    }


4. 그누보드5.4
g5_member 테이블의  mb_password 뒤에  mb_password2 칼럼을 varchar(255) 로 생성합니다.



Ⅱ. 그누보드 4

1. 그누보드4 / lib / common.lib.php  1180줄

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'];
}

위에 내용 추가

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


2. 그누보드4 / 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);
}



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

    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' ";

댓글목록

등록된 댓글이 없습니다.

접속자

접속자
오늘 29
어제 283
최대 3,913
전체 654,410