Daniel's Knowledge Storage

서버이전시 mysql버전에 따른 패스워드오류 본문

Develop

서버이전시 mysql버전에 따른 패스워드오류

다니엘SEO 2009. 12. 2. 09:45

1. 문제
mysql 버전이 4.1 이상이 되면서 password 함수가 바뀌었습니다. 그래서 제로보드 로그인을 사용할 수 없습니다.

2. 문제 해설
4.0 이하의 버전에서는 password 함수가 16바이트의 문자열을 만들어 냈습니다.
4.1 이상에서는 41바이트의 문자를 만들어냅니다.(정확히는 40바이트 + "*"(별표 문자)입니다.)

3. 해결책
첫번째, 제로보드 내의 password 함수를 모두 old_password로 바꾸는 겁니다. 그러나 이건 단순반복에 양이 꽤 되서 무척 귀찮습니다. 그래서 패스.

두번째, password함수는 mysql 자체 암호 승인에 쓰이는 함수기에 mysql 측에서는 사용자 프로그램에 password 함수보다는 md5() 나 sha1() 함수를 사용하길 권장합니다.(매뉴얼에 나와 있슴.) 그러나 이것도 역시 첫번째와 마찬가지로 password 함수를 다 바꿔줘야 하기 때문에 패스. ㅡ.ㅡ;;
(그리고 md5, sha1 함수는 password 함수에 비해 30% 이상 느립니다. ㅡ.ㅡ;;)

세번째, 아래 나와 있는 코드대로 login_check.php 파일의 일부를 바꾸는 겁니다. 그러면 기존의 코드 그대로 사용하면서 4.1 버전의 향상된 password 함수의 이점을 누릴 수 있습니다.

login_check.php
// 회원 로그인 체크

// modify password column type
        $result = mysql_query("desc zetyx_member_table password", $connect) or Error("암호 컬럼의 정보를 가져오는 데 실패했습니다.<br>".mysql_error());
        $data = mysql_fetch_row($result);
        if($data[1] != "varchar(41)")
                @mysql_query("alter table zetyx_member_table modify password char(41) not null") or error("암호 컬럼의 타입을 바꾸는 데 실패했습니다.<br>".mysql_error());

// change each password
        $p_result = mysql_query("select length(password) from $member_table where user_id='$user_id'") or error("password error<br>".mysql_error());
        $p_data = mysql_fetch_row($p_result);
        if($p_data[0] == 41)
                $result = mysql_query("select * from $member_table where user_id='$user_id' and password=password('$password')") or error(mysql_error());
        else {
                $m_result = mysql_query("select * from $member_table where user_id='$user_id' and password=old_password('$password')") or error(mysql_error());
                $m_data = mysql_fetch_array($m_result);
                if($m_data[no]) {
                        @mysql_query("update $member_table set password=password('$password') where no='$m_data[no]'") or error("new password update error<br>".mysql_error());
                        $result = mysql_query("select * from $member_table where user_id='$user_id' and password=password('$password')") or error(mysql_error());
                }
                else $result = 0;
        }
        $member_data = mysql_fetch_array($result);

기존의 코드와 비교해 보시면 됩니다.

기존 코드는
// 회원 로그인 체크
        $result = mysql_query("select * from $member_table where user_id='$user_id' and password=password('$password')") or error(mysql_error());
        $member_data = mysql_fetch_array($result);
이렇습니다.

[출처 : http://www.xpressengine.com/?mid=zb4_tip&search_target=content&search_keyword=old_password&document_srl=846583 ]
Comments