SQL PlayZone은 CTFd 프레임워크를 기반으로 구축된 SQL 학습 및 문제 풀이 플랫폼입니다. 사용자가 SQL 쿼리 문제를 풀면서 데이터베이스 조작 능력을 향상시킬 수 있도록 설계되었습니다.
이 프로젝트는 CTFd (Capture The Flag 프레임워크)를 커스터마이징하여 SQL 문제 풀이 기능을 추가한 교육용 플랫폼입니다.
- SQL 문제 풀이: 사용자가 SQL 쿼리를 작성하고 실행하여 문제를 해결
- 자동 채점 시스템: Go 기반의 MySQL 서버를 통한 실시간 쿼리 검증
- 다양한 문제 유형 지원: 기본 CTF 문제와 SQL 특화 문제 모두 지원
- 팀/개인 경쟁: 개인 또는 팀 단위로 참여 가능
- 실시간 순위표: 점수 및 진행 상황 실시간 확인
- 관리자 인터페이스: 문제 생성 및 관리를 위한 웹 기반 관리자 도구
-
CTFd 웹 애플리케이션 (Python/Flask)
- 사용자 인터페이스
- 문제 관리 및 채점
- 사용자 인증 및 권한 관리
-
SQL Judge Server (Go)
- SQL 쿼리 실행 및 검증
- 안전한 샌드박스 환경 제공
- MySQL 호환 쿼리 처리
-
데이터베이스 (MariaDB)
- 플랫폼 데이터 저장
- 사용자, 문제, 점수 관리
-
캐시 서버 (Redis)
- 세션 관리
- 성능 최적화
-
웹 서버 (Nginx)
- 리버스 프록시
- 정적 파일 서빙
- Docker 및 Docker Compose
- Git
- 최소 4GB RAM
- 10GB 이상의 디스크 공간
-
저장소 클론
git clone [repository-url] cd sql-playzone/platform
-
CTFd 설정 파일 생성
# config.ini 파일 생성 (필수) cp CTFd/config.example.ini CTFd/config.ini
-
Docker Compose로 실행
docker compose up -d
-
웹 브라우저에서 접속
- http://localhost (Nginx를 통한 접속)
- http://localhost:8000 (CTFd 직접 접속)
-
초기 설정
- 첫 접속 시 관리자 계정 생성
- 플랫폼 기본 설정 구성
- SQL 문제 생성 및 배포
-
Python 가상 환경 설정
python3 -m venv venv source venv/bin/activate # Linux/Mac # 또는 venv\Scripts\activate # Windows
-
의존성 설치
pip install -r requirements.txt
-
데이터베이스 설정
- MariaDB 설치 및 실행
- Redis 설치 및 실행
- 환경 변수 설정:
export DATABASE_URL=mysql+pymysql://ctfd:ctfd@localhost/ctfd export REDIS_URL=redis://localhost:6379
-
SQL Judge Server 빌드 및 실행
cd CTFd/plugins/sql_challenges go mod tidy go build -o sql-judge-server sql_judge_server.go ./sql-judge-server
-
CTFd 실행
python serve.py # 또는 flask run --host=0.0.0.0 --port=8000
모든 환경 변수는 docker-compose.yml
파일에 정의되어 있습니다. 필요시 이 파일을 직접 수정하세요.
services:
ctfd:
environment:
- DATABASE_URL=mysql+pymysql://ctfd:ctfd@db/ctfd # DB 연결 정보
- REDIS_URL=redis://cache:6379 # Redis 캐시
- SQL_JUDGE_SERVER_URL=http://sql-judge:8080 # SQL 판정 서버
# 필요시 아래 값들을 수정하세요
- WORKERS=1
- REVERSE_PROXY=true
환경 변수 | 설명 | 기본값 |
---|---|---|
DATABASE_URL |
데이터베이스 연결 문자열 | mysql+pymysql://ctfd:ctfd@db/ctfd |
REDIS_URL |
Redis 캐시 서버 URL | redis://cache:6379 |
SQL_JUDGE_SERVER_URL |
SQL 판정 서버 URL | http://sql-judge:8080 |
UPLOAD_FOLDER |
파일 업로드 디렉토리 | /var/uploads |
LOG_FOLDER |
로그 파일 디렉토리 | /var/log/CTFd |
WORKERS |
워커 프로세스 수 | 1 |
REVERSE_PROXY |
리버스 프록시 사용 여부 | true |
환경 변수 | 설명 | 기본값 |
---|---|---|
MARIADB_ROOT_PASSWORD |
root 비밀번호 | ctfd |
MARIADB_USER |
데이터베이스 사용자명 | ctfd |
MARIADB_PASSWORD |
데이터베이스 비밀번호 | ctfd |
MARIADB_DATABASE |
데이터베이스명 | ctfd |
프로덕션 환경에서는 반드시 다음 값들을 변경하세요:
- 데이터베이스 비밀번호 (
MARIADB_PASSWORD
,MARIADB_ROOT_PASSWORD
) - CTFd SECRET_KEY (CTFd/config.ini 파일에서 설정)
포트를 변경하려면 docker-compose.yml
의 ports
섹션을 수정하세요:
services:
nginx:
ports:
- "80:80" # 웹 서버 포트 (변경: "8080:80")
ctfd:
ports:
- "8000:8000" # CTFd 직접 접속 포트
- 관리자로 로그인
- Admin Panel → Challenges → Create Challenge
- Challenge Type으로 "sql" 선택
- 다음 필드 입력:
- Name: 문제 제목
- Category: 문제 카테고리
- Description: 문제 설명
- Init Query: 테이블 생성 및 데이터 삽입 SQL
- Solution Query: 정답 SQL 쿼리
- Value: 문제 점수
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
city VARCHAR(50)
);
INSERT INTO users VALUES
(1, 'Alice', 25, 'Seoul'),
(2, 'Bob', 30, 'Busan'),
(3, 'Charlie', 35, 'Daegu');
SELECT name, age FROM users WHERE city = 'Seoul';
platform/
├── CTFd/ # CTFd 핵심 코드
│ ├── plugins/ # 플러그인 디렉토리
│ │ └── sql_challenges/ # SQL 문제 플러그인
│ │ ├── __init__.py # 플러그인 메인 로직
│ │ ├── sql_judge_server.go # Go 판정 서버
│ │ └── assets/ # 프론트엔드 리소스
│ ├── themes/ # UI 테마
│ ├── models/ # 데이터베이스 모델
│ └── api/ # REST API
├── docker-compose.yml # Docker 구성
├── Dockerfile # CTFd 이미지 빌드
├── requirements.txt # Python 의존성
└── serve.py # 개발 서버 실행 스크립트
-
포트 충돌
- 80, 8000, 3306, 6379 포트가 사용 중인지 확인
- docker-compose.yml에서 포트 매핑 수정
-
데이터베이스 연결 오류
- MariaDB 서비스 실행 확인
- DATABASE_URL 환경 변수 확인
- 방화벽 설정 확인
-
SQL Judge Server 오류
- Go가 설치되어 있는지 확인
- 8080 포트가 사용 가능한지 확인
- SQL_JUDGE_SERVER_URL 환경 변수 확인
# Docker 로그 확인
docker compose logs -f ctfd
docker compose logs -f sql-judge
docker compose logs -f db
# 로컬 실행 시 로그 위치
.data/CTFd/logs/
CTFd/plugins/
디렉토리에 새 플러그인 생성BaseChallenge
클래스 상속- 필요한 메서드 구현 (create, read, update, delete, attempt)
CTFd/themes/
디렉토리에서 기존 테마 복사- HTML, CSS, JavaScript 수정
- 관리자 패널에서 새 테마 선택
- SQL 쿼리는 격리된 환경에서 실행
- 사용자 입력은 모두 검증 및 살균 처리
- CSRF 토큰으로 보호
- Rate limiting 적용
- SSL/TLS 사용 권장 (프로덕션 환경)
이 프로젝트는 CTFd의 Apache License 2.0을 따릅니다.
버그 리포트, 기능 제안, 풀 리퀘스트를 환영합니다!
문제가 있거나 도움이 필요한 경우:
- GitHub Issues 생성
- 프로젝트 위키 참조
- 커뮤니티 포럼 참여