Almon Dev

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

모의해킹/웹 개발

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

Almon 2024. 10. 24. 17:12

 

이미 로그인과 회원가입 페이지는 완성했었으나
몇 가지 고칠 점을 생각해 봤습니다.
https://almon.tistory.com/9 에서 수정한 내용입니다.

 

로그인

 

mysql.php

<?php
    function runSQL($sql) {
        $host = "localhost";
        $id = "root";
        $password = "admin1234";
        $dbname = "almond";

        $conn = mysqli_connect($host, $id, $password, $dbname);

        if (!$conn) {
            die("mysql 연결 에러 : ". mysqli_connect_error());
        }

        $result = mysqli_query($conn, $sql);
        if (!$result) {
            die("쿼리문 에러 : " . mysqli_error($conn));
        }

        mysqli_close($conn);
        
        return $result;
    }

?>

 

수정 없음


login_proc2.php

수정 전

<?php
    include("mysql.php");

    $id = $_POST["id"];
    $pass = $_POST["passwd"];
    $url = '/login_successful.php';
    $sql = 'select id,password,nickname from users;';

    $sql_result = runSQL($sql);

    $result = false;

    if (mysqli_num_rows($sql_result) > 0) {
        while ($row = mysqli_fetch_array($sql_result)) {
            if ($id == $row['id'] && $pass == $row['password']) {
                $nickname = $row['nickname'];

                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>";

                $result = true;
            }
        }

        if(!$result) {
            header('Location: login2.php?result=failed');
        }
    }

?>

 

수정 후

<?php
    include("mysql.php");

    $id = $_POST["id"];
    $pass = $_POST["passwd"];
    $url = '/login_successful.php';
    $sql = "select nickname from users where id='$id' and password='$pass';";

    $sql_result = runSQL($sql);

    if ($row = mysqli_fetch_array($sql_result)) {
        $nick = $row['nickname'];

        echo "<form id='redirection-form' action='$url' method='post'>";
        echo "<input type='hidden' name='nickname' value='$nick'>";
        echo "</form>";
        echo "<script>document.getElementById('redirection-form').submit()</script>";
        exit;
    }    
    header('Location: login2.php?result=failed');
?>

 

$sql = "select nickname from users where id='$id' and password='$pass';";

sql문을 수정했습니다

본래는 users의 모든 값을 받아온 뒤 while문으로 한 줄씩 읽으면서 아이디와 패스워드를 대조해 보았지만

지금은 where문을 사용해서 mysql서버에서 바로 대조를 거치고 결과 값을 받아오는 방식으로 변경했습니다.

어제는 exit;를 사용하지 않아서 로그인에 성공하든 실패하든 header('location : ') 부분이 실행되어
로그인 실패창으로 이동해 버리는 바람에 if문을 한번 더 사용해야 했지만
노말틱님의 로그인 페이지를 보고 exit;의 존재를 알게 되어 수정해 보았습니다.


회원가입

 

sign_up.php

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>회원가입</title>
    <link rel="stylesheet" href="/css/sign_up.css">
    <script src="/script/duplicate_check.js" defer></script>
</head>
<body>
    <container class="signup-container">
        <form action="sign_up_proc.php" method="post" class="signup-form">
            <div class="logo-container">
                <a href="/login2.php"><img src="/imgs/almond.png" alt="logo" class="logo"></a>
            </div>
            <h2>Almond</h2>
            <input type="text" name="id" placeholder="아이디" class="signup-input id-input" required>
            <input type="password" name="pass" placeholder="비밀번호" class="signup-input pass-input" required>
            <input type="password" name="passCheck" placeholder="비밀번호 확인" class="signup-input pass-input-check" required>
            <input type="text" name="nickname" placeholder="닉네임" class="signup-input nickname-input" required>
            <input type="email" name="email" placeholder="이메일" class="signup-input email-input" required>
            <div class="agreement">
                <input type="checkbox" id="sign_up_agreement" required>
                <label for="sign_up_agreement">회원가입에 동의합니다.</label>
            </div>
            <button type="submit" class="signup-submit">회원가입</button>
        </form>
    </container>
