마이페이지 만들기
비밀번호변경 기능이 있는 마이페이지를 만들어보자
기본적인 틀은 회원가입의 틀을 가져와 사용한다.
CSRF 공격을 방지하기위해 비밀번호 변경 시 현재 비밀번호를 입력하도록 구성한다.
mypage.php
<?php
// 사용자 정보를 받아와 화면에 그린다.
$user = getUserInfo();
// post로 전달 받았다면 비밀번호 로직츨 처리한다.
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 비밀번호 변경
$is_currentPw = isset($_POST['currentPw']) && $_POST['currentPw'];
$is_newPw = isset($_POST['newPw']) && $_POST['newPw'];
$is_submit = isset($_POST['submit']);
// 현재 비밀번호를 입력 받아서 맞는지 확인.
$checkPw = checkCurrentPw($_POST['currentPw']);
// 현재 비밀번호를 입력받고, 새 비밀번호를 입력받고, 현재 비밀번호와 입력받은 현재 비밀번호가 같고
// 새로 입력받은 비밀번호로 update가 성공한다면
if ($is_currentPw && $is_newPw && $is_submit
&& $checkPw && updatePassword($_POST['newPw']) ) {
// alert을 띄우고 현재 로그인 페이지로 이동
echo "<script>alert('비밀번호 변경 완료.');
location.href='/login.php'
</script>";
}
}
?>
// 입력 태그
<div class="container">
<main>
<div class="py-5 text-center">
<img class="d-block mx-auto mb-4" src="../assets/images/normaltic_logo.png" alt="" width="72" height="57">
<h2>마이 페이지</h2>
<!-- <p class="lead">하기의 항목을 기입해주세요.</p> -->
</div>
<div class="row g-5">
<div class="">
<!-- <h4 class="mb-3">Billing address</h4> -->
<form class="needs-validation" novalidate method="POST">
<div class="row g-3">
<div class="">
<label for="아이디" class="form-label">아이디</label>
<input readonly type="text" value=
<?php
echo '"'.$user['id'].'"';
?>
class="form-control" name="id" >
<div class="">
</div>
</div>
<div class="">
<label for="이름" class="form-label">이름</label>
<input readonly type="text" value=
<?php
echo '"'.$user['name'].'"';
?>
name="name" class="form-control" id="username" >
<div class="">
</div>
</div>
<div class="">
<label for="현재 비밀번호" class="form-label">현재 비밀번호</label>
<input type="password" name="currentPw" class="form-control" id="username" required>
<?php
if(isset($checkPw)) {
echo '비밀번호가 잘못되었습니다.';
echo "<br>";
}
?>
</div>
</div>
<div class="">
<label for="변경할 비밀번호" class="form-label">변경할 비밀번호</label>
<input type="password" name="newPw" class="form-control" id="username" required>
<div class="">
</div>
</div>
<input type=text vlaue="submit" style="display:none;" name="submit"/>
<button class="w-100 btn btn-primary btn-lg" type="submit">비밀번호 변경</button>
</form>
</div>
</div>
</main>
mypage_function.php
<?php
ini_set('display_errors', 1);
require '/app/lib/db_connection.php';
function getDbConn() {
if (!isset($db_conn)) {
$db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
$db_conn -> set_charset('utf8');
}
return $db_conn;
}
function getUserInfo() {
$db_conn = getDbConn();
$token = $_COOKIE['REFRESH_TOKEN'];
$sql = 'SELECT USER_ID as id, USER_NM as name FROM user
where REFRESH_TOKEN = ?';
$stmtSQL = $db_conn->prepare($sql);
$stmtSQL->bind_param("s",$token);
$stmtSQL->execute();
$result = $stmtSQL->get_result();
$user = mysqli_fetch_array($result);
// var_dump($user);
return $user;
}
function updatePassword($newPw) {
$db_conn = getDbConn();
$token = $_COOKIE['REFRESH_TOKEN'];
$newPw = hash("sha256", $newPw);
$sql = "update user set PW = ? where REFRESH_TOKEN = ?";
$stmtSQL = $db_conn->prepare($sql);
$stmtSQL->bind_param('ss', $newPw,$token);
$result = $stmtSQL->execute();
return $result;
}
// CSRF공격을 방지하기위해 현재 비밀번호를 입력받고 확인하는 절차를 추가한다.
function checkCurrentPw($currentPw) {
$db_conn = getDbConn();
$token = $_COOKIE['REFRESH_TOKEN'];
$currentPw = hash("sha256", $currentPw);
$sql = "SELECT count(USER_ID) as count FROM user where REFRESH_TOKEN = ? and PW = ?";
$stmtSQL = $db_conn->prepare($sql);
$stmtSQL->bind_param("ss",$token, $currentPw);
$stmtSQL->execute();
$result = $stmtSQL->get_result();
$user = mysqli_fetch_array($result);
return $user['count'];
}
?>
'웹 해킹 코스 > 과제' 카테고리의 다른 글
14차 문제풀이 Web Shell 2 (0) | 2024.02.13 |
---|---|
14차 문제풀이 Web Shell 1 (0) | 2024.02.13 |
4-6 게시판 구현하기 (html_entities 적용) (0) | 2024.02.06 |
4-5 게시판 구현하기 (summernote 적용) (0) | 2024.02.06 |
4-4 게시판 구현하기 (Preparedstatement 적용) (0) | 2024.02.06 |