-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsecure_coding_checklist.csv
More file actions
We can make this file beautiful and searchable if this error is corrected: It looks like row 8 should actually have 5 columns, instead of 6 in line 7.
29 lines (29 loc) · 7.3 KB
/
Copy pathsecure_coding_checklist.csv
File metadata and controls
29 lines (29 loc) · 7.3 KB
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
Section,Checklist Item,Description,적용여부,구현 위치 / 비고
회원가입 및 프로필 관리,서버측 입력 검증,"사용자명(username)와 비밀번호(password)에 대해 길이, 허용 문자 집합, 형식 등 서버측 검증 수행. XSS 공격 방지를 위해 입력값 필터링 및 인코딩 적용 여부 확인",O,"app.py valid_username()/valid_password(); Jinja2 autoescape로 출력시 이스케이프"
,CSRF 보호,"회원가입, 로그인, 프로필 수정 등 모든 폼에 대해 CSRF 토큰 사용 여부를 확인하여 요청 위조 공격 방지",O,"Flask-WTF CSRFProtect 전역 적용, 모든 form에 csrf_token 히든필드"
,비밀번호 보안,"비밀번호를 평문으로 저장하지 않고 bcrypt, Argon2 등 강력한 해시 알고리즘과 고유 salt를 적용하여 암호화 저장하는지 확인",O,"bcrypt.hashpw() (salt 자동 생성), register()/profile() 비밀번호 변경"
,세션 쿠키 설정,세션 쿠키에 HttpOnly 및 HTTPS 환경에서 Secure 플래그가 적용되어 있는지 확인,O,"SESSION_COOKIE_HTTPONLY=True, SESSION_COOKIE_SECURE=(FLASK_ENV=production일 때 True), SESSION_COOKIE_SAMESITE=Lax"
,세션 만료 및 재인증,일정 시간 이후 세션 만료 및 민감 작업 시 재인증 로직이 구현되어 있는지 확인,O,"PERMANENT_SESSION_LIFETIME=30분; 비밀번호 변경 시 current_password 재확인 (profile())"
,실패 로그인 방어,로그인 실패 횟수에 따른 계정 잠금 혹은 지연(time-out) 메커니즘 적용 여부 확인,O,"login(): 5회 실패 시 15분 계정 잠금 (failed_attempts, locked_until 컬럼)"
,오류 메시지,오류 발생 시 내부 정보(스택 트레이스, DB 정보 등)가 노출되지 않도록 처리되어 있는지 확인,O,"errorhandler(404/403/500), FLASK_DEBUG=0 시 debug 모드 비활성화, error.html"
상품 등록 및 관리,폼 입력 검증,"상품 제목, 설명, 가격 등의 입력 필드에 대해 서버측 검증 및 필수 항목 체크 여부 확인. 가격은 숫자 형식 및 범위 검증 적용",O,"new_product()/edit_product() valid_text(), valid_price() (1~100,000,000)"
,파일 업로드 검증,"상품 사진 업로드 시 확장자 화이트리스트 및 실제 파일 시그니처(매직바이트) 검증, 파일 크기 제한, 서버 생성 파일명 사용 여부 확인",O,"save_product_image(): 확장자+매직바이트 이중검증, 5MB 제한, uuid 파일명으로 저장(경로 조작 방지)"
,XSS 방어,사용자 입력(상품 설명 등)에 대해 HTML 태그 및 스크립트 코드 이스케이프 또는 필터링 적용 여부 확인,O,"Jinja2 autoescape 기본 적용 (템플릿에서 |safe 미사용), 테스트로 <script> 이스케이프 확인"
,인증된 사용자만 등록,"상품 등록, 수정, 삭제 기능이 로그인한 사용자에게만 허용되도록 접근 제어가 구현되어 있는지 확인",O,"@login_required 데코레이터: new_product/edit_product/delete_product"
,소유자 확인,"상품 수정 및 삭제 시, 요청한 사용자가 해당 상품의 소유자인지 검증하는 로직이 구현되어 있는지 확인",O,"edit_product()/delete_product(): seller_id != session['user_id'] 이면 403"
,데이터 무결성,데이터베이스에 저장되기 전 모든 필수 항목 및 형식이 올바른지 검증하는 로직이 있는지 확인,O,"valid_text()/valid_price() 검증 통과해야 INSERT/UPDATE 수행"
실시간 채팅 및 메시징,메시지 내용 검증,"채팅 메시지에 대해 길이 제한, 허용 문자 집합, XSS 이스케이프 처리 여부 등 서버측 검증 수행 여부 확인",O,"handle_send_message_event(): 길이 1~500자 검증; 클라이언트는 textContent로만 렌더링"
,사용자 인증,"Socket 연결 시 사용자가 인증된 상태인지 확인하는 로직(예: 로그인 상태 확인)이 적용되어 있는지 확인",O,"@socketio.on('connect')에서 session 미존재시 연결 거부; send_message에서도 재확인"
,메시지 검증,클라이언트에서 수신한 메시지 데이터의 형식 및 내용에 대해 서버측 검증 로직이 존재하는지 확인,O,"handle_send_message_event(): 타입/길이 검증, 1:1 room은 참여자 검증"
,Rate Limiting,동일 사용자가 단기간에 과도한 메시지를 보내지 않도록 제한하는 기능(스팸 방지)이 구현되어 있는지 확인,O,"_last_message_time 딕셔너리로 최소 전송 간격(1초) 제한"
,연결 암호화,운영 환경에서 WSS(SSL/TLS 암호화된 웹소켓)를 사용하여 데이터 전송의 기밀성이 보장되는지 확인,△,"현재 개발환경은 ws://(HTTP); 운영 배포 시 리버스 프록시(nginx)+TLS 적용 필요 (README에 안내)"
안전 거래 및 신고,폼 입력 검증,"신고 대상(target_id) 및 신고 사유(reason)에 대해 서버측 입력 검증, 길이 제한, XSS 방어 적용 여부 확인",O,"report(): valid_text(target_id), valid_text(reason, 5, 500)"
,인증된 사용자 접근,신고 기능은 반드시 로그인한 사용자만 접근 가능하도록 제어되어 있는지 확인,O,@login_required 데코레이터 적용
,데이터 무결성 및 로그 관리,"신고 접수 시 올바른 형식의 데이터가 저장되고, 신고 활동이 감사 로그로 기록되는지 확인",O,"report 테이블에 reporter_id/target_id/reason/created_at 기록 (감사 로그 역할)"
,신고 남용 방지,"동일 사용자의 반복 신고 제한, 신고 건수 제한 및 관리자 검토 프로세스 등 신고 기능 남용 방지 로직이 구현되어 있는지 확인",O,"동일 대상 중복신고 차단, 1일 최대 20건 제한, 3회 누적시 자동 차단/휴면 + 관리자 페이지에서 수동 검토 가능"
전체 시스템,ORM 및 파라미터 바인딩,"SQLAlchemy ORM 및 파라미터 바인딩을 통해 SQL 인젝션 공격에 대한 방어가 제대로 이루어지고 있는지 확인",O,"sqlite3 파라미터 바인딩(?) 전 구간 사용 (ORM 대신 raw SQL이지만 바인딩으로 SQLi 방지); 검색 LIKE 절은 ESCAPE 처리"
,데이터베이스 권한,데이터베이스 사용자 권한이 최소 권한 원칙에 따라 설정되어 민감 데이터 접근이 제한되어 있는지 확인,△,"현재 SQLite 파일 기반(단일 앱 프로세스만 접근); 운영 시 별도 DB 서버 사용한다면 최소 권한 계정 분리 필요"
,보안 헤더 설정,"Content-Security-Policy, X-Frame-Options, X-Content-Type-Options 등의 보안 헤더가 적용되어 있는지 확인",O,"after_request(set_security_headers): CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy"
,HTTPS 적용,운영 환경에서 HTTPS를 사용하여 데이터 전송 시 기밀성 및 무결성이 보장되는지 확인,△,"로컬 테스트는 HTTP; ngrok https 터널 또는 운영 배포시 TLS 필요, FLASK_ENV=production 시 HSTS 헤더 자동 추가"
,에러 및 예외 처리,"예외 처리 시 민감 정보가 사용자에게 노출되지 않고, 에러 로그에 민감 정보 기록 방지 로직이 구현되어 있는지 확인",O,"errorhandler(404/403/500/CSRFError), debug=False 옵션 지원"
,라이브러리 및 의존성 관리,"사용 중인 Flask, SQLAlchemy, Flask-SocketIO 등 라이브러리의 최신 보안 패치 및 업데이트가 적용되어 있는지 정기적으로 점검",O,"requirements.txt/enviroments.yaml로 버전 관리; pip install 시 최신 안정 버전 사용"