kjh00n의 기록저장소

여러기능의 WEB 만들기 본문

어플리케이션 보안 운영

여러기능의 WEB 만들기

kjh00n 2024. 12. 31. 11:46

WEB 구성

index.php

관리자님 환영합니다~!는 login_check.php에서 변수를 설정하고 그 변수를 index.php에서 출력하도록 설정한 것WEB 구성

<!doctype html>
<html>
        <head> 
                <title>Web Test Site</title>
                <link rel="stylesheet" href="style_contents.css" type="text/css">
        </head>
        <body>
                        <iframe src="head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
                <div id="main_contents" class="contents">
                    <?php
                        session_start();
                        if($_SESSION["user_id"]){
                            echo "<font color='#252525' size='8em'>환영합니다. ".$_SESSION["nickname"]."님</font>";
                        }

                    ?>
                    <br>
                    <p>
                        <font color="#323232" size="4em">
                        웹 해킹을 공부하고 싶은데 연습할 곳이 없으시다구요?<br>
                        실제 사이트에 연습하다가는 <strong>!!철컹철컹!!</strong> 아시죠?<br>
                        이곳은 Web Hacking 연습을 위한 Test 사이트 입니다.<br>
                        이곳에서는 마음껏 연습하세요~!!^^<br>
                        </font>
                    </p> 
                </div>
        </body>
</html>

head.php

<!doctype html>
<html>
        <!-- head 부분 -->
        <head>
                <title>Web Test Site</title>
                <meta http-equiv="content-type" content="text/html; charset=UTF-8" >
                <link rel="stylesheet" href="style_head.css" type="text/css">
        </head>
        <body>
                <?php session_start(); ?>
                <div id="area_header">
                        <h1>Web Test Site</h1>
                </div>
                <div id="area_menu">
                        <a href="index.php" target="_parent">홈</a>
                        | <a href="board/board_list.php" target="_parent">게시판</a>
                <?php if(!$_SESSION["user_id"]): ?>
                        | <a href="member/login.php" target="_parent">로그인</a>
                        | <a href="member/register.php" target="_parent">회원가입</a>
                <?php else: ?>
                        | <a href="member/info.php" target="_parent"><?=$_SESSION["nickname"]?>님 정보</a>
                        | <a href="member/nick.php" target="_parent">닉네임수정</a>
                        | <a href="member/logout.php" target="_parent">로그아웃</a>
                <?php endif; ?>
                </div>
        </body>
</html>

dbconn.php

<?php
    $conn=mysqli_connect("localhost","root","P@ssw0rd","WebTest");
    mysqli_set_charset($conn,"utf8");
?>

CSS

style_content.css

@charset "utf-8";

