From 916f079ecc7ca66447ff5b281389dd116328f95d Mon Sep 17 00:00:00 2001 From: chicpro Date: Tue, 19 Aug 2014 14:37:57 +0900 Subject: [PATCH] =?UTF-8?q?=ED=9A=8C=EC=9B=90=EC=A0=95=EB=B3=B4=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0=20=EC=9D=B8=EC=A6=9D=20URL=EC=97=90=20=EB=93=A4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=EB=8A=94=20=EB=82=9C=EC=88=98=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20-=20=EC=84=B1=EA=B8=B0=EC=A7=84=EB=8B=98=20?= =?UTF-8?q?=EC=A0=9C=EA=B3=B5=20=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bbs/password_lost2.php | 15 +++++++++------ bbs/password_lost_certify.php | 16 ++++++++-------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/bbs/password_lost2.php b/bbs/password_lost2.php index d1bc4dbf3..10393e6b0 100644 --- a/bbs/password_lost2.php +++ b/bbs/password_lost2.php @@ -28,16 +28,19 @@ if (!$mb['mb_id']) else if (is_admin($mb['mb_id'])) alert('관리자 아이디는 접근 불가합니다.'); -// 난수 발생 -srand(time()); +// 임시비밀번호 발급 $change_password = rand(100000, 999999); $mb_lost_certify = sql_password($change_password); -$mb_datetime = sql_password($mb['mb_datetime']); -$sql = " update {$g5['member_table']} set mb_lost_certify = '$mb_lost_certify' where mb_id = '{$mb['mb_id']}' "; +// 어떠한 회원정보도 포함되지 않은 일회용 난수를 생성하여 인증에 사용 +$mb_nonce = bin2hex(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'].'&mb_datetime='.$mb_datetime.'&mb_lost_certify='.$mb_lost_certify; +// 인증 링크 생성 +$href = G5_BBS_URL.'/password_lost_certify.php?mb_no='.$mb['mb_no'].'&mb_nonce='.$mb_nonce; $subject = "[".$config['cf_title']."] 요청하신 회원정보 찾기 안내 메일입니다."; @@ -69,4 +72,4 @@ $content .= ''; mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $mb['mb_email'], $subject, $content, 1); alert_close($email.' 메일로 회원아이디와 비밀번호를 인증할 수 있는 메일이 발송 되었습니다.\\n\\n메일을 확인하여 주십시오.'); -?> \ No newline at end of file +?> diff --git a/bbs/password_lost_certify.php b/bbs/password_lost_certify.php index ea427f04d..5307a7197 100644 --- a/bbs/password_lost_certify.php +++ b/bbs/password_lost_certify.php @@ -4,24 +4,24 @@ include_once('./_common.php'); // 오류시 공히 Error 라고 처리하는 것은 회원정보가 있는지? 비밀번호가 틀린지? 를 알아보려는 해킹에 대비한것 $mb_no = trim($_GET['mb_no']); -$mb_datetime = trim($_GET['mb_datetime']); -$mb_lost_certify = trim($_GET['mb_lost_certify']); +$mb_nonce = trim($_GET['mb_nonce']); // 회원아이디가 아닌 회원고유번호로 회원정보를 구한다. -$sql = " select mb_id, mb_datetime, mb_lost_certify from {$g5['member_table']} where mb_no = '$mb_no' "; +$sql = " select mb_id, mb_lost_certify from {$g5['member_table']} where mb_no = '$mb_no' "; $mb = sql_fetch($sql); -if (!trim($mb['mb_lost_certify'])) +if (strlen($mb['mb_lost_certify']) < 33) die("Error"); // 인증 링크는 한번만 처리가 되게 한다. sql_query(" update {$g5['member_table']} set mb_lost_certify = '' where mb_no = '$mb_no' "); -// 변경될 비밀번호가 넘어와야하고 저장된 변경비밀번호를 md5 로 변환하여 같으면 정상 -if ($mb_lost_certify && $mb_datetime === sql_password($mb['mb_datetime']) && $mb_lost_certify === $mb['mb_lost_certify']) { - sql_query(" update {$g5['member_table']} set mb_password = '{$mb['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"); } -?> \ No newline at end of file +?>