중고거래 플랫폼 (화이트햇 스쿨 4기 시큐어 코딩 과제). Flask + SQLite로 구현하며 입력값 검증을 비롯한 시큐어 코딩을 적용한다.
Python 3.10 이상 필요.
# 1. 가상환경 생성 및 활성화
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 2. 의존성 설치
pip install -r requirements.txt
# 3. 실행 (최초 실행 시 DB가 자동 생성됨)
python3 app.py브라우저에서 http://127.0.0.1:5000 접속.
관리자 권한은 코드가 아닌 데이터베이스에서 부여한다(권한 부여를 애플리케이션 밖에서 통제).
sqlite3 market.db "UPDATE users SET role='admin' WHERE username='본인아이디'"이후 그 계정으로 로그인하면 상단에 관리자 메뉴가 보인다.
- 유저 관리 (회원가입, 로그인, 사용자 조회, 마이페이지)
- 상품 관리 (등록, 조회, 상세, 내 상품 관리)
- 채팅 (전체, 1대1)
- 신고/차단 (신고, 상품 차단, 유저 휴면)
- 송금
- 검색
- 관리자
- 모든 DB 접근에 파라미터 바인딩을 사용해 SQL 인젝션 차단
- 비밀번호는 해시로만 저장(werkzeug), 로그인 실패 메시지는 계정 존재 여부를 노출하지 않음
- 입력값 화이트리스트 검증(아이디 형식, 길이, 가격/금액 범위)
- Jinja2 자동 이스케이프로 저장형 XSS 차단
- 세션 쿠키 HttpOnly와 SameSite, 로그인 시 세션 재발급
- 소유권/권한 검사(내 상품만 수정·삭제, 관리자 전용 페이지)
- 이미지 업로드 확장자 화이트리스트와 랜덤 파일명, 크기 제한
- 송금은 조건부 UPDATE로 잔액 부족/음수/경쟁조건 방지
- Flask (웹 프레임워크)
- SQLite (데이터베이스)
- Jinja2 (템플릿, 자동 이스케이프)