/** 전체 스타일 **/
* { margin:0; padding:0; color:#323232;} /* 모든 태그 기본 margin/padding 0으로 초기화*/
a { text-decoration: none;} /* a 태그 밑줄 없애기 */

/** 하단 컨텐츠 부분 기본 스타일 **/
div.contents { height:100%; text-align:center; padding:15px; }
table { margin:auto; border: 0px; }
table td { text-align:left;}
table font { font-size:1em;}
table.grayColor th{ background-color:#c8c8c8;}
.center { text-align:center;}

/*메인화면 스타일*/
div#main_contents h1 {color:#FF8C00;}
div#main_contents font { font-weight:bold;}
div#main_contents strong {color:red;}

/*로그인화면 스타일*/
div#login_contents table td.input {
        border: 1px solid;
        text-align: center;
        width: 100px;
}

/*버튼 스타일*/
.btn_default{display:inline-block;height:25px;padding:0px 10px;font-size:13px;
        cursor:pointer;border:1px solid #9e9e9e;-webkit-user-select:none;-moz-user-select:none;
        -ms-user-select:none;user-select:none;line-height:25px;vertical-align:middle;}
.btn_gray{ background-color:#868686;  color:white;}

/* form 내부 select 태그 스타일 */
select{ height:22px; vertical-align:middle;}

style_head.css

@charset "utf-8";

/** 전체 스타일 **/
* { margin:0; padding:0;} /* 모든 태그 기본 margin/padding 0으로 초기화*/
a { text-decoration: none;} /* a 태그 밑줄 없애기 */

/** 상단 header 스타일 **/
div#area_header { text-align:center;margin:10px;}
div#area_header h1 { font-size:4em; color:#323232;}

/** 중간 메뉴바 스타일 **/
div#area_menu { height:28px; padding-top: 2px;background-color:#323232; text-align:center; color:white;}
div#area_menu a { color:white;}
div#area_menu a:hover { color:#FF8C00;}

member 폴더

login.php

<!doctype html>
<html>
        <!-- head 부분 -->
        <head>
                <title>Web Test Site</title>
                <meta http-equiv="content-type" content="text/html; charset=UTF-8" >
                <link rel="stylesheet" href="style_head.css" type="text/css">
        </head>
        <body>
                <?php session_start(); ?>
                <div id="area_header">
                        <h1>Web Test Site</h1>
                </div>
                <div id="area_menu">
                        <a href="index.php" target="_parent">홈</a>
                        | <a href="board/board_list.php" target="_parent">게시판</a>
                <?php if(!$_SESSION["user_id"]): ?>
                        | <a href="member/login.php" target="_parent">로그인</a>
                        | <a href="member/register.php" target="_parent">회원가입</a>
                <?php else: ?>
                        | <a href="member/info.php" target="_parent"><?=$_SESSION["nickname"]?>님 정보</a>
                        | <a href="member/nick.php" target="_parent">닉네임수정</a>
                        | <a href="member/logout.php" target="_parent">로그아웃</a>
                <?php endif; ?>
                </div>
        </body>
</html>

login_check.php

<?php

    session_start(); # 세션을 시작하는 함수

    $conn=mysqli_connect("localhost","root","P@ssw0rd","WebTest");
    mysqli_set_charset($conn,"utf8");


    $id=$_POST["user_id"];
    $pw=$_POST["user_pw"];

    $strSQL="select * from member where u_id='".$id."' and u_pw='".$pw."';";

  
    $rs=mysqli_query($conn,$strSQL);
    $rs_arr=mysqli_fetch_array($rs);

    if($rs_arr){
        $_SESSION["user_id"]=$rs_arr["u_id"];
        $_SESSION["nickname"]=$rs_arr["nickname"];
        echo "<script>
        alert('로그인 되었습니다.');
        location.replace('../index.php');
        </script>";
    } else {
        
        echo "<script>
        alert('아이디 또는 패스워드가 일치하지 않습니다.');
        history.back();
        </script>";
    }


?>

logout.php

로그인했음
로그아웃 성공
로그아웃되어 관리자님 환영합니다~!도 없어짐
로그인되지 않은 상태에서 로그아웃을 누르면 나옴
자동으로 로그인화면으로 이동

<?php

    session_start();
    if ($_SESSION["user_id"]){
        session_destroy();
        echo "<script>
        alert('로그아웃 되었습니다.');
        location.replace('../index.php');
        </script>";
    } else {
        echo "<script>
        alert('로그인 후 이용해 주세요.');
        history.back();
        </script>";
    }
    
?>

세션변수가 사용되었음
세션변수를 사용하려면 session_start();는 필수

register.php

<!doctype html>
<html>
        <head> 
                <title>회원 가입</title>        
                <link rel="stylesheet" href="../style_contents.css" type="text/css">

                <script>
                    function ck(){
                        var en = /[^(a-zA-Z0-9)]/;
                        
                        if(en.test(document.mform.user_id.value)){
                            alert("ID는 영문/숫자만 가능합니다.");
                            mform.user_id.focus();
                            return false;
                        }
                        if(document.mform.user_id.value == "" || document.mform.user_id.value.length < 4 || document.mform.user_id.value.length > 12){
                            alert("ID를 다시 입력하세요.");
                            mform.user_id.focus();
                            return false;
                        }
                        if(document.mform.name.value == ""){
                            alert("이름을 입력하세요.");
                            mform.name.focus();
                            return false;
                        }
                        if(document.mform.user_pw1.value == "" || document.mform.user_pw1.value.length < 6 || document.mform.user_pw1.value.length > 20){
                            alert("비밀번호를 다시 입력하세요.");
                            mform.user_pw1.focus();
                            return false;
                        }
                        if(document.mform.user_pw1.value != document.mform.user_pw2.value){
                            alert("비밀번호가 일치하지 않습니다.");
                            mform.user_pw2.focus();
                            return false;
                        }
                        else{
                            document.mform.submit();
                        }
                    }
                </script>
        </head>
        <body>
                        <iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
                <div id="register_contents"  class="contents">
                <form name="mform" method="post" action="register_ok.php">
                        <table width="550" cellpadding="3" class="grayColor">
                                <tr>
                                <th colspan="2" style="background-color: #323232" >
                                        <font style="color: white; font-size: 150%;" >회 원 등 록</font>
                                </th>
                                </tr>
                                <tr>
                                        <th width="120px"><font>*ID</font></th>
                                        <td>
                                                <input type="text" name="user_id" size="15" maxlength="12">
                                                &nbsp;&nbsp;&nbsp;<font style="color:red;">4~12(영문/숫자)</font>
                                        </td>
                                </tr>
                                <tr>
                                        <th><font>*이   름</font></th>
                                        <td><input type="text" name="name" size="15" maxlength="10"></td>
                                </tr>
                                <tr>
                                        <th><font>*비밀번호</font></th>
                                        <td>
                                                <input type="password" name="user_pw1" size="20" maxlength="20">
                                                &nbsp;<font style="color:red;">6~20(영문/숫자/특수문자)</font>
                                        </td>
                                </tr>

                                <tr>
                                        <th><font>*비밀번호 확인</font></th>
                                        <td><input type="password" name="user_pw2" size="20" minlength="6" maxlength="20"></td>
                                </tr>
                                <tr>
                                        <th><font>나이</font></th>
                                        <td><input type="number" name="age" size="30" min="0" max="150"></td>
                                </tr>
                                <tr>
                                        <th><font>닉네임</font></th>
                                        <td><input type="text" name="nick" size="30" maxlength="30"></td>
                                </tr>
                                <tr>
                                        <th><font>EMAIL</font></th>
                                        <td><input type="text" name="email" size="30" maxlength="30"></td>
                                </tr>
                        </table>
                        <p>
                                <font size=2>* 는 필수 입력 항목입니다.</font><br/><br/>
                                <input type="button" value="등록" onclick="ck();" class="btn_default btn_gray" >
                                <input type="reset" value="삭제" class="btn_default btn_gray" >
                        </p>
                </form>
                </div>

        </body>
</html>

/[^(a-zA-Z0-9)]/는 알파벳 대소문자와 숫자가 아닌 문자를 찾는 정규 표현식입니다.

※특수기호는 범위가 없어서 다 적어야된다~ 쉗


register_ok.php

<?php

    $conn=mysqli_connect("localhost","root","P@ssw0rd","WebTest");
    mysqli_set_charset($conn,"utf8");

    $id=$_POST["user_id"];
    $name=$_POST["user_name"];
    $pw1=$_POST["user_pw1"];
    $pw2=$_POST["user_pw2"];
    $age=$_POST["age"];
    $nick=$_POST["nick"];
    $email=$_POST["email"];

    if(!$age) $age=0;
    if(!$nick) $nick=$name;
    
    $strSQL="select * from member where u_id='".$id."';";
    $rs=mysqli_query($conn,$strSQL);
    $rs_arr=mysqli_fetch_array($rs);

    if($rs_arr){
        echo "<script>
        alert('이미 사용중인 ID 입니다.');
        history.back();
        </script>";
    } else {
        $strSQL="insert into member set u_id='$id', u_pw='$pw1', u_name='$name', age=$age, nickname='$nick', email='$email', reg_date=now();";
        mysqli_query($conn,$strSQL);
        echo "<script>
        alert('회원가입이 완료되었습니다.');
        location.replace('../index.php');
        </script>";
    }

?>

nick.php

<!DOCTYPE html>
<html lang="en">
<head>
    <title>닉네임</title>
    <link rel="stylesheet" href="../style_contents.css" type="text/css">
</head>
<body>
    <iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
    <div id="nick_contents" class="contents">
    <?php
        session_start();
        if(!$_SESSION["user_id"]){
            echo "<script>
            alert('로그인이 필요합니다.');
            location.replace('login.php');
            </script>";
            exit();
        }
        if($_GET["ch"]==1){
            echo "<h5>성공적으로 변경되었습니다.</h5>";
        }
        else if($_GET["ch"]==2){
            echo "<h5>변경에 실패했습니다.</h5>";
        }
    ?>
        <form action="nick_change.php">
            <table cellpadding="10" style="border: 0px;">
                <tr>
                    <th>닉네임 : </th>
                    <td><input type="text" name="nick" value=<?=$_SESSION["nickname"] ?>></td>
                    <td><input type="submit" value="변경" class="btn_default btn_gray"></td>
                </tr>
            </table>
        </form>
</body>
</html>

nick_change.php

<?php

    session_start();

    $nick=$_GET["nick"];
    if(!$nick){
        echo "<script>
        alert('닉네임을 입력하세요.');
        history.back();
        </script>";
        exit();
    }

    $conn=mysqli_connect("localhost", "root", "P@ssw0rd", "WebTest");
    mysqli_set_charset($conn, 'utf8');
    $strSQL="update member set nickname='$nick' where u_id='$_SESSION[user_id]';";
    
    $rs=mysqli_query($conn, $strSQL);
    if($rs){
        $_SESSION["nickname"]=$nick;
        header("Location: nick.php?ch=1");
    }
    else{
        header("Location: nick.php?ch=2");
    }


?>

info.php

<!doctype html>
<html>
        <head> 
                <title>회원 정보</title>
                <link rel="stylesheet" href="../style_contents.css" type="text/css">       
                <script>
                    function ck()
                    {
                        if(!document.mform.user_pw1.value=="" && document.mform.user_pw1.value.length < 6 || document.mform.user_pw1.value.length > 20)
                        {
                            alert("비밀번호를 다시 입력하세요.");
                            mform.user_pw1.focus();
                            return false;
                        }
                        if(document.mform.user_pw1.value != document.mform.user_pw2.value)
                        {
                            alert("비밀번호가 일치하지 않습니다.");
                            mform.user_pw2.focus();
                            return false;
                        }
                        
                        document.mform.submit();
                        
                    }
                </script>
        </head>
        <body>
                        <iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
                <div id="info_contents" class="contents">
                <?php
                    session_start();
                    if(!$_SESSION["user_id"]){
                        echo "<script>
                        alert('로그인 후 이용해 주세요.');
                        location.replace('login.php');
                        </script>";
                        exit();
                    }
                    $conn = mysqli_connect("localhost", "root", "P@ssw0rd", "WebTest");
                    mysqli_set_charset($conn, "utf8");
                    $strSQL = "select * from member where u_id='$_SESSION[user_id]';";
                    $rs = mysqli_query($conn, $strSQL);
                    $rs_arr = mysqli_fetch_array($rs);

                    if($_GET["ch"]==1){
                        echo "<h5>성공적으로 변경되었습니다.</h5>";
                    }
                    else if($_GET["ch"]==2){
                        echo "<h5>변경에 실패했습니다.</h5>";
                    }
                ?>
                        <form name='mform' method="post" action="info_change.php">
                        <table width="500" cellpadding="3" class="grayColor">
                                <tr>
                                <th colspan="2" style="background-color: #323232" >
                                        <font style="color: white; font-size: 150%;" >회 원 정 보</font>
                                </th>
                                </tr>
                                <tr>
                                        <th width="120px"><font>*ID</font></th>
                                        <td><?=$rs_arr["u_id"]?></td>
                                </tr>
                                <tr>
                                        <th><font>*이   름</font></th>
                                        <td><?=$rs_arr["u_name"]?></td>
                                </tr>
                                <tr>
                                        <th><font>*비밀번호</font></th>
                                        <td>
                                                <input type="password" name="user_pw1" size="20" maxlength="20">
                                                &nbsp;<font style="color:red;">6~20(영문/숫자/특수문자)</font>
                                        </td>
                                </tr>

                                <tr>
                                        <th><font>*비밀번호 확인</font></th>
                                        <td><input type="password" name="user_pw2" size="20" maxlength="20"></td>
                                </tr>
                                <tr>
                                        <th><font>나이</font></th>
                                        <td><input type="number" name="age" size="30" min="0" max="150" value=<?=$rs_arr["age"]?>></td>
                                </tr>
                                <tr>
                                        <th><font>닉네임</font></th>
                                        <td><input type="text" name="nick" size="30" maxlength="30" value=<?=$rs_arr["nickname"]?>></td>
                                </tr>
                                <tr>
                                        <th><font>EMAIL</font></th>
                                        <td><input type="text" name="email" size="30" maxlength="30" value=<?=$rs_arr["email"]?>></td>
                                </tr>
                        </table>
                        <p>
                                <font size=2>* 는 필수 입력 항목입니다.</font><br/><br/>
                                <input type="button" value="수정" onclick="ck();" class="btn_default btn_gray" >
                                <input type="reset" value="삭제" class="btn_default btn_gray" >
                        </p>
                </form>
                </div>
        </body>
</html>

info_change.php

<?php

    session_start();

    $conn=mysqli_connect("localhost", "root", "P@ssw0rd", "WebTest");
    mysqli_set_charset($conn, 'utf8');

    $pw1=$_POST["user_pw1"];
    $pw2=$_POST["user_pw2"];
    $age=$_POST["age"];
    $nick=$_POST["nick"];
    $email=$_POST["email"];
    if(!$nick) $nick=$_SESSION["nickname"];

    $strSQL="update member set nickname='$nick', u_pw='$pw1'";
    if($pw1) $strSQL .= ", u_pw='$pw1'";
    if($age) $strSQL .= ", age=$age";
    if($email) $strSQL .= ", email='$email'";
    $strSQL .= " where u_id='$_SESSION[user_id]'";
    $rs=mysqli_query($conn, $strSQL);
    if($rs){
        $_SESSION["nickname"]=$nick;
        header("Location: info.php?ch=1");

    } else {
        header("Location: info.php?ch=2");    
    }

?>

board 폴더

board_write.php

<!doctype html>
<html>
        <!-- head 부분 -->
        <head>
                <!-- 상단 title -->
                <title>게시판</title>
                <!-- CSS Style 지정 -->
                <link rel="stylesheet" href="../style_contents.css" type="text/css">
                <script>
                    function ck() {
                        if (document.wform.name.value == "") {
                            alert("이름을 입력하세요.");
                            wform.name.focus();
                            return false;
                        }
                        if (document.wform.pw.value == "") {
                            alert("비밀번호를 입력하세요.");
                            wform.pw.focus();
                            return false;
                        }
                        if (document.wform.sub.value == "") {
                            alert("제목을 입력하세요.");
                            wform.sub.focus();
                            return false;
                        }
                        if (document.wform.cont.value == "") {
                            alert("내용을 입력하세요.");
                            wform.cont.focus();
                            return false;
                        }
                        document.wform.submit();
                    }
                    function re() {
                        document.wform.reset();
                    }
                </script>
        </head>
        <body>
                <!-- 화면 상단 header 부분 -->
                <iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
                <!-- 화면 하단 body 부분 -->
                <div id="board_contents" class="contents">
                    <?php

                        session_start();
                        if($_SESSION["user_id"]){
                            require "../dbconn.php";
                            $strSQL="select u_name,email from member where u_id='$_SESSION[user_id]'";
                            $rs=mysqli_query($conn,$strSQL);
                            $rs_arr=mysqli_fetch_array($rs);
                            $name=$rs_arr["u_name"];
                            $email=$rs_arr["email"];
                        }

                    ?>
                        <form name="wform" method="post" action="board_write_ok.php" enctype="multipart/form-data">
                                <table width="600" class="grayColor">
                                        <tr>
                                                <th colspan="5" style="background-color: #323232" >
                                                        <font style="color: white; font-size: 150%;" >게 시 글 작 성</font>
                                                </th>
                                        </tr>
                                        <tr>
                                                <th width="100"><font>이  름</font></th>
                                                <td><input type="text" name="name" size="11" value="<?=$name;?>"></td>
                                        </tr>
                                        <tr>
                                                <th><font>비밀번호</font></th>
                                                <td><input type="password" name="pw" size="12"></td>
                                        </tr>
                                        <tr>
                                                <th><font>이메일</font></th>
                                                <td colspan="3"><input type="text" name="email" size="40" value="<?=$email;?>"></td>
                                        </tr>

                                        <tr>
                                                <th><font>제  목</font></th>
                                                <td colspan="3"><input type="text" name="sub" size="40"></td>
                                        </tr>
                                        <tr>
                                                <th><font>HTML적용</font></th>
                                                <td colspan="3">
                                                        <input type="radio" name="tag" value="T" checked><font size="3">적용</font>
                                                        <input type="radio" name="tag" value="F"><font size="3">비적용</font>
                                                </td>
                                        </tr>
                                        <tr>
                                                <th><font>내  용</font></th>
                                                <td colspan="3" align="center"><textarea name="cont" cols="60" rows="10" style="border: 0px;"></textarea></td>
                                        </tr>
                                        <tr>
                                                <th><font>파일첨부</font></th>
                                                <td colspan="3"><input type="file" name="att_file"><font size="2">&nbsp;&nbsp;(최대 4MB)</font></td>
                                        </tr>
                                </table>
                        </form>

                        <p align="center">
                                <input type="button" value="등록" onclick="ck();" class="btn_default btn_gray">
                                <input type="button" value="다시작성" onclick="re();" class="btn_default btn_gray">
                                <input type="button" value="목록" onclick="location.replace('board_list.php');" class="btn_default btn_gray">
                        </p>
                </div>
        </body>
</html>

board_write_ok.php

<?php

    session_start();
    $b_name=$_POST["name"];
    $b_pw=$_POST["pw"];
    $b_email=$_POST["email"];
    $b_sub=$_POST["sub"];
    $b_cont=$_POST["cont"];
    $b_tag=$_POST["tag"];

    $f_error=$_FILES["att_file"]["error"];
    if($f_error==0){
        $f_name=$_FILES["att_file"]["name"];
        $f_path="upload/".$f_name;
        $f_tmp=$_FILES["att_file"]["tmp_name"];
        $f_size=$_FILES["att_file"]["size"];

        // 파일 중복 방지 처리
        $f_name_only1=substr($f_name,0,strrpos($f_name,'.')); //파일명 저장
        $f_name_ext=substr($f_name,strrpos($f_name,'.')); //확장자명 저장
        $f_name_only2=$f_name_only1; 
        for($i=1; is_file($f_path); $i++){
            $f_name_only1=$f_name_only2.$i;
            $f_path="./upload/".$f_name_only1.$f_name_ext;
        }
        $f_name=$f_name_only1.$f_name_ext;
    } else if ($f_error!=4){
        echo "<script>
        alert('파일 업로드에 실패했습니다(에러코드:$f_error).');
        history.back();
        </script>";
        exit;
    }
    
    // file error code 종류

    // 0 : 성공
    // 1 : php.ini (php 설정 파일) 의 최대 파일 업로드 사이즈보다 큰 경우 에러
    // 2 : html form 태그에서 지정한 최대 파일 업로드 사이즈보다 큰 경우 에러
    // 3 : 파일이 일부분만 전송되는 경우 에러
    // 4 : 파일이 전송되지 않는 경우 에러
    // 6 : 임시 폴더가 없는 경우 에러
    // 7 : 저장 장치에 파일 생성, 쓰기가 실패하는 경우 에러
    // 8 : 확장 모듈이 파일 업로드를 중지하는 경우 에러

    require "../dbconn.php";
    //$strSQL="insert into board set strName='$b_name', strPassword='$b_pw', strEmail='$b_email', strSubject='$b_sub', strContent='$b_cont', htmlTag='$b_tag', writeDate=now();";
    $strSQL="insert into board set strName='$b_name', strPassword='$b_pw', strEmail='$b_email',";
    $strSQL.="strSubject='$b_sub', strContent='$b_cont', htmlTag='$b_tag', writeDate=now()";
    if($f_error==0){
        if($f_size=="") $f_size=0; // 파일 사이즈가 없을 경우 0으로 처리
        $strSQL.=", filename='$f_name', filesize='$f_size';";
        $f_rs=move_uploaded_file($f_tmp, $f_path);
    }
    $rs=mysqli_query($conn,$strSQL);
    if($rs){
        echo "<script>
        alert('글이 등록되었습니다.');
        location.replace('../board/board_list.php');
        </script>";
    } else {
        echo "<script>
        alert('글 등록에 실패했습니다.');
        history.back();
        </script>";
    }

?>

board_view.php

<!doctype html>
<html>
        <!-- head 부분 -->
        <head>
                <title>게시판</title>
                <link rel="stylesheet" href="../style_contents.css" type="text/css">
        </head>
        <body>
                <iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
                <div id="board_contents" class="contents">
                    <?php
                        session_start();
                        require "../dbconn.php";
                        $r_num=$_GET["num"];
                        $strSQL="update board set viewCount=viewCount+1 where strNumber=".$r_num.";";
                        mysqli_query($conn,$strSQL);

                        $strSQL="select * from board where strNumber=".$r_num.";";
                        $rs=mysqli_query($conn,$strSQL);
                        $rs_arr=mysqli_fetch_array($rs);
                    ?>
                <table width="600" border="1" cellpadding="2" class="grayColor">
                        <tr>
                                <th colspan="5" style="background-color: #323232" >
                                        <font style="color: white; font-size: 150%;" >내용 보기</font>
                                </th>
                        </tr>
                        <tr>
                                <th width="15%"><font>이름</font></th>
                                <td width="35%"><font><?=$rs_arr["strName"];?></font></td>
                                <th width="15%"><font>등록일</font></th>
                                <td width="35%"><font><?=$rs_arr["writeDate"];?></font></td>
                        </tr>
                        <tr>
                                <th width="15%"><font>이메일</font></th>
                                <td width="35%"><font><?=$rs_arr["strEmail"];?></font></td>
                                <th width="15%"><font>조회</font></th>
                                <td width="35%"><font><?=$rs_arr["viewCount"];?></font></td>
                        </tr>
                        <tr>
                                <th width="15%"><font>제목</font></th>
                                <td colspan="3"><font><?=$rs_arr["strSubject"];?></font></td>
                        </tr>
                        <tr>
                                <th width="15%"><font>내용</font></th>
                                <td colspan="4" style="padding:15px 0;"><font><?=$rs_arr["strContent"];?></font></td>
                        </tr>
                        <tr>
                                <th width="15%"><font><b>첨부 파일</b></font></th>
                                <td colspan="3"><font>
                                    <?php if($rs_arr["filename"]!="") { ?>
                                            <a href="board_file_download.php?filename=<?=$rs_arr['filename'];?>"><?=$rs_arr["filename"];?>(<?=$rs_arr["filesize"];?>바이트)</a>
                                        <?php } ?>
                                </font></td>
                        </tr>
                </table>
                <br/>
                <p align="center">
                        <form method="post" action="board_delete_ok.php?num=<?=$r_num;?>">
                                <font>비밀번호</font>
                                <input type="password" name="b_pass" size="20">
                                <input type="submit" value="삭제" class="btn_default btn_gray">
                                &nbsp;&nbsp;&nbsp;&nbsp;
                                <input type="button" value="목록" onclick="location.replace('board_list.php');" class="btn_default btn_gray">
                </p>
                </div>
        </body>
</html>

board_list.php

<!DOCTYPE html>
<html>

<head>
    <title>게시판</title>
    <link rel="stylesheet" href="../style_contents.css" type="text/css">
</head>

<body>
    <iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
    <div id="board_contents" class="contents">
        <table width="600" border="1">
            <tr>
                <th colspan="5" style="background-color: #323232">
                    <font style="color: white; font-size:150%;">게 시 판</font>
                </th>
            </tr>
            <tr bgcolor="#c8c8c8">
                <th width="7%">번호</th>
                <th width="41%">제목</th>
                <th width="15%">작성자</th>
                <th width="30%">등록일</th>
                <th width="7%">조회</th>
            </tr>
            <?php
                $key="";
                if($_GET["keyword"]){
                    $key=$_GET["keyword"];
                    $k_s=$_GET["key_s"];
                    switch($k_s) {
                        case 1:
                            $strSQL="SELECT * FROM board WHERE strSubject LIKE '%$key%' ORDER BY strNumber DESC";
                            break;
                        case 2:
                            $strSQL="SELECT * FROM board WHERE strContent LIKE '%$key%' ORDER BY strNumber DESC";
                            break;
                        case 3:
                            $strSQL="SELECT * FROM board WHERE strName LIKE '%$key%' ORDER BY strNumber DESC";
                            break;
                        default:
                            $strSQL="SELECT * FROM board ORDER BY strNumber DESC";
                    }
                } else {
                    $strSQL="SELECT * FROM board ORDER BY strNumber DESC";
                }

                require "../dbconn.php";
                $rs=mysqli_query($conn,$strSQL);
                $rs_num=mysqli_num_rows($rs); //DB에 질의했을 때 행의 갯수를 출력
                if($rs_num==0): ?>
                <tr>
                    <td colspan="5" class="center"><strong>등록된 게시물이 없습니다.</strong></td>
                </tr>              
                <?php else: 
                while($rs_arr=mysqli_fetch_array($rs)) {

                $b_num=$rs_arr["strNumber"];
                $b_name=$rs_arr["strName"];
                $b_sub=$rs_arr["strSubject"];
                $b_date=$rs_arr["writeDate"];
                $b_no=$rs_arr["viewCount"];
            ?>
            <tr>
                <td width="7%"><?=$b_num?></td>
                <td width="41%"><a href="board_view.php?num=<?=$b_num?>"><?=$b_sub?></a></td>
                <td width="15%"><?=$b_name?></td>
                <td width="30%"><?=$b_date?></td>
                <td width="7%"><?=$b_no?></td>
            </tr>
            <?php
                } endif;
            ?>
        </table>
        <br>
        <p align="center">
        <input type="button" class="btn_default btn_gray" value="글쓰기" onclick="location.replace('board_write.php');">
        <br>
        <br>
        <?php
            if($key) {
                echo "[$key] 검색 결과입니다.";
            } else {
                echo "전체 글 검색 결과입니다.";
            }
        ?>
        <form action="board_list.php">
            <select name="key_s">
                <option value="1">제목</option>
                <option value="2">내용</option>
                <option value="3">작성자</option>
            </select>
            <input type="text" name="keyword">
            <input type="submit" class="btn_default btn_gray" value="검색">
        </form>
        </p>
    </div>
</body>

</html>

board_delete_ok.php

<?php
    $num=$_GET["num"];
    $pw=$_POST["b_pass"];
    
    require "../dbconn.php";
    
    $strSQL="SELECT * FROM board WHERE strNumber=$num AND strPassword='$pw'";
    $rs=mysqli_query($conn,$strSQL);
    $rs_arr=mysqli_fetch_array($rs);

    if($rs_arr){
        if(is_file("upload/$rs_arr[filename]")){
            unlink("upload/$rs_arr[filename]");
        }
        $strSQL="DELETE FROM board WHERE strNumber=$num";
        mysqli_query($conn,$strSQL);
        echo "<script>
        alert('게시물이 삭제되었습니다.');
        location.replace('board_list.php');
        </script>";
    } else {
        echo "<script>
        alert('게시물을 삭제할 수 없습니다.'); 
        history.back();
        </script>";
    }
?>

board_file_download.php

<?php
    $file_name=urldecode($_GET['filename']);
    $file_path="./upload/".$file_name;
    $file_size=filesize($file_path);

    header("Content-Type: application/x-octetstream");
    header("Content-Disposition: attachment; filename=".urldecode($file_name));
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: $file_size");

    readfile($file_path);
?>

DB와 로그인페이지 연결

login_check.php

로그인 성공시
로그인 실패시

<?php
    // ↓ 얘가 세션변수를 사용하고 싶을 때 필요함
    session_start();
    // DB 연결
    $conn=mysqli_connect("localhost","root","P@ssw0rd","WebTest");
    mysqli_set_charset($conn,"utf8");

    // POST 방식으로 날아온 user_id, user_pw 값들을 id와 pw라는 변수에 대입
    $id=$_POST["user_id"];
    $pw=$_POST["user_pw"];

    // DB 질의
    // (""를 여러개 사용하면 구분이 헷갈리기 때문에 ''로 구분을 나눠준다)
    // .은 php코드로써 . 앞에 있는 문자와 . 뒤에 있는 문자를 붙이겠다라는 의미
    // 데이터가 날아갈 때 SQL문은 SELECT * FROM member WHERE u_id='root' AND u_pass='1234';가 된다
    $strSQL="select * from member where u_id='".$id."' and u_pass='".$pw."';";

    // 질의한 결과를 rs라는 변수에 저장하겠다
    $rs=mysqli_query($conn,$strSQL);
    // 데이터를 받아서 저장할 때 복수의 데이터를 fetch_arr이라는 배열에 저장하고 그 값을 rs_arr이라는 변수에 저장
    $rs_arr=mysqli_fetch_array($rs);

    // rs_arr에 입력한 값이 있거나 없을 때
    // <script>는 자바 스크립트
    // alert는 경고창을 띄우는 것, 그 이후에 메인페이지로 이동
    // history.back은 이전 페이지로 돌아간다는 뜻
    // user_id라는 세션변수에 rs_arr에 저장된 값중 u_id 값을 저장
    if($rs_arr){
        $_SESSION["user_id"]=$rs_arr["u_id"];
        $_SESSION["nickname"]=$rs_arr["nickname"];
        echo "<script>
        alert('로그인 완료');
        location.replace('../index.php');
        </script>";
    } else {
        
        echo "<script>
        alert('아이디 또는 비밀번호가 일치하지 않습니다.');
        history.back();
        </script>";
    }


?>
※주의사항※

1.기본 php에는 mysqli_connect기능이 없어서 패키지를 다운받아야 된다.

2.php-mysqlnd라는 패키지 다운 (mysqli로 시작하는 함수 사용하려면 패키지 다운해야함)

3.적용하려면 systemctl restart httpd

4.변수라는 것은 그 페이지에서만 동작한다
Ex) a.php에 test라는 변수를 만들고 b.php에서 echo $test를 하면 출력되지 않는다
a.php의 test와 b.php의 test라는 변수는 서로 다른 것

5.페이지 안에 있는 변수를 지역변수라고 한다.

6.세션변수는 페이지에 상관 없이 사용할 수 있는 변수
(다른 페이지에 있는 변수를 불러올 수 있다)
세션변수를 사용하려면 session start();를 꼭 입력해야 한다

DB 설정

DB 구성함
root계정에 비밀번호 설정해주기
root 계정은 mariadb를 접속할 때 패스워드 입력안하고 들어올 수 있기에 패스워드입력안하고 들어오는 것을 삭제함
패스워드 입력해야 접속이 가능

 

'어플리케이션 보안 운영' 카테고리의 다른 글

WEB Session Attack  (0) 2025.01.06
WEB 인증 공격  (0) 2025.01.03
데이터 검증  (0) 2025.01.03
Information Gathering (정보 수집)  (0) 2025.01.02
WEB  (0) 2024.12.26