아이디 비밀번호 찾기 임시비밀번호 관련

아이디 비밀번호 찾기 임시비밀번호 관련

QA

아이디 비밀번호 찾기 임시비밀번호 관련

본문


// 임시비밀번호와 난수를 mb_lost_certify 필드에 저장
$sql = " update {$g5['member_table']} set mb_lost_certify = '$mb_nonce $mb_lost_certify' where mb_id = '{$mb['mb_id']}' ";
sql_query($sql);

 

이 구간에서 임시비밀번호와 난수를 g5_member 테이블 mb_lost_certify 필드에 값이 들어가야 하는데 값이 들어가지 않습니다. 

 

기존 아이디 비밀번호 찾기를 아이디찾기 따로 비밀번호 찾기 따로 만들었는데 아이디 찾기는 정상적으로 작동하나 비밀번호 찾기는 mb_lost_certify 해당 필드에 값이 들어가지 않습니다 ..

 


$sql = " update {$g5['member_table']} set mb_lost_certify = 'ABC' where mb_id = '{$mb['mb_id']}' ";

 

이렇게 처리하면 ABC 라는 값은 정상적으로 들어가는걸 보아하니 다른쪽 문제가 아니라 

 

mb_lost_certify 값으로 사용될 변수 $mb_nonce, $mb_lost_certify 가 들어가지 않습니다..

 


// 임시비밀번호 발급
$change_password = rand(100000, 999999);
$mb_lost_certify = get_encrypt_string($change_password);
// 어떠한 회원정보도 포함되지 않은 일회용 난수를 생성하여 인증에 사용
$mb_nonce = md5(pack('V*', rand(), rand(), rand(), rand()));

 

혹시 $mb_nonce, $mb_lost_certify 이 2개의 값에 문제가 있는지 확인하려고 alert 으로 값을 띄워보니 값은 정상적으로 들어가있는데 이상하게 DB 에만 들어가지 않습니다 ㅠㅠ

이 질문에 댓글 쓰기 :

답변 2

값이 정확히 있다면 이렇게 해보세요

$sql = " update {$g5['member_table']} set mb_lost_certify = '".$mb_nonce." ".$mb_lost_certify."' where mb_id = '{$mb['mb_id']}' ";
sql_query($sql);

값이 안들어가네요 ㅠㅠ

$sql = " update {$g5['member_table']} set mb_lost_certify = '".$mb_nonce."' where mb_id = '{$mb['mb_id']}' ";

이렇게 한개만 넣으면 잘 들어갑니다..

근데 $sql = " update {$g5['member_table']} set mb_lost_certify = '".$mb_lost_certify."' where mb_id = '{$mb['mb_id']}' ";

이 값은 안들어갑니다.

alert 으로 값이 있나 체크해봤는데 값은 정상적으로 들어가있고 alert 으로

alert($mb_nonce."여백".$mb_lost_certify); 하면 문제없이 값 2개가 잘 나옵니다 ㅠㅠ

심지어 수정안한 원본도 안들어가고 있는 상황입니다..

원본소스 그대로 붙여서 처리해도 안들어가고 있어서 이유를 못찾겠네요.

인증용 코드 지우는 쿼리문은 비밀번호 변경 링크를 클릭해야 작동하는 방식인데 왜 지워지는건지 모르겠습니다 ㅠㅠ

인증용 코드 지우는 쿼리문은 비밀번호 변경 링크를 클릭해야 작동하는 방식인데 왜 지워지는건지 모르겠습니다 ㅠㅠ

이내용이 무슨 말인지요?

전체 소스를 보여주세요


<?php
include_once('./_common.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');

if ($is_member) {
    alert_close('이미 로그인중입니다.', G5_URL);
}

$email = trim($_POST['mb_email']);

if (!$email)
    alert_close('메일주소 오류입니다.');

$sql = " select count(*) as cnt from {$g5['member_table']} where mb_email = '$email' ";
$row = sql_fetch($sql);
if ($row['cnt'] > 1)
    alert('동일한 메일주소가 2개 이상 존재합니다.\\n\\n관리자에게 문의하여 주십시오.');

$sql = " select mb_no, mb_id, mb_name, mb_nick, mb_email, mb_datetime from {$g5['member_table']} where mb_email = '$email' ";
$mb = sql_fetch($sql);
if (!$mb['mb_id'])
    alert('존재하지 않는 회원입니다.');
else if (is_admin($mb['mb_id']))
    alert('관리자 아이디는 접근 불가합니다.');

