2024. 5. 12. 17:20ㆍ정보보안 및 해킹/Normaltic's 취업반 과제
앞서 모든 게시글의 구조를 뜯어고쳤다.. 이전 모습은 전혀 없으니 참고
우선 테스트 게시글을 등록
테스트 게시글을 잘 받아오는 것을 볼 수 있다.
수정하기 탭을 클릭
하나도 빠짐 없이 변경해보고
일단 변경된 타이틀로 잘 나오는 것을 확인
내용과 사진도 변경 확인 완료
사진은 제가 다니는 액션스쿨 로고를..
index.php
서두에 적어놓은것과 같이 게시판의 구조를 완전히 뜯어 고쳤다.
그래서, 고친 부분은 이 부분이다.
index.php 위에 get_category_list.php를 덮는 형식으로 했었다.
그러니까 종이 두 장을 겹쳐놓는데 index.php에서 출력된 화면이 아래에 깔리고 그 위에 get_category_list.php에서 출력된 화면이 그 위에 깔린다.
그렇게 두개를 겹쳐 놓았던 것을 분리하여 게시판으로써의 역할을 확실히 분담하였다.
[생략]
<?php
if (isset($_POST['getmusical'])) {
$category = 'Musical';
header("location:get_category_list.php?category=" . $category);
exit;
// get_lists_of_category('Musical');
}
if (isset($_POST['getplay'])) {
$category = 'Play';
header("location:get_category_list.php?category=" . $category);
exit;
// get_lists_of_category('Play');
}
if (isset($_POST['getconcert'])) {
$category = 'Concert';
header("location:get_category_list.php?category=" . $category);
exit;
// get_lists_of_category('Concert');
}
?>
[생략]
get_category_list.php
페이지가 독립적으로 분리되었다.
category를 GET방식으로 받아와서 해당 카테고리의 모든 게시글을 받아오게 되는데, title은 a 태그로 링크를 통해서 이동할 수 있도록 구성되어있고, 아래에는 작성자와 작성된 날짜가 기재되어 있다.
<?php
require_once ('connect_db.php');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="/css/style.css" />
<link rel="stylesheet" href="/css/font.css" />
<title>Rame's Category</title>
</head>
<body class="header">
<div class="info">
<?php
$category = $_GET['category'];
// echo 'In Musical Category';
$table_name = "category_table";
$watcheddate = 'watched_date';
// $sql_query = "SELECT * FROM $table_name WHERE `category` = '$category'";
$sql_query = "SELECT * FROM $table_name WHERE `category` = '$category' ORDER BY $watcheddate DESC";
$sql_res = mysqli_query(connect_db(), $sql_query);
if ($sql_res) {
// echo "QUERY ACTIVE <br>";
?>
<div class="category_scroll">
<?php
if (mysqli_num_rows($sql_res) > 0) {
for ($i = 0; $i < mysqli_num_rows($sql_res); $i++) {
$sql_row = mysqli_fetch_array($sql_res);
$url = "open_cotents.php";
$writer = urlencode($sql_row['writer']);
$writed_date = urlencode($sql_row['writed_date']);
$title = urlencode($sql_row['title']);
echo "<a href=$url?writer=" . $writer . "&writed_date=" . $writed_date . "&title=" . $title . ">";
echo "<strong>" . $sql_row['title'] . "</strong><br>";
echo "</a>";
echo $sql_row['writer'] . " " . $sql_row['writed_date'] . "<br>";
}
} else {
echo "게시물이 존재하지 않습니다.";
}
close_sql();
} else {
echo "QUERY FAILED <br>";
}
?>
</div>
</body>
</html>
open_contents.php
get_categor_list.php에서 a태그를 클릭하면 나오는 페이지.
title과 review, 리뷰를 작성할 때 올린 이미지 파일이 나오게 된다.
<?php
require_once('connect_db.php');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="/css/style.css" />
<link rel="stylesheet" href="/css/font.css" />
<title>Contents</title>
</head>
<body class="header">
<div class="info">
<form action="" method="POST">
<?php
$table_name = "category_table";
$writer = $_GET['writer'];
$writed_date = $_GET['writed_date'];
$title = $_GET['title'];
echo "<h1>Title : " . $title ."</h1><br>";
$sql_query = "SELECT * FROM $table_name WHERE `writer` = '$writer' and `writed_date` = '$writed_date' and `title` = '$title'";
// echo $sql_query . "<br>";
$sql_res = mysqli_query(connect_db(), $sql_query);
$sql_row = mysqli_fetch_array($sql_res);
echo "<h2> review : " . $sql_row['review'] . "</h2><br>";
if($sql_row['review_image'])
{
echo "<img src=". $sql_row['review_image'] ."><br>";
}
else
{
echo "No Image Files <br>";
}
close_sql();
?>
<button class="submit-button" name="edit" value="editreview">수정하기</button><br>
<button class="submit-button" name="delete" value="deletereview">삭제하기</button>
<?php
if(isset($_POST["edit"]))
{
// echo $sql_res;
header("location: edit_contents.php?sql_query=" . $sql_query);
exit;
}
if(isset($_POST["delete"]))
{
}
?>
</form>
</div>
</body>
</html>
edit_contents.php
게시글에 들어가서 수정하기 버튼을 클릭했을 때 나오는 페이지.
title, watched date, category, name, review, review image가 변경이 가능하고, 작성자와 작성된 날짜는 변경이 불가능하다.
불가능한 두 개의 요소는 코드를 통해 자동으로 들어가게 될 예정
<?php
require_once ('connect_db.php');
require_once ('edit_contents_func.php');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="/css/style.css" />
<link rel="stylesheet" href="/css/font.css" />
<title>Edit Page</title>
</head>
<body class="header">
<div class="info">
<form action="" method="POST" enctype="multipart/form-data">
<?php
$sql_query = $_GET['sql_query'];
// $sql_row = mysqli_fetch_array($sql_res);
$sql_res = mysqli_query(connect_db(), $sql_query);
$sql_row = mysqli_fetch_array($sql_res);
?>
<label for="row_title"> Title : </label><br>
<input type="text" name="row_title"value="<?php echo htmlspecialchars($sql_row['title']); ?>"/><br>
<label for="row_watched_date"> Watched Date : </label><br>
<input type="date" name="row_watched_date"value="<?php echo htmlspecialchars($sql_row['watched_date']); ?>"/><br>
<label for="row_category"> Category : </label><br>
<select name="category">
<?php
$table_name = "category_table";
$categoryfield = 'Category';
$result = mysqli_query(connect_db(), 'SHOW COLUMNS FROM ' . $table_name . ' WHERE field="' . $categoryfield . '"');
while ($row = mysqli_fetch_row($result)) {
foreach (explode("','", substr($row[1], 6, -2)) as $option) {
print ("<option>$option</option>");
}
}
close_sql();
?>
</select><br>
<label for="row_name"> Name : </label><br>
<input type="text" name="row_name"value="<?php echo htmlspecialchars($sql_row['name']); ?>"/><br>
<label for="row_review"> Review : </label><br>
<input type="text" name="row_review"value="<?php echo htmlspecialchars($sql_row['review']); ?>"/><br>
<label for="row_review_image"> Review Image : </label><br>
<input type="file" name="row_review_image" value="<?php echo $sql_row['review_image']; ?>"/><br>
<button class="submit-button" name="complete" value="complete">완료</button>
<?php
if(isset($_POST['complete']))
{
// echo "here";
$t=time();
edit_complete($_POST['row_title'], date("Y-m-d",$t), $_POST['row_watched_date'], $_POST['category'], $_POST['row_name'], $_POST['row_review'], $_FILES['row_review_image'], $sql_row['title'], $sql_row['watched_date'], $sql_row['name'], $sql_row['review']);
}
?>
</form>
</div>
</body>
</html>
edit_contents_func.php
수정 페이지에서 완료 버튼을 클릭했을 때 불러지는 함수가 있음
이미지의 경로나 이미지 파일의 이름에 공백이 있을 때에 해당 파일을 올려도 제대로 화면에 출력되지 않는 경우가 있어서
$file_path = preg_replace('/\s/i', '%20', $filename);//space to %20 encode
이 코드를 넣어줬는데, 아무래도 무언가 잘못되어있는 모양이다. 제대로 작동을 하다가 하지 않다가 조금 왔다갔다 해서 수정을 할 예정
<?php
require_once ('connect_db.php');
function edit_complete($title, $writed_date, $watched_date, $category, $name, $review, $review_image, $old_title, $old_watched_date, $old_name, $old_review)
{
$table_name = "category_table";
$filename = $review_image["name"];
$tempname = $review_image["tmp_name"];
$file_path = preg_replace('/\s/i', '%20', $filename);//space to %20 encode
$folder = './image/' . basename($file_path);
if($filename)
{
$folder = './image/' . basename($filename);
$sql_query = "UPDATE $table_name SET `title`='$title',`writed_date`='$writed_date', `watched_date`='$watched_date', `category`='$category', `name`='$name', `review`='$review', `review_image`='$folder' WHERE `title`='$old_title' and `watched_date`='$old_watched_date' and `name`='$old_name' and `review`='$old_review'";
}
else
{
$sql_query = "UPDATE $table_name SET `title`='$title',`writed_date`='$writed_date', `watched_date`='$watched_date', `category`='$category', `name`='$name', `review`='$review' WHERE `title`='$old_title' and `watched_date`='$old_watched_date' and `name`='$old_name' and `review`='$old_review'";
}
$sql_res = mysqli_query(connect_db(), $sql_query);
if($filename)
{
if (move_uploaded_file($tempname, $folder)) {
echo "<h3> Image uploaded successfully!</h3>";
} else {
// error_reporting(E_ALL);
// error_reporting(0);
echo "<h3> Failed to upload image!</h3>";
}
}
if ($sql_res) {
echo "등록 완료";
close_sql();
refresh_auto_indrement_num();
}
}
?>
write_board_func.php
게시글 등록에도 해당 인코딩 코드 추가 완료. 일단 되는 경우도 있으니 추가는 해두었지만.. 살짝 불안하긴 하다.
[생략]
$file_path = preg_replace('/\s/i', '%20', $filename);//space to %20 encode
[생략]
파일 수정하는건 아직 다소 미흡합니다 수정을 거쳐나갈 예정
미흡한 점
경로 혹은 파일 이름에 공백이 포함되어 있을 시 이미지가 띄워지지 않을 때가 있음
이미 이미지 파일이 있는 경우에 이미지 파일이 있는지 여부를 알려주지 않음
이미지인지 아닌지 판단하는 부분이 없어서 모든 파일을 다 받음
'정보보안 및 해킹 > Normaltic's 취업반 과제' 카테고리의 다른 글
[Normaltic's 취업반 과제] js Keylogger (0) | 2024.05.14 |
---|---|
[Normaltic's 취업반 과제] js Cookie Hijacking (0) | 2024.05.14 |
[Normaltic's 취업반 과제] jwt 로그인 유지 (0) | 2024.05.08 |
[Normaltic's 취업반 과제] 게시판에 이미지 / 파일 등록하기 (0) | 2024.05.07 |
[Normaltic's 취업반 과제] 게시판에 글 등록하기 (2) | 2024.05.05 |