Web Hacking Study/Web Page 만들기

문의게시판 (문의 글 비밀번호 설정)

silver surfer 2022. 6. 22.

문의 글에 비밀번호를 설정하여 조회, 수정, 삭제 기능에 제한을 건다


▷ 문의 글 조회에 비밀번호 설정

 

문의게시판 페이지(qna.php) 리스트를 출력하는 테이블의 코드를 일부 수정한다

 

Step 1. 게시글의 제목을 클릭하면 q_check.php로 이동한다

<tbody>
    <tr align=center>
	<td><?php echo $cnt;?></td>
	<td width="500" align="center"><a href="q_check.php?idx=<?=$row['idx']?>"><?php echo $row['title'];?></a></td>
	<td width="100" align="center"><?php echo $row['name'];?></td>
	<td width="200" align="center"><?php echo $row['udate'];?></td>
	<td><?php echo $row['hit'];?></td>
    </tr>
</tbody>

 

Step 2. q_check.php에서 비밀번호를 확인한다

 

관리자 계정일 경우 비밀번호만 입력하고, 이외의 사용자에게는 게시글 작성 시 함께 입력한 연락처와 비밀번호를 함께 입력받는다.

게시글의 번호($idx)는 GET 방식으로 전달하고, 입력받은 데이터는 POST 방식으로 q_read.php로 전달한다.

 

** q_check.php

<?php
    session_start();

    $conn = mysqli_connect('localhost', 'root', 'mysql', 'logindb');
    $idx= $_GET["idx"];
    $sql= "SELECT * FROM q_board where idx='$idx'";
    $res = mysqli_fetch_array(mysqli_query($conn, $sql));
?>
    <form method = "post" action = "q_read.php?idx=<?=$res['idx']?>">
        <div>
        <?php    
            if($_SESSION['username']=='admin') { ?>
                <input name = "pw" type = "password" placeholder="게시글 비밀번호" autocomplete="new-password"/>
                <input type = "submit" value = "입력" />
            <?php } else { ?>
                <input class = "textbox" name = "email" type = "text" placeholder="Email" autocomplete="off"/>
                <span> & </span>
                <input name = "pw" type = "password" placeholder="게시글 비밀번호" autocomplete="new-password" />
                <input type = "submit" value = "입력" />
    	<?php   }  ?>
	    </div>
    </form>

 

Step 3. q_read.php에서 사용자 및 비밀번호를 확인한다

 

대부분은 일반 게시판 페이지와 비슷하다.

<body> 태그 내 첫 부분에 php 코드를 작성한다

관리자(admin)일 경우 비밀번호만 입력하면 되지만, 일반 사용자에게는 email과 pw를 요구한다

<?php
    $conn = mysqli_connect('localhost', 'root', 'mysql', 'logindb');
    $idx= $_GET["idx"];
    $email = $_POST['email'];
    $pw = $_POST['pw'];
    $hash = md5($pw); //암호화된 비밀번호

    $sql_hit = "UPDATE q_board SET hit=hit+1 WHERE idx=$idx";
    $res_hit = mysqli_query($conn, $sql_hit);

    $sql= "SELECT * FROM q_board where idx='$idx'";
    $res = mysqli_fetch_array(mysqli_query($conn, $sql));

    if($_SESSION['username']=='admin' && $res['pw'] == $hash) {
        echo "<script>alert('관리자 권한으로 조회합니다.');</script>";
    } else if ($_SESSION['username']=='admin' && $res['pw']!=$hash) {
        echo "<script>alert('비밀번호가 틀렸습니다.');";
        echo "window.location.href=\"q_check.php?idx=$idx\"</script>";
    } else if ($res['email'] == $email && $res['pw'] == $hash) {
    	echo "<script>alert('작성자 권한으로 조회합니다.');</script>";
    } else {
    	echo "<script>alert('게시글 조회 권한이 없습니다');";
        echo "window.location.href=\"q_check.php?idx=$idx\"</script>";
    }
