2011년 8월 25일 목요일

그누보드 db복구후 로그인 안될 때

http://sir.co.kr/bbs/board.php?bo_table=cm_free&wr_id=461576

http://www.sir.co.kr/bbs/board.php?bo_table=g4_qa&wr_id=199322&sca=&sfl=wr_subject||wr_content&stx=db+%EB%A1%9C%EA%B7%B8%EC%9D%B8&sop=and

http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=21757&sca=&sfl=wr_subject||wr_content&stx=old_password&sop=and

http://phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=140130&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%B9%E9%BE%F7+%BA%B9%B1%B8&sop=and&page=7

https://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=19303&sca=&sfl=wr_subject||wr_content&stx=%EC%9E%90%EB%8F%99%EB%93%B1%EB%A1%9D&sop=and&page=2

https://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=19893&sca=&sfl=wr_subject||wr_content&stx=%EC%9E%90%EB%8F%99%EB%93%B1%EB%A1%9D&sop=and&page=2

http://hosting.digimoon.net/board/?mid=freeboard&sort_index=readed_count&order_type=desc&document_srl=15699

해결
http://opencode.co.kr/bbs/board.php?bo_table=gnu4_tips&wr_id=39
/lib/common.lib.php와 /bbs/login_check.php만 바꿔주었다. 관리자, 회원 모두 로그인이 잘 된다. mysql이 버전업되면서 패스워드 포멧에 변화가 생겼다고 한다.
나는 mysql을 같은 5.1대 버전으로 복구했는데 왜이런 문제가 생겼는지 모르겠다. 5.1에서도 업그레이드 버전이 있는 것인지..

내용
웹호스팅 또는 서버호스팅에 따라서 mysql의 버젼이 꽤 많이 차이가 나는게

4.0.x와 4.1.x 이후 버젼 사이에는 패스워드 포맷이 달라지는 중대한 변화가 있습니다.
 
그 결과 4.0.x의 패스워드는 4.1.x 이후에서는 인식될 수가 없습니다.
 
mysql에서는 편법으로 서버 옵션으로 --old_password 라는 것을 제시해서 4.1.x 이후에도
옛날의 허술한 패스워드를 쓸 수 있게 해주고 sql에서도 old_password라는게 있습니다.
 
그러나 이것은 진정한 문제의 해결이 아니고 문제를 잠시 덮어주는 역활만을 하는 것이죠.
 
 
제가 5.0.41로 버젼업을 하면서 옛날의 4.0.x의 패스워드가 먹히게 하기 위해서 ...
 
 
/lib/common.lib.php 에 다음 함수를 추가 합니다.
 
function sql_old_password($value)
{
    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
    $row = sql_fetch(" select old_password('$value') as pass ");
    return $row[pass];
}
 
 
/bbs/login_check.php의 15라인을 다음과 같이 수정 합니다.
 
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password] and sql_old_password($mb_password) != $mb[mb_password]))
 
 
/bbs/register_form.php의 66라인을 다음과 같이 수정
 
    if (($member[mb_password] == sql_password($_POST[mb_password]) and $member[mb_password] == sql_old_password($_POST[mb_password])) && $_POST[mb_password])

 
그러면 새로운 사용자는 새로운 패스워드로, 옛날 사용자는 옛날 패스워드로 login check를 하게 됩니다.

댓글 없음:

댓글 쓰기