Almon Dev

모의해킹 공부 정리 2일차 (과제) 본문

모의해킹/웹 개발

모의해킹 공부 정리 2일차 (과제)

Almon 2024. 10. 18. 18:38

 

 

대표사진

 

과제는 끝냈다고 생각했으나 만들고 보니 추가할 점이 많이 보였습니다.

오늘 추가한 점은 id : admin passwd : admin1234를 if문으로 하드코딩 하는 게 아니라

users.txt라는 파일에 저장한 뒤 해당 파일을 읽어와서 로그인하는 과정을 추가했습니다.

users.txt

admin:admin1234:Almond Dev
test:test1234:tester

' : '을 이용해서 문자열을 스플릿 하기 위해서 id:passwd:nickname으로 저장했습니다.


login_proc2.php

<?php 
    $id = $_POST["id"];
    $pass = $_POST["passwd"];
    $url = '/login_successful.php';

    $users = fopen($_SERVER['DOCUMENT_ROOT']."/storage/users.txt", 'r');
    if ($users) {
        while($user = fgets($users)) {
            // echo "$user <br> ";

            $user_split = explode(":", $user);
            // printf("id: %s pass: %s nickname: %s <br>", ...$user_split);

            if($user_split[0] == $id && $user_split[1] == $pass) {
                $nickname = $user_split[2];
                fclose($users);

                echo "<form id='redirection-form' action='$url' method='post'>";
                echo "<input type='hidden' name='nickname' value='$nickname'>";
                echo "</form>";
                echo "<script>document.getElementById('redirection-form').submit()</script>";
            }
        }
        fclose($users);
        header('Location: login2.php?result=failed');
    }else {
        echo "파일이 없음";
    }

    // if ($id == "admin" && $pass == "admin1234") {
    //     header('Location: login_successful.php');
    // }else {
    //     header('Location: login2.php?result=failed');
    // }

?>

 

fopen을 이용해 users.txt 파일을 읽기 모드로 $users에 저장합니다.

$users = fopen($_SERVER['DOCUMENT_ROOT']."/storage/users.txt", 'r');

 

$user = fgets($users)를 while문으로 반복합니다. 

fgets는 파일을 한 줄씩 읽어오며 파일의 끝에 도달하면 false를 반환하므로 반복문이 알아서 종료됩니다.

if ($users) {
        while($user = fgets($users)) {

 

이후에 explod함수를 이용해 ':'을 기준으로 스플릿 해서 아이디와 비밀번호를 if문으로 검사합니다.

 $user_split = explode(":", $user);
  if($user_split[0] == $id && $user_split[1] == $pass) {

 

$nickname에 해당 아이디의 닉네임을 저장하고 $users파일을 종료합니다.

$nickname = $user_split[2];
fclose($users);

 

form과 hidden타입의 input태그로 $nickname을 post로 전송합니다

header('Location:...')을 이용한 리다이렉션은 GET메서드가 기본이라 다른 방식을 사용했습니다

echo "<form id='redirection-form' action='$url' method='post'>";
echo "<input type='hidden' name='nickname' value='$nickname'>";
echo "</form>";
echo "<script>document.getElementById('redirection-form').submit()</script>";

 

일치하는 아이디와 비밀번호가 없이 while문이 종료되면

fclose($users)로 파일을 종료하고, header('Location...')로 리다이렉션 합니다.

fclose($users);
header('Location: login2.php?result=failed');

 

간단해 보였는데 생각보다 오랜 시간이 걸렸습니다.

DB를 사용하는 게 더 좋지만 DB 없이 파일로도 한 번쯤 해보고 싶었는데 이번 기회에 해보네요

다음에 추가해 볼 것은 회원가입으로 생각하고 있습니다.