// 임시비밀번호 발급
$change_password = rand(100000, 999999);
$mb_lost_certify = get_encrypt_string($change_password);

// 어떠한 회원정보도 포함되지 않은 일회용 난수를 생성하여 인증에 사용
$mb_nonce = md5(pack('V*', rand(), rand(), rand(), rand()));

// 임시비밀번호와 난수를 mb_lost_certify 필드에 저장
$sql = " update {$g5['member_table']} set mb_lost_certify = '$mb_nonce $mb_lost_certify' where mb_id = '{$mb['mb_id']}' ";
sql_query($sql);

// 인증 링크 생성
$href = G5_BBS_URL.'/password_lost_certify.php?mb_no='.$mb['mb_no'].'&amp;mb_nonce='.$mb_nonce;

$subject = "[".$config['cf_title']."] 요청하신 회원정보 찾기 안내 메일입니다.";

$content = "";

$content .= '<div style="margin:30px auto;width:600px;border:10px solid #f7f7f7">';
$content .= '<div style="border:1px solid #dedede">';
$content .= '<h1 style="padding:30px 30px 0;background:#f7f7f7;color:#555;font-size:1.4em">';
$content .= '회원정보 찾기 안내';
$content .= '</h1>';
$content .= '<span style="display:block;padding:10px 30px 30px;background:#f7f7f7;text-align:right">';
$content .= '<a href="'.G5_URL.'" target="_blank">'.$config['cf_title'].'</a>';
$content .= '</span>';
$content .= '<p style="margin:20px 0 0;padding:30px 30px 30px;border-bottom:1px solid #eee;line-height:1.7em">';
$content .= addslashes($mb['mb_name'])." (".addslashes($mb['mb_nick']).")"." 회원님은 ".G5_TIME_YMDHIS." 에 회원정보 찾기 요청을 하셨습니다.<br>";
$content .= '저희 사이트는 관리자라도 회원님의 비밀번호를 알 수 없기 때문에, 비밀번호를 알려드리는 대신 새로운 비밀번호를 생성하여 안내 해드리고 있습니다.<br>';
$content .= '아래에서 변경될 비밀번호를 확인하신 후, <span style="color:#ff3061"><strong>비밀번호 변경</strong> 링크를 클릭 하십시오.</span><br>';
$content .= '비밀번호가 변경되었다는 인증 메세지가 출력되면, 홈페이지에서 회원아이디와 변경된 비밀번호를 입력하시고 로그인 하십시오.<br>';
$content .= '로그인 후에는 정보수정 메뉴에서 새로운 비밀번호로 변경해 주십시오.';
$content .= '</p>';
$content .= '<p style="margin:0;padding:30px 30px 30px;border-bottom:1px solid #eee;line-height:1.7em">';
$content .= '<span style="display:inline-block;width:100px">회원아이디</span> '.$mb['mb_id'].'<br>';
$content .= '<span style="display:inline-block;width:100px">변경될 비밀번호</span> <strong style="color:#ff3061">'.$change_password.'</strong>';
$content .= '</p>';
$content .= '<a href="'.$href.'" target="_blank" style="display:block;padding:30px 0;background:#484848;color:#fff;text-decoration:none;text-align:center">비밀번호 변경</a>';
$content .= '</div>';
$content .= '</div>';

mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $mb['mb_email'], $subject, $content, 1);

alert_close($email.' 메일로 회원아이디와 비밀번호를 인증할 수 있는 메일이 발송 되었습니다.\\n\\n메일을 확인하여 주십시오.');
?>



이게 수정 안한 /bbs/password_lost2.php 파일 입니다.



<?php
include_once('./_common.php');

// 오류시 공히 Error 라고 처리하는 것은 회원정보가 있는지? 비밀번호가 틀린지? 를 알아보려는 해킹에 대비한것

$mb_no = trim($_GET['mb_no']);
$mb_nonce = trim($_GET['mb_nonce']);

// 회원아이디가 아닌 회원고유번호로 회원정보를 구한다.
$sql = " select mb_id, mb_lost_certify from {$g5['member_table']} where mb_no = '$mb_no' ";
$mb  = sql_fetch($sql);
if (strlen($mb['mb_lost_certify']) < 33)
    die("Error");

// 인증 링크는 한번만 처리가 되게 한다.
// 이 부분에서 인증용 난수 + 임시비밀번호 값을 비우고 있습니다.
sql_query(" update {$g5['member_table']} set mb_lost_certify = '' where mb_no = '$mb_no' ");