</body>
</html>

 

sign_up_proc.php

수정전

<?php 
    include ("mysql.php");
            
    header("Content-Type: apllication/json");

    $id = $_POST['id'];
    $nick = $_POST['nickname'];
    $pass = $_POST['pass'];
    $passCheck = $_POST['passCheck'];
    $email = $_POST['email'];
            
    $id_duple = false;
    $nick_duple = false;
    $pass_duple = false;
    $result = false;

    $sql = "select * from users;";
    $sql_result = runSQL($sql);

    if (mysqli_num_rows($sql_result) > 0) {
        while ($row = mysqli_fetch_array($sql_result)) {
            if ($id == $row["id"]) {
                $id_duple = true;
            }

            if ($nick == $row['nickname']) {
                $nick_duple = true;
            }

        }
    }  
            
    if($pass != $passCheck) {
        $pass_duple = true;
    }
            
    if (!$id_duple && !$pass_duple && !$nick_duple) {
        $result = true;
        runSQL("insert into users values ('$id', '$nick', '$email', '$pass')");
    }


    echo json_encode(['result' => $result, 'id' => $id_duple, 'nick' => $nick_duple, 'pass' => $pass_duple]);         
?>

 

수정 후

<?php 
    include ("mysql.php");
            
    header("Content-Type: apllication/json");

    $id = $_POST['id'];
    $nick = $_POST['nickname'];
    $pass = $_POST['pass'];
    $passCheck = $_POST['passCheck'];
    $email = $_POST['email'];
            
    $id_duple = false;
    $nick_duple = false;
    $pass_duple = false;
    $result = false;

    $sql = "select id,nickname from users where id='$id' or nickname='$nick';";
    $sql_result = runSQL($sql);

    if (mysqli_num_rows($sql_result) > 0) {
        while ($row = mysqli_fetch_array($sql_result)) {
            if ($id == $row["id"]) {
                $id_duple = true;
            }

            if ($nick == $row['nickname']) {
                $nick_duple = true;
            }

        }
    }  
            
    if($pass != $passCheck) {
        $pass_duple = true;
    }
            
    if (!$id_duple && !$pass_duple && !$nick_duple) {
        $result = true;
        runSQL("insert into users values ('$id', '$nick', '$email', '$pass')");
    }


    echo json_encode(['result' => $result, 'id' => $id_duple, 'nick' => $nick_duple, 'pass' => $pass_duple]);         
?>

 

$sql = "select id,nickname from users where id='$id' or nickname='$nick';";

sql문을 모든 데이터를 받아오던 방식에서 아이디와 닉네임 둘 중 한 개 이상이 일치한 데이터를 받아옵니다.

   if (mysqli_num_rows($sql_result) > 0) {
        while ($row = mysqli_fetch_array($sql_result)) {
            if ($id == $row["id"]) {
                $id_duple = true;
            }

            if ($nick == $row['nickname']) {
                $nick_duple = true;
            }

        }
    }

while문을 돌면서 어떤 것이 중복인지 $..._duple함수에 기록합니다.

 

    if (!$id_duple && !$pass_duple && !$nick_duple) {
        $result = true;
        runSQL("insert into users values ('$id', '$nick', '$email', '$pass')");
    }

모든 검증을 통과하면 insert문으로 데이터를 삽입하여 회원가입을 완료합니다.

 

echo json_encode(['result' => $result, 'id' => $id_duple, 'nick' => $nick_duple, 'pass' => $pass_duple]);

회원가입 성공여부와 아이디, 패스워드, 닉네임의 검증값을 json에 담아 응답합니다.


 

오늘 한일을 생각하면 강의를 듣고 내용을 정리한 것과
강의를 바탕으로 만들어봤던 웹사이트를 수정한 것입니다.

다음에 할 일은 로그아웃 기능과 미니 미션이 되겠네요