Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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 29 30
Archives
Today
Total
관리 메뉴

쟝이의 세상

<추가자료>시큐어 코딩이 적용되지 않은 회원가입 페이지 Ubuntu (Apache, PHP, MySQL) 본문

자료

<추가자료>시큐어 코딩이 적용되지 않은 회원가입 페이지 Ubuntu (Apache, PHP, MySQL)

zyangee 2024. 9. 5. 19:39

APM 설치

apache 설치 및 활성화

sudo apt install apache2

sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl status apache2

start : 해당 서비스 시작
enable : 부팅 시 자동으로 시작되도록 설정
status : 해당 서비스 상태 확인
 
 

php 설치 및 확인

sudo apt-get install php
/var/www/html/info.php
<?php
	phpinfo();
?>​

-> phpinfo() 를 사용하여 에이전트가 성공적으로 설치되었는지 확인합니다

 
 

mysql 설치 및 php-pdo-mysql 설치

sudo apt install mysql-server
sudo apt-get install php-pdo-mysql

 

PDO(PHP Data Objects) : PHP에서 데이터베이스와 상호작용할 때 사용하는 강력한 데이터베이스 추상화 레이어
 
<사용하는 이유 및 장점>

  • 다양한 데이터베이스 지원

PDO는 여러 종류의 데이터베이스 시스템(MySQL, PostgreSQL, SQLite, MSSQL 등)을 지원한다.
데이터베이스 종류에 관계없이 동일한 API를 사용하므로, 데이터베이스를 변경할 때 코드의 변경이 최소화된다.

  • 준비된 쿼리 및 바인딩

PDO는 준비된 쿼리(prepared statements)와 바인딩을 지원한다.
이는 SQL Injection 공격을 방지하는데 도움이 된다.
사용자 입력을 쿼리에 직접 삽입하는 대신, 변수에 대한 바인딩을 통해 안전하게 쿼리를 실행할 수 있다.

$sql = "SELECT * FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':email', $email);
$stmt->execute();
  • 예외 처리

PDO는 예외(Exception) 기반의 오류 처리를 지원한다.
PDO::ATTR_ERRMODE 속성을 PDO::ERRMODE_EXCEPTION으로 설정하면, 데이터베이스 작업 중 오류가 발생했을 때 예외를 던져서 오류를 쉽게 잡아낼 수 있다.

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
  • 유연한 데이터 페칭

PDO는 데이터 페칭 방식에 대해 다양한 옵션을 제공한다.
예를 들어, 결과를 연관 배열(associative array), 인덱스 배열(numeric array) 또는 객체로 가져올 수 있다.

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    // 연관 배열로 데이터 가져오기
}

 
 
 

DB 생성

create database board;
use board;

create user 'boarduser1'@'localhost' identified by 'Boarduser1!';
grant all privileges on board.* to 'boarduser1'@'localhost';
flush privileges;

create table users
	(userid char(10) not null,
	username nvarchar(50) not null,
	password nvarchar(255) not null,
	primary key(userid));

create table posts
	(postid int auto_increment not null primary key,
	title nvarchar(100) null,
	content longtext null,
	createdDate datetime null,
	userid char(10) null,
	foreign key(userid) references users(userid));
데이터베이스 : board 
사용자 : boarduser1 @ localhost
비밀번호 : Boarduser1!
** 생성한 사용자에게 board 데이터베이스의 모든 테이블에 권한 부여
users 테이블과 posts 테이블 생성

-> 생성한 칼럼들 확인
 
 

데이터베이스 연결하는 PHP

(dbconn.php)
-> 데이터베이스와 PHP를 연결하는 코드 작성

 

<주의할 점>

mysql과 php를 연결하는 방식에는 두 가지 방식이 있다.

첫번째는 PDO를 활용한 방식이고, 두번째는 mysqli 방식이다.

** 여기서 연결을 할 때 한 가지 방식만을 사용해야 하고, 만약 PDO방식과 mysqli 방식을 동시에 사용할 경우 오류가 발생한다.

1) PDO 방식 사용

 $pdo = new PDO("mysql:host={$serverName};dbname={$dbName};", $user, $password);

 

2) mysqli방식 사용

$connect = mysqli_connect($serverName, $user, $password, $dbname);

 

--- 데이터 연결 PHP 작성

<?php
        if(session_status() == PHP_SESSION_NONE) {
                session_start();
        }

        $current_file = basename($_SERVER['PHP_SELF']);

        if(($current_file != 'login.php' && $current_file != 'register.php') && !isset($_SESSION['userid'])){
                echo "<script>alert('로그인이 필요합니다');</script>";

                echo "<script>location.href='login.php';</script>";
                exit;
        }
?>

<?php
        $serverName = "localhost";
        $database = "board";

        $uid = "boarduser1";
        $pwd = "Boarduser1!";

        $table = "posts";

        try{
                $conn = new PDO("mysql:host=$serverName;dbname=$database", $uid, $pwd);

                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
                die("Error connecting to mysql");
        }
?>

 
 
 

회원가입 PHP

(register.php)
-> ID, 이름, 비밀번호 입력하여 회원가입을 누르면 DB에 저장되도록 코드를 작성

<?php
        include 'dbconn.php'; //데이터베이스 연결 설정 파일 포함

        //회원가입 처리
        if($_SERVER["REQUEST_METHOD"] == "POST") {
                $userid = $_POST['userid']; //사용자 ID 입력값
                $username = $_POST['username']; //사용자 이름 입력값
                $password = $_POST['password']; //비밀번호 입력값 (평문으로 저장)

                try {
                        //SQL 쿼리: 사용자 정보를 데이터베이스에 삽입
                        //(파라미터 바인딩 없이 직접 쿼리 문자열에 포함)
                        $sql = "INSERT INTO users(userid, username, password) VALUES('$userid', '$username', '$password')";

                        //쿼리 실행
                        $conn->exec($sql);

                        echo "회원가입이 완료되었습니다."; //성공 메시지 출력
                        header('Location: login.php');
                } catch (PDOException $e) {
                        //쿼리 실행 실패 시 오류 메시지 출력
                        die("회원가입 중 오류가 발생했습니다: ".$e->getMessage());
                }
        }
?>

<!--회원가입 폼-->
<form method="POST">
        사용자 ID: <input type="text" name="userid" maxlength="10" required><br>
        사용자 이름: <input type="text" name="username" required><br>
        비밀번호: <input type="password" name="password" required><br>
        <input type="submit" value="회원가입">
</form>

사용자가 입력한 값들을 DB에 INSERT 구문을 통해 저장
 

<실행 화면>
데이터 값 입력 후 회원가입 버튼 클릭을 하면 입력한 값이 데이터베이스에 INSERT 된다.

입력한 값이 데이터베이스에 정상적으로 INSERT 된 것을 확인할 수 있다.