// 인증을 위한 난수가 제대로 넘어온 경우 임시비밀번호를 실제 비밀번호로 바꿔준다.
if ($mb_nonce === substr($mb['mb_lost_certify'], 0, 32)) {
    $new_password_hash = substr($mb['mb_lost_certify'], 33);
    sql_query(" update {$g5['member_table']} set mb_password = '$new_password_hash' where mb_no = '$mb_no' ");
    alert('비밀번호가 변경됐습니다.\\n\\n회원아이디와 변경된 비밀번호로 로그인 하시기 바랍니다.', G5_BBS_URL.'/login.php');
}
else {
    die("Error");
}
?>




이 페이지는 수정할 필요가 없어서 그냥 사용하고 있습니다.

/bbs/password_lost_certify.php 파일 입니다.

이 부분에서 인증용 난수 + 임시비밀번호 값을 비우고 있습니다.

sql_query(" update {$g5['member_table']} set mb_lost_certify = '' where mb_no = '$mb_no' ");

메일 발송하면 /bbs/password_lost_certify.php?mb_no=14&mb_nonce=b4ba680da517c0e64aed86e54079ab75

이런식으로 링크가 날라오는데 password_lost_certify.php 에 접근해야 위에 코드가 작동할텐데 메일 발송한 시점에서 값이 안들어가있습니다 ㅠㅠ

네 ㅠㅠ 수정 안한 소스도 값이 안들어가고 있습니다..

메일은 정상적으로 날라오는데 DB 확인해보면 값이 없고

링크 클릭하면


if (strlen($mb['mb_lost_certify']) < 33)
    die("Error");


해당 부분에서 값이 없어서 Error 출력하고 종료합니다.

서버 환경은 카페 24 호스팅 받고 있고 os 는 리눅스 사용중입니다.

php 버전은 5.5.17 사용중입니다.

소스 상에는 문제가 없습니다.

디비테이블 속성이나 해당필드 속성을 다시 확인해보세요

저렇다면 모든 회원이 비밀번호 찾기가 않된다는 상황입니다.

도움주셔서 감사합니다 ㅠㅠ

제가 잘못이해하고 있는건지..

순서가

1. 비밀번호 찾기 버튼 누르면 /bbs/password_lost2.php 실행

2. $email 이 제대로 넘어왔는지 체크

3. 중복된 이메일이 있는지

4. 없다면 해당 이메일로 회원정보 조회 후 쿼리 발송

5. $mb 에 값을 담아두고 mb_id 값이 비어있는지 체크 or 관리자 계정인지 체크

6. 임시비밀번호 발급 후 get_encrypt_string 로 암호화

7. 인증용 난수 생성

8. 난수 + 임시비밀번호 값 mb_lost_certify 필드에 저장

9. 이메일 발송

이 /bbs/password_lost2.php 이 파일에서 작동하는 순서가 아닌가요 ?

그 이후 메일에 있는 비밀번호 변경 버튼을 누르면

/bbs/password_lost_certify.php?mb_no=14&mb_nonce=e9d5a413325c8028d4132f39ce61100b

1. /bbs/password_lost_certify.php 실행

2. 회원번호로 회원정보 조회

3. $mb 에 값을 담아두고 mb_lost_certify 의 필드값 길이가 33 글자가 넘어가는지 체크 or 짧다면 Error 출력

4. 인증용 mb_password 필드값 제거

5. GET 방식으로 받아온 mb_nonce 와 db 에 등록되어있는 mb_lost_certify 0 ~ 32 자리 값 비교 후 일치하면 33 ~ 끝자리 까지 비밀번호로 사용 DB 등록

6. 비밀번호 변경 후 alert 처리.

이 순서가 아닌가요 ?

/bbs/password_lost_certify.php 이 페이지가 실행되야

sql_query(" update {$g5['member_table']} set mb_lost_certify = '' where mb_no = '$mb_no' ");

해당 쿼리가 작동해야 하는거같은데.. 혹시 제가 틀린건가요 ?

조건절이 틀리지 않았을까요?

해당 값이 어디로 들어가야 하는지 살펴보세요....

조건이 틀렸다면

$sql = " update {$g5['member_table']} set mb_lost_certify = 'ABC' where mb_id = '{$mb['mb_id']}' ";

이 sql 도 작동 안해야 하는데 DB 확인해보니 ABC 는 제대로 들어갑니다 ㅠㅠ

이상하게 변수값은 안들어가고 있네요..

답변을 작성하시기 전에 로그인 해주세요.
전체 160
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT