카테고리 없음

모의 해킹 2주차 공부 이야기

h/bhacker 2024. 10. 28. 22:25

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 연결 


만들기는 했지만 내맘대로 해서 이렇게 만드는 것이 만나 라는 생각이 든다..