?>

 

확인이 완료되면 게시글을 조회할 수 있다.

이 때 게시글 아래의 수정 버튼과 삭제 버튼도 일부 수정한다

 

Step 4. 수정 버튼 및 삭제 버튼 수정

 

편의상 버튼 아래에 script 코드를 작성했다.

<input type="hidden" name="pw" id="pw">
<button onclick="pw_check();">수정</button>&nbsp;&nbsp;
    <script>
	function pw_check(){
	document.getElementById('pw').value = prompt('게시글 비밀번호를 입력해주세요.', '비밀번호')
	var pw = document.getElementById('pw').value;
	if(pw){
		window.location = "q_modify.php?idx=<?=$idx?>&pw="+pw;
	    }
	}
    </script>

input type="hidden"을 이용해 pw 값을 prompt 창으로 받은 값으로 넘긴다

버튼을 클릭하면 script에서 pw_check() 함수를 실행한다

pw_check()가 실행되면 prompt창으로 비밀번호를 입력받고 q_modify.php(문의게시글 수정 페이지)에 idx와 입력받은 pw를 GET 방식으로 전달한다

 

삭제 버튼에도 이와 같이 적용한다.

ask()가 실행되면 prompt창으로 비밀번호를 입력받고 q_delete.php(문의게시글 삭제 페이지)에 idx와 입력받은 pw를 GET 방식으로 전달한다

<button onclick="ask();">삭제</button>
    <script>
	function ask() {
    	document.getElementById('pw').value = prompt('게시글 비밀번호를 입력해주세요.', '비밀번호')
    	var pw = document.getElementById('pw').value;
    	if(pw){
		window.location = "q_delete.php?idx=<?=$idx?>&pw="+pw;
    	    }
	}
    </script>

 

** q_read.php (더보기 클릭)

더보기
<!DOCTYPE html>
<?php
    session_start();
?>
<html lang="ko">
<head>
    <meta charset="UTF-8">
</head>
<body>
<?php
    $conn = mysqli_connect('localhost', 'root', 'mysql', 'logindb');
    $idx= $_GET["idx"];
    $email = $_POST['email'];
    $pw = $_POST['pw'];
    $hash = md5($pw);

    $sql_hit = "UPDATE q_board SET hit=hit+1 WHERE idx=$idx";
    $res_hit = mysqli_query($conn, $sql_hit);

    $sql= "SELECT * FROM q_board where idx='$idx'";
    $res = mysqli_fetch_array(mysqli_query($conn, $sql));

    if($_SESSION['username']=='admin' && $res['pw'] == $hash) {
        echo "<script>alert('관리자 권한으로 조회합니다.');</script>";
    } else if ($_SESSION['username']=='admin' && $res['pw']!=$hash) {
        echo "<script>alert('비밀번호가 틀렸습니다.');";
        echo "window.location.href=\"q_check.php?idx=$idx\"</script>";
    } else if ($res['email'] == $email && $res['pw'] == $hash) {
    	echo "<script>alert('작성자 권한으로 조회합니다.');</script>";
    } else {
    	echo "<script>alert('게시글 조회 권한이 없습니다');";
        echo "window.location.href=\"q_check.php?idx=$idx\"</script>";
    }
