일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- CTF
- union sql injection
- Error based sql injection
- file upload
- JS
- csrf
- 웹개발
- XSS
- Reflected Xss
- sql injection
- 과제
- MySQL
- 로그인페이지
- Los
- 게시판 만들기
- cors
- css
- php
- sql injection point
- 쿠키
- Cross Site Request Forgery
- 세션
- 모의해킹
- lord of sql injection
- Python
- JWT
- lord of sqli
- cookie 탈취
- 로그인
- blind sql injection
- Today
- Total
Almon Dev
모의해킹 공부 정리 9일차(미니 미션) 본문
미니 미션
학생 이름과 점수가 들어가는 db를 만들고 get방식으로 학생의 이름을 넣으면 점수가 출력되는 페이지 만들기
DB 만들기
create database school;
use school;
create table grades (
name varchar(10) primary key,
score int not null
);
create database school;
school이라는 데이터베이스를 생성합니다.
use school;
school 데이터 베이스를 선택합니다.
select database();
를 이용하면 현재 선택된 데이터베이스를 확인할 수 있습니다.
create table grades (
name varchar(10) primary key,
score int not null
);
grades라는 테이블을 생성합니다.
name : 최대 글자수가 10글자인 문자열, primary key(기본키)
score : 숫자(int), null이 불가능
DB에 값 추가하기
grades_admin.php
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>성적 추가</title>
</head>
<body>
<container class="grade-container">
<form action="" class="grade-form" method="post">
<input type="text" name="name" class="input name-input" required>
<input type="number" name="score" class="input score-input" required min="0" max="100">
<input type="submit" value="추가하기" class="submit-btn">
</form>
</container>
<?php
if (isset($_POST["name"]) && isset($_POST["score"])) {
$name = trim($_POST["name"]);
$score = $_POST["score"];
$host = "localhost";
$id = "root";
$pass = "admin1234";
$dbname = "school";
$sql = "insert into grades values ('$name', $score);";
// echo "$sql";
$conn = mysqli_connect($host, $id, $pass, $dbname);
// var_dump($conn);
// echo "mysqli host info : " . mysqli_get_host_info($conn) . "<br>";
// echo "mysqli client info : " . mysqli_get_client_info() . "<br>";
// echo "mysqli server info : " . mysqli_get_server_info($conn) . "<br>";
mysqli_query($conn,"$sql");
}
?>
</body>
</html>
<form action="" class="grade-form" method="post">
<input type="text" name="name" class="input name-input" required>
<input type="number" name="score" class="input score-input" required min="0" max="100">
<input type="submit" value="추가하기" class="submit-btn">
</form>
db에 추가하기 위해서 name과 score를 입력받습니다.
추가하기 버튼을 누르면 자기 자신에게 post로 데이터를 전송합니다.
form태그에 action=""을 비워두면 자기 자신에게 데이터를 전송합니다.
if (isset($_POST["name"]) && isset($_POST["score"])) {
$name = trim($_POST["name"]);
$score = $_POST["score"];
name과 score가 post로 전송됐을 때 $name과 $score 변수에 각각 값을 대입합니다.
$host = "localhost";
$id = "root";
$pass = "admin1234";
$dbname = "school";
$sql = "insert into grades values ('$name', $score);";
db의 접속에 필요한 변수를 설정하고, $sql에 데이터 삽입 sql문을 작성합니다.
$conn = mysqli_connect($host, $id, $pass, $dbname);
var_dump($conn);
$conn에 mysql접속에 대한 커넥션 객체를 대입합니다.
var_dump($conn);으로 $conn의 값을 살펴보면
이런 식의 mysqli객체가 들어있는 것을 볼 수 있습니다.
mysqli_query($conn,"$sql");
mysqli_query 함수는 $conn을 이용해 mysql 서버에 접속해서 $sql에 담긴 sql문을 실행합니다.
값 조회하기
grades.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="grades.css">
</head>
<body>
<?php
$score_txt = "";
if(isset($_GET['name'])) {
$name = trim($_GET['name']);
$host = 'localhost';
$id = 'root';
$password = 'admin1234';
$dbname = 'school';
$conn = mysqli_connect($host, $id, $password, $dbname);
$sql = "select score from grades where name='$name';";
// echo "$sql";
$sql_result = mysqli_query( $conn, $sql);
// var_dump($sql_result);
if(mysqli_num_rows($sql_result) > 0) {
$score = $sql_result->fetch_array()['score'];
$score_txt = "$name 님의 점수는 <strong>$score</strong>점 입니다.";
}else {
$score_txt = $name."은 등록되지 않는 이름입니다.";
}
}
?>
<container class="grades-container">
<form action="" method="get" class="grades-form">
<input type="text" name="name" class="input name-input" required>
<input type="submit" value="성적 조회" class="submit-btn">
</form>
<p class='score'><?php echo "$score_txt" ?></p>
</container>
</body>
</html>
HTML 코드 설명
<form action="" method="get" class="grades-form">
<input type="text" name="name" class="input name-input" required>
<input type="submit" value="성적 조회" class="submit-btn">
</form>
자기 자신에게 get메서드로 데이터를 전송하는 form태그입니다.
<input type="text" name="name" class="input name-input" required>
조회를 위한 이름을 입력하는 input태그입니다. name의 값이 name이므로
url에는 http://ip:port/path?name=입력값으로 전송됩니다.
<p class='score'><?php echo "$score_txt" ?></p>
$score_txt 변수에 담긴 문자열을 p태그에 담아 출력합니다.
이곳에서 점수를 출력할 생각입니다.
PHP 코드 설명
<?php
$score_txt = "";
if(isset($_GET['name'])) {
$name = $_GET['name'];
$host = 'localhost';
$id = 'root';
$password = 'admin1234';
$dbname = 'school';
$conn = mysqli_connect($host, $id, $password, $dbname);
$sql = "select score from grades where name='$name';";
// echo "$sql";
$sql_result = mysqli_query( $conn, $sql);
// var_dump($sql_result);
if(mysqli_num_rows($sql_result) > 0) {
$score = $sql_result->fetch_array()['score'];
$score_txt = "$name 님의 점수는 <strong>$score</strong>점 입니다.";
}else {
$score_txt = $name."은 등록되지 않는 이름입니다.";
}
}
?>
if(isset($_GET['name'])) {
name의 값이 있는 get 메서드가 요청되면 if문이 실행됩니다.
$name = trim($_GET['name']);
$name에 url로 요청된 name의 값을 대입합니다. trim은 공백을 제거하는 함수입니다.
$host = 'localhost';
$id = 'root';
$password = 'admin1234';
$dbname = 'school';
mysql 접속에 필요한 정보들을 각각의 변수에 저장합니다.
$conn = mysqli_connect($host, $id, $password, $dbname);
$conn 변수에 mysqli_connect를 이용해 mysql서버에 접속한 뒤 반환받은 mysqli객체를 저장합니다.
$sql = "select score from grades where name='$name';";
// echo "$sql";
$sql_result = mysqli_query( $conn, $sql);
$sql에 sql문을 생성합니다.
mysqli_query를 이용해서 $conn으로 $sql에 담긴 sql문을 실행합니다.
$sql_result = mysqli_query( $conn, $sql); 말고도
$sql_result = $conn->query($sql); 도 가능합니다.
$conn에 담긴 mysqli 객체 역시 query라는 메서드를 가지고 있기 때문입니다.
if(mysqli_num_rows($sql_result) > 0) {
mysqli_num_rows($sql_result)는 $sql_result에 담긴 row의 개수를 출력합니다.
즉 1개 이상의 행이 들어있을 경우 if문을 실행하는 것입니다.
$score = $sql_result->fetch_array()['score'];
$score에 가져온 데이터의 점수를 대입합니다. (이름은 중복되지 않으므로 1개의 값만 존재합니다.)
$score_txt = "$name 님의 점수는 <strong>$score</strong>점 입니다.";
$score_txt에 점수를 출력하는 문자열을 대입합니다.
}else {
$score_txt = $name."은 등록되지 않는 이름입니다.";
}
else {}의 경우 select문을 통해 가져온 데이터의 행이 0개인 경우(데이터가 없는 경우)
$score_txt에 이름을 찾지 못했다는 문자열을 대입합니다.
css도 나중에 추가해 볼 예정입니다.
'모의해킹 > 모의해킹' 카테고리의 다른 글
모의해킹 공부 (4주차 강의 정리) (2) | 2024.11.07 |
---|---|
JWT(JSON Web Token)에 대한 공부 (1) | 2024.11.02 |
모의해킹 공부 (3주차 강의 정리) (0) | 2024.10.31 |
모의해킹 공부 정리 13일차 (쿠키와 세션) (0) | 2024.10.29 |
모의해킹 공부 정리 8일차 (강의 정리) (0) | 2024.10.24 |