테스트 사이트 - 개발 중인 베타 버전입니다

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

· 20년 전 · 13453 · 28
상당히 특이한 경우지만 저처럼 걸리는 경우가 있어서 -_-

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

제로보드와 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바이트짜리로 바꾸었을경우에는 위에 바꾼것을 원래대로

돌려 놓는것이 좋습니다.

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 28개

mysql 버젼업에 따른 패스워드 호환성 해결
본 게시물이 유일하게 해결책이 되었습니다. 감사합니다.
회원정보 수정시 문제가 있습니다.
최신버젼을 깔았더니, 위 코드는 주석처리되서 인제는 사용하지 않은 코드라서요.
그래서, 위에서 말씀하신 이것을
----------------------------------------------------------
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년전 팁을 적용하니 로그인 잘됩니다. 감사합니다.
감사합니다^^

게시글 목록

번호 제목
903
898
895
882
877
875
872
867
863
860
857
848
840
832
827
812
811
800
793
776