[Normaltic's 취업반 과제] 식별 / 인증 분리 + HASH 로그인

2024. 5. 2. 13:30정보보안 및 해킹/Normaltic's 취업반 과제

login.php - 로그인 버튼 분리 및 추가 -> 식별 인증 동시 / 식별 인증 분리 / 식별 인증 동시 및 해시조건비교 / 식별 인증 분리 및 해시조건비교

[생략]

<button class="submit-button" name="submitsametime" value="Loginsametime">Sign in 식별인증동시 </button><br>
      <button class="submit-button" name="submitseparate" value="Loginseparate">Sign in 식별인증분리 </button><br>
      <button class="submit-button" name="submitsametimewithhash" value="Loginsametimewithhash">Sign in 식별인증동시+해시 </button><br>
      <button class="submit-button" name="submitseparatewithhash" value="Loginseparatewithhash">Sign in 식별인증분리+해시 </button><br>
      <button class="submit-button" name="signup" value="signup">Sign up </button>
      <?php
      if (isset($_POST['submitsametime'])) {
        login_check($_POST['id'], $_POST['pass'], false, false);
      }
      if (isset($_POST['submitseparate'])) {
        login_check($_POST['id'], $_POST['pass'], false, true);
      }
      if (isset($_POST['submitsametimewithhash'])) {
        login_check($_POST['id'], $_POST['pass'], true, false);
      }
      if (isset($_POST['submitseparatewithhash'])) {
        login_check($_POST['id'], $_POST['pass'], true, true);
      }
      
      
      [생략]

connect_db.php - DB연결하는 부분에서 username으로만 쿼리를 구성할지 아니면 username과 userpassword를 가지고 쿼리를 구성할지 판단

[생략]

function find_name_use_sql($username, $userpass, $is_separate)
{
  $table_name = "rame_table";
  if($is_separate)
  {
    $sql_query = "SELECT * FROM $table_name WHERE name='$username'";
  }
  else
  {
  $sql_query = "SELECT * FROM $table_name WHERE name='$username' and password='$userpass'";
  }
  $sql_res =  mysqli_query(connect_db(), $sql_query);

  // if ($sql_res) {
  //   echo "QUERY ACTIVE <br>";
  // } else {
  //   echo "QUERY FAILED <br>";
  // }
  return $sql_res;
}

[생략]

login_func.php - 구성된 쿼리에서 받아온 결과문을 가지고 사용자가 입력한 비민번호를 해시처리하여 DB에 있는 해시처리 된 비밀번호와 비교하기 혹은 사용자가 입력한 비밀번호를 그대로 DB에 있는 평문 비밀번호와 비교할지 판단

[생략]

function try_check_login($username, $userpass, $is_hash, $is_separate)
{
  
  $sql_row = mysqli_fetch_array(find_name_use_sql($username, $userpass, $is_separate));
  
  //var_dump($sql_row);
  echo "name : " . $sql_row['name'];

  $db_id = $sql_row['name'];
  if($is_hash)
  {
    $db_pass = $sql_row['passwordhash'];
    $userpass = hash('sha256', $userpass);
  }
  else
  {
    $db_pass = $sql_row['password'];
  }
  
  if ($username == $db_id && $userpass == $db_pass) {
    echo "LOGIN SUCCESS <br>";
    return $username;
  } else {
    echo "LOGIN FAILED <br>";
  }
}

//LOGIN CHECK FUNCTION
function login_check($id, $pass, $is_hash, $is_separate)
{
  $login_res = try_check_login($id, $pass, $is_hash, $is_separate);
  
   echo $login_res;
  if ($login_res) {

    header("location: index.php?login_id=" . $login_res);
    exit;
  } else {
    echo "<script>alert('아이디 혹은 비밀번호가 틀렸습니다.');
location.href='index.php'
</script>";
    exit;
  }
}


[생략]