비밀번호 변경 질문드립니다.
본문
안녕하세요. 항상 부족한점이 많아 그누보드 질문에서 많은 내용을 보고 공부하고 있습니다.
그누보드 버전은 5.5.8 카페24 웹호스팅(sftp)로 호스팅중이고 linux, nginx, php 버전은 7.4.5버전을 사용중입니다.
현재 그누보드 시스템상으로는 로그인 페이지에서 비밀번호 찾기 클릭시 새창에서 회원가입한 유저의 이메일을 기입하여 해당 유저의 이메일에서 무작위로 생성된 비밀번호를 비밀번호 변경하기 클릭시 변경되도록 되어있습니다.
현재 수정중인건, /bbs/password_lost2.php에서 비밀번호 변경 페이지 (/page/password_change.php)로 가도록 수정을 해놓은 상태입니다. password_lost2.php에서 생성된 메일에서 비밀번호 변경을 url을 password_lost_certify.php에서 검증후 페이지로 이동하는 로직을 확인하고,
/bbs/password_lost_certify.php
<?php
include_once('./_common.php');
// 봇의 메일 링크 크롤링을 방지합니다.
if(function_exists('check_mail_bot')){ check_mail_bot($_SERVER['REMOTE_ADDR']); }
run_event('password_lost_certify_before');
$mb_no = isset($_GET['mb_no']) ? preg_replace('#[^0-9]#', '', trim($_GET['mb_no'])) : 0;
$mb_nonce = isset($_GET['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 ($mb_nonce === substr($mb['mb_lost_certify'], 0, 32)) {
// 인증 링크가 사용된 것으로 표시
sql_query(" update {$g5['member_table']} set mb_lost_certify = '' where mb_no = '$mb_no' ");
run_event('password_lost_certify_after', $mb, $mb_nonce);
// /page/password_change.php로 리디렉션
header('Location: /page/password_change.php?mb_no='.$mb_no.'&mb_nonce='.$mb_nonce);
exit;
} else {
// 인증이 만료된 경우 사용자에게 메시지를 표시하고 창을 닫습니다.
echo "<script>alert('인증이 만료되었습니다. 다시 비밀번호를 찾기를 통해 메일인증을 받아주세요.'); window.close();</script>";
exit;
}
로 수정을 하여, 두번 클릭하면 인증 만료가 되도록 해놓았고,
/page/password_change.php에서는
<?php
$sub_page = "intro";
/* www/sub/new.php */
include_once('../common.php');
//$g5['title'] = "회사소개";
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
add_stylesheet('<link rel="stylesheet" href="'.G5_THEME_CSS_URL.'/password_change.css">', 0);
include_once(G5_PATH . '/head.php');
?>
<div class="password-wrap">
<div class="container">
<div class="password-box">
<form id="password-form" method="post" enctype="multipart/form-data" action="./password_update.php">
<input type="hidden" name="mb_no" value="<?php echo $_GET['mb_no']; ?>">
<input type="hidden" name="mb_nonce" value="<?php echo $_GET['mb_nonce']; ?>">
<h2 class="text-center mt-4 mb-5">비밀번호 변경</h2>
<div class="input-group mb-4">
<label class="form-label" for="password_change">새 비밀번호 변경</label>
<input class="form-control shadow-none" id="password_change" name="mb_password" type="password" required />
</div>
<div class="input-group">
<label class="form-label" for="password_re">새 비밀번호 변경 확인</label>
<input class="form-control shadow-none" id="password_re" name="mb_password_re" type="password" required />
</div>
<div class="submit-box mt-5">
<button class="btn submit-btn p-0">비밀번호 변경</button>
</div>
</form>
</div>
</div>
</div>
<?php
include_once(G5_PATH . '/tail.php');
?>
이렇게 해놓아서 mb_no, mb_nonce가 리다이렉트 되어도 받아오는걸 확인했습니다.
url에도 /page/password_change.php?mb_no=122&mb_nonce=2d9a2a037bcb9a5af428b7b8e462ed70 이런식으로 나오는것도 확인했습니다. 그리고 password_update.php에서 비밀번호가 서로 다르면 다르다는 alert, 맞으면 비밀번호 변경이 완료 , 에러시 실패라는 alert도 나오도록 해놨습니다.
/page/password_update.php
<?php
include_once('../_common.php');
include_once(G5_LIB_PATH.'/common.lib.php');
ini_set('display_errors', 1);
error_reporting(E_ALL);
// POST 데이터 검증
$new_password = $_POST['mb_password'];
$new_password_confirm = $_POST['mb_password_re'];
$mb_no = $_POST['mb_no'];
$mb_nonce = $_POST['mb_nonce'];
// 두 비밀번호가 일치하는지 확인
if ($new_password !== $new_password_confirm) {
alert('비밀번호가 일치하지 않습니다.');
exit;
}
// 데이터베이스에서 사용자 확인
$sql = "SELECT mb_id FROM {$g5['member_table']} WHERE mb_no = '$mb_no' AND mb_lost_certify = '$mb_nonce'";
$result = sql_query($sql);
if (sql_num_rows($result) == 0) {
alert('유효하지 않은 요청입니다.');
exit;
}
// 새 비밀번호 암호화
$encrypted_password = get_encrypt_string($new_password);
// 데이터베이스에 새 비밀번호 업데이트
$sql = "UPDATE {$g5['member_table']} SET mb_password = '$encrypted_password' WHERE mb_no = '$mb_no'";
if(sql_query($sql)) {
alert('비밀번호가 변경되었습니다.', G5_BBS_URL.'/login.php');
} else {
alert('비밀번호 변경에 실패했습니다.');
}
function alert($msg, $url = '') {
if ($url) {
echo "<script type='text/javascript'>alert('$msg'); window.location.href = '$url';</script>";
} else {
echo "<script type='text/javascript'>alert('$msg'); history.back();</script>";
}
exit;
}
이렇게 해놓은 상태입니다.
// POST 데이터 검증
$new_password = $_POST['mb_password'];
$new_password_confirm = $_POST['mb_password_re'];
$mb_no = $_POST['mb_no'];
$mb_nonce = $_POST['mb_nonce'];
// 두 비밀번호가 일치하는지 확인
if ($new_password !== $new_password_confirm) {
alert('비밀번호가 일치하지 않습니다.');
exit;
}
이부분까지는 문제없이 되는데,
// 데이터베이스에서 사용자 확인
$sql = "SELECT mb_id FROM {$g5['member_table']} WHERE mb_no = '$mb_no' AND mb_lost_certify = '$mb_nonce'";
$result = sql_query($sql);
if (sql_num_rows($result) == 0) {
alert('유효하지 않은 요청입니다.');
exit;
}
// 새 비밀번호 암호화
$encrypted_password = get_encrypt_string($new_password);
// 데이터베이스에 새 비밀번호 업데이트
$sql = "UPDATE {$g5['member_table']} SET mb_password = '$encrypted_password' WHERE mb_no = '$mb_no'";
if(sql_query($sql)) {
alert('비밀번호가 변경되었습니다.', G5_BBS_URL.'/login.php');
} else {
alert('비밀번호 변경에 실패했습니다.');
}
function alert($msg, $url = '') {
if ($url) {
echo "<script type='text/javascript'>alert('$msg'); window.location.href = '$url';</script>";
} else {
echo "<script type='text/javascript'>alert('$msg'); history.back();</script>";
}
exit;
}
여기부터 추가하니 500 error이 떴고,
ini_set('display_errors', 1); error_reporting(E_ALL);
로 확인해보니
Notice: Undefined variable: g5 in /www/page/password_update.php on line 23 Notice: Trying to access array offset on value of type null in /www/page/password_update.php on line 23 Fatal error: Uncaught Error: Call to undefined function sql_query() in /www/page/password_update.php:24 Stack trace: #0 {main} thrown in /www/page/password_update.php on line 24
이런 오류가 나오고 있습니다.
_.common.php의 경로도 제대로 되어있고, 혹시몰라 common.lib.php도 include 했는데 g5정의가 안되었다고 나오는데
이유를 알수없어서 자문을 구하고자 질문드립니다. 어디가 잘못되었는지 알려주실수 있으실까요?
!-->!-->!-->!-->!-->!-->