모의 해킹 2주차 공부 이야기
2주차 2강
DataBase
Database 역할 = 데이터를 저장한다!
Database는 데이터를 관리하는 엑셀프로그램과 똑같다
Database의 Database는 엑셀로 하면 엑셀파일이다.
데이터를 보관하는 큰 단위를 Database라고 한다.
이 Database안에는 여러 가지 데이터를 저장할 수 있는 테이블이 존재한다.
엑셀시트를 켜면 엑셀 파일에 여러 가지 시트를 열 수 있을 것인데 그 하나 하나 시트에 데이터를 저장하고 비슷한 데이터들 끼리 하나하나 시트를 구분해서 저장및관리한다.
그것이 바로 테이블이다. 즉 엑셀의 시트와 같음. 그래서 로그인 회원정보 테이블을 따로 만들고, 게시판에 들어가는 테일블을 게시판 형 테이블을 따로 만는 것임.
이 각각의 회원 정보, 게시판 등의 의 테이터베이스가 하나의 Database로 되는 것임
________________________________
| 순번 | 이름 | 점수 |
________________________________
| 1 | 김한수 | 100 |
________________________________
| 2 | 류돌돌 | 90 |
________________________________
| 3 | 김당돌 | 80 |
________________________________
| 4 | 류난난 | 70 |
_______________________________
Column : 열, (세로데이터)데이터 종류, 카테고리(순번, 이름, 점수)
Row : 행, 가로테이터(1 김한수 100 ←이것하나가 하나의 행이다. / 2 류돌돌 90 / 3 김당돌 80) 데이터
DB만들어보기(실습)
강의에서 제공된 도커로 들어가려면
192.168.50.177:1018/phpMyAdmin 엔터 누르면 phpMyAdmin페이지가 나오는데 강의에서 구성해준 구조는 Apache PhP MySQL 구조를 가지고 있음
MySQL이라는 DB를 웹페이지에서 관리할 수 있게 해주는 시스템이 phpmyadmin이다.
계정은
admin student1234임
new(새로운) 클릭 → DB생성됨 → 데이터베이스 명 :: test / utf8_general_ci → 만들기 클릭
(데이터베이스 생성됨) → 새 테이블 만들기 → test_table 칼럼수 : 4 → 실행 클릭 → (칼럼)
이름 종류 길이/값 기본값 데이터 정렬방식 보기 Null 인덱스 A I 설명
idx INT 10 없음 PRIMARY 체크
( ↓가변적인 문자) 없음
name varchar 20 없음
score varchar 20 없음
pass varchar 20 없음
→ 저장 클릭 → 삽입클릭 (데이터를 넣을 것임)
칼럼명 | 종류 | 함수 | Null | 값 |
idx | int(10) |
name | varchar(20) | | | normatic |
score | varchar(20) | | | 100 |
pass | varchar(20) | | | 1234 |
→ 실행
※ 이제 가장 중요한 SQL 임 ※
SQL
select : 데이터를 가져온다.
select [컬럼 이름] from [테이블 이름]
ex) select name from test_table
select name, pass from test_table
만약 모든 컬럼을 다 출력한다면
select * from test_table
insert : (데이터를 넣는 명령어)
insert into [테이블 이름] (컬럼이름) value (값)
ex)
insert into test_table (name, score, pass) value ('doldol', '80', '2222')
만약 +를 쓴다면
insert into test_table value (NULL, 'dangdol'. '70', '3333')
# 정교한 select : 내가 원하는 데이터를 가져오는 where
select에서 where는 정교하게 조건을 준다.
where 구문.
select ~~~~ from [테이블] where [조건]
ex)
name='normaltic'인 데이터를 가져오고 싶다면
select ~~~~ from [테이블] where name='normaltic'
위 테이블에서 이름과 패스워드만 가져오는데 근데 이름이 normaltic인 데이터만 가져오고 싶다면
select name,pass from test_table where name='normaltic' → 실행
위 처럼 하는데 이름이 normaltic과 pass가 1234인 데이터만 가져오고 싵다면
select name,pass from test_table where name='normaltic' and pass='1234'
WAS-DB연결
php와 DB연결하기
WAS가 DB에게 이야기를 하기 위해서는 티켓이 있어야 하는데 이 티켓이 id와 비밀번호라고 강의에서 함 id와 비밀번호를 알고 있어야 한다.
define을 사용하여 선언을 함
$부터가 로그인을 하는 함수임
db_conn은 강의에서 한 것임 이것은 내망대로 해도 됨
was에는 db의 id와 비밀번호가 있어야 함
vi db_test.php
$db_conn = mysqli_connnect('localhost'. 'admin', 'student1234', 'test');
if($db_conn) {
echo "DB Connect OK";
}else{
echo "DB Connect Fail";
}
// select ($sql은 강의에서 맘음대로 지은 것임 내가 다른 이름으로 지어도 됨)
(↓sql을 선언함) → sql을 티켓으로 실행하기
mtsqli_query는 정해진 함수여서 이름을 바꿀수 없음.
php variable(php 변수)는 $(달라) 뒤에 뭐라고 쓰든 변수가 된
` ex) $wejifewj
sql문을 실행하면 실습한대로 3개행이 나오는데 이 덩어리에서 내가 원하는 데이터를
뽑아낼 것이다. 3개의 데이터 중 1개의 row만 뽑아오는 방법이 패치 라는 것이 있다
mysqli_fetch_array(); 이 함수를 사용하면 된다 . 여기에 ()안에 result를 넣으면 된다.
mysqli_fetch_array(result);
이제 하고 싶은 것은 이름만 가져오게 하는 것을 할 것인데 echo "Name : " . $row['name'] (열이름)
php에서 .(점)은 두 문자를 합치는 역할임
$aql = "select * from test_table";
$result = mysqli_query(db_conn, $sql);
$row = mysqli_fetch_array(result); (하나만 작성하면 맨위에 있는 것만 가져옴)
var_dump($row);
echo "Name : " . $row['name'];
*/
var_dump($result); (출력)
$row = mysqli_fetch_array(result); (두개 작성하면 2번째 행만 가져옴)
var_dump($row);
$row = mysqli_fetch_array(result); (세 개 작성하면 3번째 행만 가져옴)
var_dump($row);
*/
/*
<?php
define('DB_SERVER', 'localhost);
define('DB_USERNAMEM','admin');
define("DB_PASSWORD", "student1234');
define("DB_NAME", "test");
$db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
*/
?>
실습
돌돌의 비빌번호를 화면에 출력해라
<?php
$db_conn = mysqli_connect('localhost', 'admin', 'student1234', 'test'); (돌돌의 결과만 나옴)
// select
$sql = "select * from test_table where "name='doldol''
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_qrray($result);
echo "Pass : " . $row['pass']; (비밀번호만 출력하기)
?>
<?php
$db_conn = mysqli_connect('localhost', 'admin', 'student1234', 'test'); (돌돌의 결과만 나옴)
// select
$sql = "select * from test_table where "name='doldol''
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_qrray($result);
echo "Pass : " . $row['pass']; (비밀번호만 출력하기)
ㅑㄹ($_POST['userpass') == $db_pass) { (db에 있는 비번을 가지고 오는 것)
// login OK
}
?>
2주차 3강
DB에게 이야기. SQL
나는 인증된 사람.
그러니까 대답해!
(아이디, 비밀번호)
fetch는 1개라도 무조건 해야함
2주차 과제
[1] 복습
[2] Minu Mission
-GET방식으로 그 학생의 이름을 넣으면 그 학생의 점수가 출력되는 페이지를 만들기
-doldol 학생의 점수는 80입니다." 를 출력하기
주소 : http://localhost/student_score.php?name=doldol
결과

[3[ 회원 가입 페이지 만들기(기능 구현)
signup.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원 가입</title>
<style>
/* 기본 스타일 */
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f9f9f9;
}
.signup-form {
width: 350px;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.signup-form h2 {
text-align: center;
color: #333;
}
.signup-form label {
display: block;
margin: 15px 0 5px;
}
.signup-form input[type="text"],
.signup-form input[type="email"],
.signup-form input[type="password"],
.signup-form input[type="button"] {
width: 100%;
padding: 8px;
border-radius: 5px;
border: 1px solid #ccc;
margin-bottom: 10px;
}
.signup-form button {
width: 100%;
padding: 10px;
border: none;
border-radius: 5px;
background-color: #28a745;
color: white;
font-size: 16px;
}
.signup-form button:hover {
background-color: #218838;
}
</style>
</head>
<body>
<form class="signup-form" id="signupForm" action="signup.php" method="POST">
<h2>회원 가입</h2>
<label for="userId">아이디</label>
<input type="text" id="userId" name="userId" required>
<input type="button" value="아이디 중복 확인" onclick="checkId()">
<label for="password">비밀번호</label>
<input type="password" id="password" name="password" required>
<label for="confirmPassword">비밀번호 확인</label>
<input type="password" id="confirmPassword" name="confirmPassword" required>
<label for="name">이름</label>
<input type="text" id="name" name="name" required>
<label for="nickname">닉네임</label>
<input type="text" id="nickname" name="nickname" required>
<label for="phone">전화번호</label>
<input type="text" id="phone" name="phone" required>
<input type="button" value="인증번호 받기" onclick="sendPhoneCode()">
<label for="email">이메일</label>
<input type="email" id="email" name="email" required>
<button type="submit">가입하기</button>
</form>
<script>
// JavaScript 함수 정의
function checkId() {
const userId = document.getElementById('userId').value;
fetch(`check_id.php?userId=${userId}`)
.then(response => response.text())
.then(data => alert(data))
.catch(error => alert('중복 확인 오류: ' + error));
}
function sendPhoneCode() {
const phone = document.getElementById('phone').value;
if (phone.trim() === '') {
alert('전화번호를 입력하세요.');
return;
}
alert('인증번호가 발송되었습니다.');
}
</script>
</body>
</html>
<?php
include 'db_connect.php'; // 데이터베이스 연결 파일 포함
// POST 요청이 들어온 경우
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username']; // 입력된 아이디
$password = $_POST['password']; // 입력된 비밀번호
$confirm_password = $_POST['confirm_password']; // 확인 비밀번호
// 비밀번호 확인
if ($password !== $confirm_password) {
die("비밀번호가 일치하지 않습니다."); // 비밀번호가 일치하지 않을 경우 오류 메시지
}
// 아이디 중복 체크
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?"); // 아이디 조회 쿼리
$stmt->bind_param("s", $username); // 쿼리의 ? 부분에 아이디 값 바인딩
$stmt->execute(); // 쿼리 실행
$stmt->store_result(); // 결과 저장
if ($stmt->num_rows > 0) { // 아이디가 이미 존재하는 경우
die("이미 사용 중인 아이디입니다."); // 오류 메시지
} else {
// 비밀번호 해시
$hashed_password = password_hash($password, PASSWORD_DEFAULT); // 비밀번호 해시 생성
// 사용자 등록
$stmt = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)"); // 사용자 등록 쿼리
$stmt->bind_param("ss", $username, $hashed_password); // 쿼리의 ? 부분에 아이디와 해시된 비밀번호 바인딩
if ($stmt->execute()) { // 쿼리 실행
echo "회원가입이 완료되었습니다."; // 성공 메시지
} else {
echo "회원가입 실패: " . $conn->error; // 실패 메시지
}
}
// 연결 종료
$stmt->close(); // 쿼리문 종료
$conn->close(); // 데이터베이스 연결 종료
}
?>
회원가입 성공



[4] 로그인 페이지 만들기(DB연동하기)

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<title>로그인/회원가입 페이지</title>
<style>
body {
background-color: #f8f9fa; /* 페이지 배경색 설정 */
}
.container {
max-width: 400px; /* 최대 너비 설정 */
margin: 100px auto; /* 페이지 중앙에 위치 */
padding: 20px; /* 내부 여백 */
background: white; /* 배경색 흰색 */
border-radius: 10px; /* 모서리 둥글게 */
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); /* 그림자 효과 */
}
h2 {
margin-bottom: 20px; /* 제목 아래 여백 */
}
.btn-primary {
background-color: #28a745; /* 버튼 배경색 초록색 */
border-color: #28a745; /* 버튼 테두리 색상 설정 */
}
.form-container {
display: none; /* 초기에는 숨김 */
}
</style>
<script>
// 로그인 폼과 회원가입 폼을 전환하는 함수
function toggleForms() {
var loginForm = document.getElementById('login-form'); // 로그인 폼
var signupForm = document.getElementById('signup-form'); // 회원가입 폼
// 로그인 폼이 보이는지 확인
if (loginForm.style.display === "none") {
loginForm.style.display = "block"; // 로그인 폼 보이기
signupForm.style.display = "none"; // 회원가입 폼 숨기기
} else {
loginForm.style.display = "none"; // 로그인 폼 숨기기
signupForm.style.display = "block"; // 회원가입 폼 보이기
}
}
</script>
</head>
<body>
<div class="container">
<h2 class="text-center">로그인</h2>
<!-- 로그인 폼 시작 -->
<form id="login-form" action="login.php" method="POST">
<div class="form-group">
<label for="username">아이디</label>
<input type="text" class="form-control" id="username" name="username" required>
</div>
<div class="form-group">
<label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary btn-block">로그인</button>
<p class="text-center mt-2">아직 회원이 아니신가요? <a href="#" onclick="toggleForms()">회원가입하기</a></p>
</form>
<!-- 로그인 폼 끝 -->
<!-- 회원가입 폼 시작 -->
<form id="signup-form" class="form-container" action="signup.php" method="POST">
<h2 class="text-center">회원가입</h2>
<div class="form-group">
<label for="signup-username">아이디</label>
<input type="text" class="form-control" id="signup-username" name="username" required>
</div>
<div class="form-group">
<label for="signup-password">비밀번호</label>
<input type="password" class="form-control" id="signup-password" name="password" required>
</div>
<div class="form-group">
<label for="signup-confirm-password">비밀번호 확인</label>
<input type="password" class="form-control" id="signup-confirm-password" name="confirm_password" required>
</div>
<button type="submit" class="btn btn-primary btn-block">회원가입</button>
<p class="text-center mt-2">이미 회원이신가요? <a href="#" onclick="toggleForms()">로그인하기</a></p>
</form>
<!-- 회원가입 폼 끝 -->
</div>
</body>
</html>
↑ HTML 로그인 페이지
<?php
// 데이터베이스 연결 파일 포함
include 'db_connect.php';
// POST로 전달된 아이디와 비밀번호 가져오기
$username = $_POST['username'];
$password = $_POST['password'];
// 아이디로 사용자 정보 조회
$stmt = $conn->prepare("SELECT password FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->store_result();
// 아이디가 존재하는 경우
if ($stmt->num_rows > 0) {
// 비밀번호 확인
$stmt->bind_result($hashed_password);
$stmt->fetch();
if (password_verify($password, $hashed_password)) {
echo "<h3>로그인 성공! 환영합니다, {$username}님!</h3>";
} else {
echo "<h3>비밀번호가 올바르지 않습니다.</h3>";
}
} else {
echo "<h3>아이디가 존재하지 않습니다.</h3>";
}
// 연결 종료
$stmt->close();
$conn->close();
?>
↑ PHP 코드
<?php
// 데이터베이스 연결 설정
$servername = "localhost";
$username = "root"; // MySQL 사용자 이름
$password = ""; // MySQL 비밀번호
$dbname = "test"; // 데이터베이스 이름
// MySQL 연결 생성
$conn = new mysqli($servername, $username, $password, $dbname);
// 연결 확인
if ($conn->connect_error) {
die("데이터베이스 연결 실패: " . $conn->connect_error);
}
?>
-- 데이터베이스 생성 (존재하지 않으면 생성)
CREATE DATABASE IF NOT EXISTS test;
-- 데이터베이스 사용
USE test;
-- 사용자 정보를 저장할 테이블 생성
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL, -- 비밀번호는 해시 형태로 저장
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
↑ DB 연결
만들기는 했지만 내맘대로 해서 이렇게 만드는 것이 만나 라는 생각이 든다..