정보보안론 과목 실습 과제로 제작된 PHP 기반 웹 애플리케이션입니다. 회원 관리, 게시판, 댓글, 소원 게시판 등의 기능을 포함하며, 주요 보안 취약점에 대한 방어 기법을 적용하였습니다.
| 구분 | 내용 |
|---|---|
| 언어 | PHP |
| 데이터베이스 | MariaDB 10.4 |
| 서버 환경 | localhost (XAMPP / MAMP 등) |
20195229.sql 파일을 MariaDB에 임포트하여 데이터베이스를 초기화합니다.
mysql -u root -p mydatabase < 20195229.sql데이터베이스명은 mydatabase이며, dbconn.php에서 접속 정보를 변경할 수 있습니다.
학번 중복 방지를 위해 아래 제약 조건이 적용되어 있습니다.
ALTER TABLE users
ADD CONSTRAINT unique_student_id UNIQUE (student_id);| 테이블 | 설명 |
|---|---|
users |
회원 계정 및 학생 정보 |
students |
별도 학생 정보 테이블 (show_students 기능용) |
posts |
게시글 |
comments |
댓글 |
categories |
게시판 카테고리 (오늘의 한마디 / 정보 / 유머) |
wishes |
소원 목록 |
courses |
수강 과목 (현재 미사용) |
grades |
성적 (현재 미사용) |
- index.html: 메인 페이지. 로그인, 회원가입, 비회원 접속 버튼을 제공합니다.
| 파일 | 설명 |
|---|---|
| register.php | 회원가입 처리 (아이디 중복 확인, 비밀번호 해싱 후 저장) |
| student_info.php | 회원가입 후 학생 정보 입력 폼 |
| submit_student_info.php | 학생 정보 저장 처리 |
| edit_student_info.php | 학생 정보 수정 폼 |
| update_student_info.php | 학생 정보 수정 처리 |
| show_students.php | 등록된 학생 목록 조회 |
| login.php | 로그인 처리 (세션 생성) |
| logout.php | 로그아웃 (세션 파기) |
회원가입 시 입력 항목: 학번 (8자리 숫자), 생년월일 (YYYYMMDD 형식 8자리), 학과 (사범대학/철학과/연극영화과/물리학과 중 택1)
- guest.php: 로그인 없이 접속하는 경우 이동하는 페이지입니다. 게시글과 댓글을 열람할 수 있으나 작성 및 상호작용은 불가합니다.
| 파일 | 설명 |
|---|---|
| member.php | 회원 전용 메인 페이지. 카테고리별 최신 게시글 3개를 표시합니다. |
| post_form.php | 게시글 작성 폼 |
| post_submit.php | 게시글 저장 처리 |
| edit_post.php | 게시글 수정 폼 (작성자 본인만 접근 가능) |
| update_post.php | 게시글 수정 처리 |
| delete_post.php | 게시글 삭제 처리 (작성자 본인만 가능) |
게시글 수정 및 삭제 버튼은 작성자 본인으로 로그인한 경우에만 표시됩니다. 다른 사용자로 로그인한 상태에서는 수정/삭제 버튼이 노출되지 않으며, 이미 로그아웃한 뒤 재로그인하더라도 세션 기반으로 권한을 재확인합니다.
| 파일 | 설명 |
|---|---|
| add_comment.php | 댓글 작성 처리 |
| edit_comment.php | 댓글 수정 폼 (작성자 본인만 접근 가능) |
| update_comment.php | 댓글 수정 처리 |
| delete_comment.php | 댓글 삭제 처리 |
| 파일 | 설명 |
|---|---|
| wish_form.php | 소원 작성 폼 |
| submit_wish.php | 소원 저장 처리 |
| wishes.php | 모든 회원의 소원 목록 열람 |
모든 데이터베이스 쿼리는 Prepared Statements와 bind_param을 사용하여 사용자 입력값이 SQL 구문으로 해석되지 않도록 처리합니다. 클라이언트 및 서버 양쪽에서 입력값의 유효성을 검사합니다.
회원가입 시 입력된 비밀번호는 password_hash 함수 (bcrypt 알고리즘)를 사용하여 해싱한 뒤 저장합니다. 로그인 시에는 password_verify 함수로 저장된 해시값과 입력값을 비교합니다. 평문 비밀번호는 어떠한 경우에도 데이터베이스에 저장되지 않습니다.
- 이름: 정규표현식
^[a-zA-Z가-힣\s]+$를 사용하여 허용된 문자만 입력 가능하도록 제한합니다. - 학번: 8자리 숫자로 제한합니다.
- 생년월일:
YYYYMMDD형식의 8자리 숫자로 제한합니다. - 유효성 검사는 클라이언트(JavaScript)와 서버(PHP) 양쪽에서 수행합니다.
로그인 시 세션을 생성하고, 로그아웃 시 세션을 파기합니다. 회원 전용 페이지 접근 시 세션 유효 여부를 확인하며, 유효하지 않은 세션은 로그인 페이지로 리다이렉트합니다.
- XAMPP, MAMP 등 PHP 및 MariaDB 환경을 준비합니다.
- 프로젝트 파일을 웹 서버의 루트 디렉터리(예:
htdocs)에 배치합니다. 20195229.sql을 데이터베이스에 임포트합니다.- 브라우저에서
http://localhost/[프로젝트 디렉터리]/index.html에 접속합니다.