마이페이지 만들기

비밀번호변경 기능이 있는 마이페이지를 만들어보자

기본적인 틀은 회원가입의 틀을 가져와 사용한다.

 

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'];
}

?>

 

+ Recent posts