?>
    <table align=center>
        <tr>
            <td colspan="4");"><?php echo $res['title'] ?></td>
        </tr>
        <tr>
            <td>작성자</td>
            <td><?php echo $res['name'] ?></td>
            <td>조회수</td>
            <td><?php echo $res['hit'] ?></td>
        </tr>
        <tr>
        	<td>연락처</td>
            <td colspan="4">
                <?php echo $res['email'] ?></td>
        </tr>
        <tr>
            <td colspan="4">
                <?php echo $res['content'] ?></td>
        </tr>
        <tr>
            <td>첨부파일</td>
            <td>
                <?php 
                if($res['file']) { ?>
                <a href='./download.php?file=<?=$res['file'];?>&target_Dir=./file/uploads'>다운로드</a>
           <?php } else { ?>
           <?php } ?>
            </td>
        </tr>
    </table>
    <div>
    	<button onclick="location.href='qna.php'">목록</button>&nbsp;&nbsp;
        <input type="hidden" name="pw" id="pw">
    	<button onclick="pw_check();">수정</button>&nbsp;&nbsp;
        <script>
            function pw_check(){
                document.getElementById('pw').value = prompt('게시글 비밀번호를 입력해주세요.', '비밀번호')
                var pw = document.getElementById('pw').value;
                if(pw){
                    window.location = "q_modify.php?idx=<?=$idx?>&pw="+pw;
                }
            }
        </script>
    	<button onclick="ask();">삭제</button>
        <script>
            function ask() {
                document.getElementById('pw').value = prompt('게시글 비밀번호를 입력해주세요.', '비밀번호')
                var pw = document.getElementById('pw').value;
                if(pw){
                    window.location = "q_delete.php?idx=<?=$idx?>&pw="+pw;
                }
            }
        </script>
    </div>
</body>
</html>

 


▷ 문의 글 수정 페이지(q_modify.php) 및 문의 글 수정 처리 페이지(q_modify_ok.php)

 

Step 1. 글을 수정하기 전, 사용자 확인

 

<body> 안에 php 코드 입력

idx와 pw 값을 GET 방식으로 받는다

DB의 암호화된 pw와 prompt로 넘겨받은 pw가 같은지 확인한다.

<?php
    $conn = mysqli_connect('localhost', 'root', 'mysql', 'logindb');
    $idx = $_GET['idx'];
    $sql= "SELECT * FROM q_board where idx='$idx'";
    $res = mysqli_fetch_array(mysqli_query($conn, $sql));

    $pw = $_GET['pw'];
    $hash = md5($pw);

    if($res['pw'] == $hash) {
        echo "<script>alert('게시글을 수정합니다.');</script>";
    } else if ($res['pw']!=$hash) {
        echo "<script>alert('비밀번호가 틀렸습니다.');";
        echo "window.location.href=\"q_check.php?idx=$idx\"</script>";
    } else {
        echo "<script>alert('게시글 수정 권한이 없습니다');";
        echo "window.location.href=\"q_check.php?idx=$idx\"</script>";
    }
?>

 

사용자 확인이 되면 문의글 수정 페이지를 볼 수 있다

글 수정이 완료되면 form 태그를 통해 q_modify_ok.php로 이동한다

 

** q_modify.php (더보기 클릭)

더보기
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
</head>
<body>
<?php
    $conn = mysqli_connect('localhost', 'root', 'mysql', 'logindb');
    $idx = $_GET['idx'];
    $sql= "SELECT * FROM q_board where idx='$idx'";
    $res = mysqli_fetch_array(mysqli_query($conn, $sql));

    $pw = $_GET['pw'];
    $hash = md5($pw);

    if($res['pw'] == $hash) {
        echo "<script>alert('게시글을 수정합니다.');</script>";
    } else if ($res['pw']!=$hash) {
        echo "<script>alert('비밀번호가 틀렸습니다.');";
        echo "window.location.href=\"q_check.php?idx=$idx\"</script>";
    } else {
        echo "<script>alert('게시글 수정 권한이 없습니다');";
        echo "window.location.href=\"q_check.php?idx=$idx\"</script>";
    }
