MySQL 4.0이하에서 만들어진 회원들의 정보및 password 데이타를 MySQL 4.1 이상에서 그냥 이용하기 정보
MySQL 4.0이하에서 만들어진 회원들의 정보및 password 데이타를 MySQL 4.1 이상에서 그냥 이용하기본문
상당히 특이한 경우지만 저처럼 걸리는 경우가 있어서 -_-
혹시 필요하실 분들을 위해 올립니다.
제로보드와 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바이트짜리로 바꾸었을경우에는 위에 바꾼것을 원래대로
돌려 놓는것이 좋습니다.
혹시 필요하실 분들을 위해 올립니다.
제로보드와 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바이트짜리로 바꾸었을경우에는 위에 바꾼것을 원래대로
돌려 놓는것이 좋습니다.
추천
5
5
댓글 28개
저도 그 경우를 당해본적이 있었다는....
좋은 팁입니다...난 게을러서 안올렸는뎅...
좋은 팁입니다...난 게을러서 안올렸는뎅...
..
감사합니다. 덕분에 도움이 되었습니다.
넘 감사합니다. ^^
찾아서 해결해야 할 부분을 덕분에 금방 해결이 되었습니다.
찾아서 해결해야 할 부분을 덕분에 금방 해결이 되었습니다.
너무감사합니다
감사합니다. 덕분에 해결이 났습니다. 절말 유용한 팁입니다 ㅠ.ㅠ
감사~!
감사합니다 그렇지 않아도 이문제 때문에 어딜 어떻게 고쳐야 할지 고민하고 잇었는데 ^^
아 저렇게 수정해도 안되는건 나뿐인가 ㅠㅠ
역시나 해도 안되는군요 ㅎㅎ
그리고 register_form.php의 67-68번째 줄 아닌가요??
파일이 어느 폴더에있는지도 알려줬으면 더 좋았을텐데요...
그리고 register_form.php의 67-68번째 줄 아닌가요??
파일이 어느 폴더에있는지도 알려줬으면 더 좋았을텐데요...
좋은 정보감사합니다. 잘해결햇습니다.
감사합니다.
감사합니다.
계속 안되서 고생했는데, 바로 해볼께요^^ 감사합니다.
좋은팁 감사드립니다.
덕분에^^
덕분에^^
1. 그누보드 / lib / common.lib.php 의 1096번째 줄에
function sql_password($value) 를 검색해서 아래와 같이 함수를 추가합니다.
function sql_old_password($value)
{
$row = sql_fetch(" select old_password('$value') as pass ");
return $row[pass];
}
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];
}
2. 그누보드 / bbs / login_check.php의 25번째줄의
// 수정전
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
// 수정후
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패스워드는 대소문자를 구분합니다.");
}
}
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("패스워드가 틀립니다.");
function sql_password($value) 를 검색해서 아래와 같이 함수를 추가합니다.
function sql_old_password($value)
{
$row = sql_fetch(" select old_password('$value') as pass ");
return $row[pass];
}
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];
}
2. 그누보드 / bbs / login_check.php의 25번째줄의
// 수정전
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
// 수정후
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패스워드는 대소문자를 구분합니다.");
}
}
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("패스워드가 틀립니다.");
2. 그누보드 / bbs / login_check.php의 25번째줄의
로직의 심각한 오류 발견됨 아래 내용으로 교체해주세요.
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);
} elseif (!$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);
} elseif (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
놀랍군요.신규추가되는 건 32비트고 구 회원 16비트도 인식되게 하는 방식이군요.대단합니다.
이런걸 공짜로 알다니 송구스럽네요.
이런 팁은 만원을 주고 사도 아깝지 않은데...
이런걸 공짜로 알다니 송구스럽네요.
이런 팁은 만원을 주고 사도 아깝지 않은데...
만원만요? ^^;
감사합니다
서버이전시 유용한 팁.
mysql4 mysql5 회원db ★
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("패스워드가 틀립니다.");
}
최신버젼을 깔았더니, 위 코드는 주석처리되서 인제는 사용하지 않은 코드라서요.
그래서, 위에서 말씀하신 이것을
----------------------------------------------------------
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년전 팁을 적용하니 로그인 잘됩니다. 감사합니다.
이글 말고 2013년도 팁들은 g4로 나온부분을 g5로 변경해줘도 전 오류가 나던데
이 10년전 팁을 적용하니 로그인 잘됩니다. 감사합니다.
감사합니다^^