그누보드 [G4/G5] MySQL 4.0 의 password(16byte)를 MySQL 4.1.x, 5.x, 8.x 이후 41byte 또는 create_hash 로 변경
페이지 정보

본문
제로보드와 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를 돌려주게 됩니다.
MySQL 8+ 분기에서 “새로운 별(*)SHA-256” 생성
즉, 회원정보를 옮겨오면 로그인이 안되는것이죠.
다음과 같이하면 됩니다.
2025-09-02
새로운 방식으로 전면 교체
2019-02-13
mysql 5.7 이상일때 old_password 함수가 제거되어 그것에 대응하는 코드를 추가했습니다.
2019-12-17
그누보드 5.4 의 새로운 암호화 방식인 PBKDF2 대응 코드 추가
기존 16비트 암호 mb_password 필드의 값은 PBKDF2 로 변경되고, mb_password2 에는 41바이트 형식의 암호로 변경 저장
2020-11-21
비밀번호 체크 로직개선
2021-01-06
그누보드 5.4 에서 도입된 create_hash 에 대한 패스워드 대응코드가 추가
2021-05-11
mysql 5.1.45 에서 버전 확인 안되는 현상이 확인되어 그것에 대응하는 코드를 lib/common.lib.php 를 수정
2021-11-05
그누보드4 쿼리 최적화 작업
2023-06.12
그누보드5.5.8.2.5 ~ / bbs / login_check.php 수정
2024-03-28
sql_fetch("SELECT VERSION() AS version");
mariaDB 10.6 에서 문제발생 확인되어 common.lib.php 내용변경
2024-03-29
mysql 8.0 / mariaDB 12.4 이상일때 암호 대응 코드 추가
Ⅰ. 그누보드 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'];
}
아래에 내용을 추가된 password 변환에 관련된 내용을 삭제합니다
추가된 내용이 없으면 패스 합니다
2. 그누보드5 / extend / password_hash.extend.php 생성후 아래 내용 저장
<?php
if (!defined('_GNUBOARD_')) exit;
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- Start --
// MySQL 4.1+ 41자 해시: "*" + UPPER(SHA1(UNHEX(SHA1(password))))
function mysql41_password_hash($plain) {
// inner sha1 in binary, outer sha1 in hex
$inner = sha1($plain, true); // binary
$outer = strtoupper(sha1($inner, false)); // hex
return '*' . $outer; // 41 chars including leading '*'
}
// MySQL 3.23~4.0 16자 해시 (old_password) - PHP 구현
function mysql323_password_hash($plain) {
if ($plain === '') return '';
$nr = 1345345333;
$add = 7;
$nr2 = 0x12345671;
foreach (str_split($plain) as $c) {
if ($c === ' ' || $c === "\t") continue;
$tmp = ord($c);
$nr ^= ((($nr & 63) + $add) * $tmp) + (($nr << 8) & 0xFFFFFFFF);
$nr2 += (($nr2 << 8) & 0xFFFFFFFF) ^ $nr;
$add += $tmp;
}
// 31-bit mask
$bit = (1 << 31) - 1;
// lower-case hex 16 chars
return sprintf("%08x%08x", $nr & $bit, $nr2 & $bit);
}
// 저장된 해시 모양으로 타입 판정
function looks_like_mysql41($hash) {
// 길이 상수도 참고 (41 기본)
$len_ok = (isset($hash[0]) && strlen($hash) === (defined('G5_MYSQL_PASSWORD_LENGTH') ? G5_MYSQL_PASSWORD_LENGTH : 41));
return $len_ok && $hash[0] === '*' && ctype_xdigit(substr($hash, 1));
}
function looks_like_mysql323($hash) {
// 16자 old_password
$len_ok = (strlen($hash) === 16);
return $len_ok && ctype_xdigit($hash);
}
// 레거시 해시 비교: 저장된 $stored 이 41자 또는 16자면 해당 알고리즘으로 비교
function match_legacy_mysql_password($plain, $stored) {
if (looks_like_mysql41($stored)) {
return hash_equals(mysql41_password_hash($plain), $stored);
}
if (looks_like_mysql323($stored)) {
// mysql323_password_hash 는 소문자 hex를 냅니다. 저장값이 대소문자 섞여 있다면 맞춰주세요.
return hash_equals(strtolower(mysql323_password_hash($plain)), strtolower($stored));
}
return false;
}
// 설정에 맞춘 “최종” 업그레이드 대상 해시 생성기
function gb_target_password_hash($plain) {
if (defined('G5_STRING_ENCRYPT_FUNCTION') && G5_STRING_ENCRYPT_FUNCTION === 'sql_password') {
// 구형 호환 모드 유지 희망 시 (41자)
return sql_password($plain);
}
// 기본: create_hash (그누보드 표준)
return get_encrypt_string($plain);
}
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- End --
3. 그누보드5 / bbs / login_check.php
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- Start --
// mb_password2 컬럼에 보조 보관(41자 레거시나 참고용)
$field_query = "SHOW COLUMNS FROM `{$g5['member_table']}` WHERE `Field` = 'mb_password2';";
$field_row = sql_fetch( $field_query );
if(!$field_row['Field']) {
sql_query(" ALTER TABLE `{$g5['member_table']}` ADD `mb_password2` varchar(255) NOT NULL DEFAULT '' AFTER `mb_password` ", true);
}
if (match_legacy_mysql_password($mb_password, $mb['mb_password'])) {
// 안전: 동시성 고려해서 현재 해시가 레거시일 때만 갱신
$safe_id = sql_real_escape_string($mb['mb_id']);
$old_stored = sql_real_escape_string($mb['mb_password']);
$new_hash = gb_target_password_hash($mb_password); // create_hash or 41자
$legacy_ref = sql_password($mb_password); // 참고용(41자) 저장
// 동시성 안전: 기존 값 일치할 때만 갱신
$sql = "
UPDATE `{$g5['member_table']}`
SET mb_password = '".sql_real_escape_string($new_hash)."',
mb_password2 = '".sql_real_escape_string($legacy_ref)."'
WHERE mb_id = '{$safe_id}'
AND mb_password = '{$old_stored}'
";
sql_query($sql);
} else {
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- ing --
// 여기부터 기존 내용
...
기존내용은 아래 참고
...
}
// 여기까지 기존 내용
} // 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- End --
3-1. 그누보드5.2 / bbs / login_check.php
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
3-2. 그누보드5.3 / bbs / login_check.php
if (!$is_social_password_check && (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) ) {
alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}
3-3. 그누보드5.4 ~ 5.5.8.2.4 / bbs / login_check.php
if (!$is_social_password_check && (! (isset($mb['mb_id']) && $mb['mb_id']) || !login_password_check($mb, $mb_password, $mb['mb_password'])) ) {
run_event('password_is_wrong', 'login', $mb);
alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}
3-4. 그누보드5.5.8.2.5 ~ / bbs / login_check.php
if (!$is_need_not_password && (! (isset($mb['mb_id']) && $mb['mb_id']) || !login_password_check($mb, $mb_password, $mb['mb_password'])) ) {
run_event('password_is_wrong', 'login', $mb);
alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}
4. 그누보드5.2 / bbs / password_check.php
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- Start --
// 레거시 감지 시 업그레이드
if (match_legacy_mysql_password($wr_password, $wr['wr_password'])) {
// 게시글 비번은 전통적으로 sql_password() 형식을 써온 경우가 많습니다.
// 다만 사이트 정책을 통일하려면 회원과 마찬가지로 설정을 따르는 것이 일관적입니다.
$new_hash = gb_target_password_hash($wr_password);
sql_query("UPDATE `{$g5['write_prefix']}{$bo_table}` SET wr_password = '".sql_real_escape_string($new_hash)."' WHERE wr_id = '".(int)$wr_id."'");
} else {
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- ing --
// 여기부터 기존 내용
...
기존 내용은 아래 참고 , if ($w == 's') { 와 } else if ($w == 'sc') { 모두 적용합니다
...
// 여기까지 기존 내용
}// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- End --
4-1. 그누보드5.2 / bbs / password_check.php
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된 16byte 패스워드을 허용하면서 41byte 로 변경 저장하기
if (sql_password($wr_password) != $wr[wr_password])
alert("패스워드가 틀립니다.");
4-2. 그누보드5.3 / bbs / password_check.php
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된 16byte 패스워드을 허용하면서 41byte 로 변경 저장하기
if (!check_password($wr_password, $wr['wr_password']))
alert('비밀번호가 틀립니다.');
4-3. 그누보드5.4 ~ / bbs / password_check.php
if (!check_password($wr_password, $wr['wr_password'])) {
run_event('password_is_wrong', 'bbs', $wr, $qstr);
alert('비밀번호가 틀립니다.');
}
Ⅱ. 그누보드 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_query(" update `{$g4['member_table']}` set mb_password='". sql_password($mb_password) ."' where mb_id='{$mb_id}' ");
}
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_query("update `{$g4['write_prefix']}{$bo_table}` set wr_password='". sql_password($wr_password) ."' where wr_id='{$wr_id}' ");
}
참고자료
https://sir.kr/g4_tiptech/1212
https://sir.kr/g4_tiptech/21757
https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=81926
MySQL 4.1, 5.x 이후에 생성된 회원password ( 41byte )를 MySQL 4.0.x 이하 ( 16byte )로 변경하는 방법
https://www.happyjung.com/lecture/1689
4.0이하는 16바이트,
4.1이상은 40바이트의 hashed value를 가집니다.
패스워드가 모두 옛날 password()함수로 되어있습니다.
최근에 호스트쪽에서 MySQL 4.1.X로 업그레이드를 해서 지금 설치된 그누보드는 password()를 쓸때에 모두 16바이트 대신 40바이트의 hashed value를 돌려주게 됩니다.
MySQL 8+ 분기에서 “새로운 별(*)SHA-256” 생성
즉, 회원정보를 옮겨오면 로그인이 안되는것이죠.
다음과 같이하면 됩니다.
2025-09-02
새로운 방식으로 전면 교체
2019-02-13
mysql 5.7 이상일때 old_password 함수가 제거되어 그것에 대응하는 코드를 추가했습니다.
2019-12-17
그누보드 5.4 의 새로운 암호화 방식인 PBKDF2 대응 코드 추가
기존 16비트 암호 mb_password 필드의 값은 PBKDF2 로 변경되고, mb_password2 에는 41바이트 형식의 암호로 변경 저장
2020-11-21
비밀번호 체크 로직개선
2021-01-06
그누보드 5.4 에서 도입된 create_hash 에 대한 패스워드 대응코드가 추가
2021-05-11
mysql 5.1.45 에서 버전 확인 안되는 현상이 확인되어 그것에 대응하는 코드를 lib/common.lib.php 를 수정
2021-11-05
그누보드4 쿼리 최적화 작업
2023-06.12
그누보드5.5.8.2.5 ~ / bbs / login_check.php 수정
2024-03-28
sql_fetch("SELECT VERSION() AS version");
mariaDB 10.6 에서 문제발생 확인되어 common.lib.php 내용변경
2024-03-29
mysql 8.0 / mariaDB 12.4 이상일때 암호 대응 코드 추가
Ⅰ. 그누보드 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'];
}
아래에 내용을 추가된 password 변환에 관련된 내용을 삭제합니다
추가된 내용이 없으면 패스 합니다
2. 그누보드5 / extend / password_hash.extend.php 생성후 아래 내용 저장
<?php
if (!defined('_GNUBOARD_')) exit;
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- Start --
// MySQL 4.1+ 41자 해시: "*" + UPPER(SHA1(UNHEX(SHA1(password))))
function mysql41_password_hash($plain) {
// inner sha1 in binary, outer sha1 in hex
$inner = sha1($plain, true); // binary
$outer = strtoupper(sha1($inner, false)); // hex
return '*' . $outer; // 41 chars including leading '*'
}
// MySQL 3.23~4.0 16자 해시 (old_password) - PHP 구현
function mysql323_password_hash($plain) {
if ($plain === '') return '';
$nr = 1345345333;
$add = 7;
$nr2 = 0x12345671;
foreach (str_split($plain) as $c) {
if ($c === ' ' || $c === "\t") continue;
$tmp = ord($c);
$nr ^= ((($nr & 63) + $add) * $tmp) + (($nr << 8) & 0xFFFFFFFF);
$nr2 += (($nr2 << 8) & 0xFFFFFFFF) ^ $nr;
$add += $tmp;
}
// 31-bit mask
$bit = (1 << 31) - 1;
// lower-case hex 16 chars
return sprintf("%08x%08x", $nr & $bit, $nr2 & $bit);
}
// 저장된 해시 모양으로 타입 판정
function looks_like_mysql41($hash) {
// 길이 상수도 참고 (41 기본)
$len_ok = (isset($hash[0]) && strlen($hash) === (defined('G5_MYSQL_PASSWORD_LENGTH') ? G5_MYSQL_PASSWORD_LENGTH : 41));
return $len_ok && $hash[0] === '*' && ctype_xdigit(substr($hash, 1));
}
function looks_like_mysql323($hash) {
// 16자 old_password
$len_ok = (strlen($hash) === 16);
return $len_ok && ctype_xdigit($hash);
}
// 레거시 해시 비교: 저장된 $stored 이 41자 또는 16자면 해당 알고리즘으로 비교
function match_legacy_mysql_password($plain, $stored) {
if (looks_like_mysql41($stored)) {
return hash_equals(mysql41_password_hash($plain), $stored);
}
if (looks_like_mysql323($stored)) {
// mysql323_password_hash 는 소문자 hex를 냅니다. 저장값이 대소문자 섞여 있다면 맞춰주세요.
return hash_equals(strtolower(mysql323_password_hash($plain)), strtolower($stored));
}
return false;
}
// 설정에 맞춘 “최종” 업그레이드 대상 해시 생성기
function gb_target_password_hash($plain) {
if (defined('G5_STRING_ENCRYPT_FUNCTION') && G5_STRING_ENCRYPT_FUNCTION === 'sql_password') {
// 구형 호환 모드 유지 희망 시 (41자)
return sql_password($plain);
}
// 기본: create_hash (그누보드 표준)
return get_encrypt_string($plain);
}
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- End --
3. 그누보드5 / bbs / login_check.php
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- Start --
// mb_password2 컬럼에 보조 보관(41자 레거시나 참고용)
$field_query = "SHOW COLUMNS FROM `{$g5['member_table']}` WHERE `Field` = 'mb_password2';";
$field_row = sql_fetch( $field_query );
if(!$field_row['Field']) {
sql_query(" ALTER TABLE `{$g5['member_table']}` ADD `mb_password2` varchar(255) NOT NULL DEFAULT '' AFTER `mb_password` ", true);
}
if (match_legacy_mysql_password($mb_password, $mb['mb_password'])) {
// 안전: 동시성 고려해서 현재 해시가 레거시일 때만 갱신
$safe_id = sql_real_escape_string($mb['mb_id']);
$old_stored = sql_real_escape_string($mb['mb_password']);
$new_hash = gb_target_password_hash($mb_password); // create_hash or 41자
$legacy_ref = sql_password($mb_password); // 참고용(41자) 저장
// 동시성 안전: 기존 값 일치할 때만 갱신
$sql = "
UPDATE `{$g5['member_table']}`
SET mb_password = '".sql_real_escape_string($new_hash)."',
mb_password2 = '".sql_real_escape_string($legacy_ref)."'
WHERE mb_id = '{$safe_id}'
AND mb_password = '{$old_stored}'
";
sql_query($sql);
} else {
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- ing --
// 여기부터 기존 내용
...
기존내용은 아래 참고
...
}
// 여기까지 기존 내용
} // 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- End --
3-1. 그누보드5.2 / bbs / login_check.php
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
3-2. 그누보드5.3 / bbs / login_check.php
if (!$is_social_password_check && (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) ) {
alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}
3-3. 그누보드5.4 ~ 5.5.8.2.4 / bbs / login_check.php
if (!$is_social_password_check && (! (isset($mb['mb_id']) && $mb['mb_id']) || !login_password_check($mb, $mb_password, $mb['mb_password'])) ) {
run_event('password_is_wrong', 'login', $mb);
alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}
3-4. 그누보드5.5.8.2.5 ~ / bbs / login_check.php
if (!$is_need_not_password && (! (isset($mb['mb_id']) && $mb['mb_id']) || !login_password_check($mb, $mb_password, $mb['mb_password'])) ) {
run_event('password_is_wrong', 'login', $mb);
alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}
4. 그누보드5.2 / bbs / password_check.php
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- Start --
// 레거시 감지 시 업그레이드
if (match_legacy_mysql_password($wr_password, $wr['wr_password'])) {
// 게시글 비번은 전통적으로 sql_password() 형식을 써온 경우가 많습니다.
// 다만 사이트 정책을 통일하려면 회원과 마찬가지로 설정을 따르는 것이 일관적입니다.
$new_hash = gb_target_password_hash($wr_password);
sql_query("UPDATE `{$g5['write_prefix']}{$bo_table}` SET wr_password = '".sql_real_escape_string($new_hash)."' WHERE wr_id = '".(int)$wr_id."'");
} else {
// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- ing --
// 여기부터 기존 내용
...
기존 내용은 아래 참고 , if ($w == 's') { 와 } else if ($w == 'sc') { 모두 적용합니다
...
// 여기까지 기존 내용
}// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴 2025.09.02 -- End --
4-1. 그누보드5.2 / bbs / password_check.php
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된 16byte 패스워드을 허용하면서 41byte 로 변경 저장하기
if (sql_password($wr_password) != $wr[wr_password])
alert("패스워드가 틀립니다.");
4-2. 그누보드5.3 / bbs / password_check.php
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된 16byte 패스워드을 허용하면서 41byte 로 변경 저장하기
if (!check_password($wr_password, $wr['wr_password']))
alert('비밀번호가 틀립니다.');
4-3. 그누보드5.4 ~ / bbs / password_check.php
if (!check_password($wr_password, $wr['wr_password'])) {
run_event('password_is_wrong', 'bbs', $wr, $qstr);
alert('비밀번호가 틀립니다.');
}
Ⅱ. 그누보드 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_query(" update `{$g4['member_table']}` set mb_password='". sql_password($mb_password) ."' where mb_id='{$mb_id}' ");
}
// 원본
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_query("update `{$g4['write_prefix']}{$bo_table}` set wr_password='". sql_password($wr_password) ."' where wr_id='{$wr_id}' ");
}
참고자료
https://sir.kr/g4_tiptech/1212
https://sir.kr/g4_tiptech/21757
https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=81926
MySQL 4.1, 5.x 이후에 생성된 회원password ( 41byte )를 MySQL 4.0.x 이하 ( 16byte )로 변경하는 방법
https://www.happyjung.com/lecture/1689
댓글목록
등록된 댓글이 없습니다.