?>
<form method="post" action="q_modify_ok.php" enctype="multipart/form-data" autocomplete="off">
        <table align=center width=auto border=0 cellpadding=2>
            <tr>
                <td>
                    <p><b>Write</b></p>
                </td>
            </tr>
            <tr>
                <td>
                    <table class="table2">
                        <tr>
                            <td>이름</td>
                            <td ><input type="text"name="name" cols=20 size=15 value="<?=$res['name']?>" required></td>
                        </tr>
                        <tr>
                            <td>제목</td>
                            <td><input type="text" name="title" cols=25 size=40 value="<?=$res['title']?>" required></td>
                        </tr>
                        <tr>
                            <td>내용</td>
                            <td><textarea name="content" cols=40 rows=15 required><?=$res['content']?></textarea></td>
                        </tr>
                        <tr>
                            <td>연락처(E-MAil)</td>
                            <td ><input type="text" name="email" cols=25 size=40 value="<?=$res['email']?>"required></td>
                        </tr>
                        <tr>
                            <td>비밀번호</td>
                            <td ><input type="password" name="pass" cols=25 size=15 autocomplete="new-password" required></td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
        <div>
            <input type="hidden" name="idx" value="<?=$idx?>">
            <button class="read_btn1" type="submit">작성</button>&nbsp;&nbsp;
        </div>
    </form>
    </body>
</html>

 

 

Step 2. q_modify_ok.php에서 게시글 수정을 처리한다

 

** q_modify_ok.php (더보기 클릭)

더보기
<?php
    $connect = mysqli_connect('localhost', 'root', 'mysql', 'logindb');

    $idx = $_POST['idx'];
    $title = $_POST['title'];
    $content = $_POST['content'];
    $name = $_POST['name'];
    $email = $_POST['email'];
    $pass = $_POST['pass'];
    $hash = md5($pass);

    $query = "update q_board set title='$title', content='$content', name = '$name', pw='$hash', email='$email', udate=now() where idx='$idx'";
    $result = $connect->query($query);
    
    if ($result) {
    ?>
        <script>
            alert("수정되었습니다.");
            location.replace("qna.php?idx=<?=$idx?>");
        </script>
    <?php } else {
        echo "다시 시도해주세요.";
    }
?>

 


▷ 문의 글 삭제 처리 페이지(q_delete.php)

 

Step 1. 사용자와 비밀번호를 확인하고 처리한다

 

** q_delete.php (더보기 클릭)

더보기
<?php
    session_start();
    $conn = mysqli_connect('localhost', 'root', 'mysql', 'logindb');
    $idx = $_GET['idx'];
    $sql= "SELECT * FROM q_board where idx='$idx'";
    $res = mysqli_fetch_array(mysqli_query($conn, $sql));

    $pw = $_GET['pw'];
    $hash = md5($pw);

    $sql_check = "SELECT * FROM q_board WHERE idx=$idx";
    $res_check = mysqli_fetch_array(mysqli_query($conn, $sql_check));

    if($_SESSION['username']=='admin') {
        echo "<script>alert('관리자 권한으로 삭제합니다!');</script>";
    } else if ($res_check['pw']==$hash){
        echo "<script>alert('게시글이 삭제되었습니다.');</script>";
    } else if ($res_check['pw']!=$hash) {
        echo "<script>alert('비밀번호가 틀렸습니다.');";
        echo "window.location.href=\"qna.php\"</script>";
        exit;
    }

    $sql = "DELETE FROM q_board WHERE idx=$idx;";
    $res = mysqli_query($conn, $sql);
    echo "<script>window.location.replace('qna.php');</script>";
?>

 


※ 문의게시판 비밀번호 구현

 

** 기능 구현 (더보기 클릭)

더보기

문의 게시글 클릭

 

▶ 관리자 계정

비밀번호 입력하고 조회

 

▶ 일반 사용자

 이메일, 비밀번호 입력하고 조회

조회 과정만 다르고 수정, 삭제 부분은 관리자와 일반 사용자의 UI가 똑같다


비밀번호가 확인되면 게시글 열람

 

게시글 수정 시 비밀번호 입력

 

게시글 수정페이지(q_modify.php)


게시글 삭제 시 비밀번호 확인

 

▶ 관리자가 게시글 삭제

 

일반 사용자가 게시글 삭제

 

게시글들이 잘 삭제되었다

댓글