생활 가이드

PHP SQL 인젝션 XSS 파일 업로드 보안 방어법

PHP 코드 보안의 핵심은 SQL은 PDO 준비된 구문으로, 화면 출력은 htmlspecialchars로, 비밀번호는 password_hash로, 업로드 파일은 크기·형식을 직접 검증하고 새 이름으로 저장하는 것입니다. 모두 PHP 공식 매뉴얼이 안내하는 방법입니다.

이 글은 SQL 인젝션, XSS, CSRF, 파일 업로드, 비밀번호 저장 방어 방법을 다룹니다. 프레임워크별 보안 기능은 다루지 않습니다.

아래 버튼에서 필요한 다음 단계를 확인하세요.

👉 PHP 홈페이지 바로가기👉 PHP 서버 보안 설정 php.ini 세션 로그인 점검👉 PHP 웹쉘 탐지 사이트 해킹 복구 점검 순서

1. SQL 인젝션은 준비된 구문으로 막습니다

PHP 매뉴얼은 준비된 구문(prepared statement)을 SQL을 미리 해석해 두고 변수만 나중에 채우는 틀로 설명합니다. 애플리케이션이 준비된 구문만 쓰면 SQL 인젝션이 생기지 않는다고 안내합니다.

다만 쿼리의 다른 부분을 이스케이프하지 않은 입력으로 만들면 여전히 위험합니다. OWASP도 준비된 구문(매개변수화 쿼리)을 첫 번째 방어책으로, 모든 입력을 이스케이프하는 방식은 권장하지 않는 방법으로 분류합니다.

  • PDO 준비된 구문 사용
  • 값은 항상 매개변수로 전달
  • 테이블·컬럼 이름은 허용 목록으로 검증
  • 문자열 이어 붙이기 SQL 금지

2. XSS는 출력할 때 이스케이프합니다

사용자 입력을 HTML로 출력할 때는 htmlspecialchars로 특수 문자를 HTML 엔티티로 바꿉니다. 이 함수의 기본 플래그에는 작은따옴표·큰따옴표 변환(ENT_QUOTES)이 포함됩니다.

입력할 때가 아니라 출력할 때 상황(HTML 본문, 속성, 자바스크립트)에 맞게 이스케이프하는 것이 기본입니다. 입력값 검증은 형식 확인용으로 따로 합니다.

상황방어
HTML 본문·속성에 출력htmlspecialchars
DB 조회준비된 구문
입력 형식 확인검증(허용 목록)

3. CSRF는 세션 쿠키 설정과 토큰으로 줄입니다

PHP 매뉴얼은 session.cookie_samesite를 Lax 또는 Strict로 두면 CSRF 공격을 완화할 수 있다고 안내합니다. 중요한 요청에는 CSRF 토큰을 함께 쓰세요.

매뉴얼은 세션 ID를 CSRF 토큰으로 쓰는 것을 권장하지 않으며, CSRF 토큰도 세션 ID처럼 주기적으로 갱신하라고 안내합니다.

  • session.cookie_samesite = Lax 또는 Strict
  • 중요 요청에 CSRF 토큰
  • 토큰은 세션 ID와 별도로 생성·갱신
  • 상태를 바꾸는 요청은 POST 사용

4. 파일 업로드는 검증하고 새 이름으로 저장합니다

PHP 매뉴얼의 업로드 예제는 파일 크기 제한을 확인하고, $_FILES의 MIME 값을 믿지 말고 finfo로 직접 확인하라고 안내합니다. 파일 이름도 사용자가 올린 이름을 검증 없이 쓰지 말고 고유한 이름(예제는 파일 해시)으로 저장합니다.

허용할 형식은 목록으로 제한하고(예: jpg, png, gif), 업로드 폴더에서는 PHP 실행을 막는 것이 안전합니다. 업로드가 필요 없으면 OWASP 설정 치트시트처럼 file_uploads를 끄세요.

점검방법(PHP 매뉴얼)
크기서버 측 크기 제한 확인
형식finfo로 MIME 직접 확인, 허용 목록
파일명검증하거나 새 이름 생성
저장move_uploaded_file

5. 비밀번호는 password_hash로 저장합니다

password_hash는 강력한 단방향 해시로 비밀번호를 만들며 PASSWORD_DEFAULT는 bcrypt를 씁니다. 이 상수는 앞으로 더 강한 알고리즘으로 바뀔 수 있어 결과 길이가 변할 수 있으니 DB 컬럼은 255바이트로 잡으라고 안내합니다.

검증은 password_verify로 하며, 솔트와 알고리즘 정보가 해시 안에 들어 있어 따로 저장하지 않아도 됩니다. PHP 8.4부터 bcrypt 기본 cost가 10에서 12로 올랐습니다.

  • 저장: password_hash($pw, PASSWORD_DEFAULT)
  • 검증: password_verify
  • DB 컬럼 길이 255 이상
  • MD5·평문 저장 금지

실행 체크리스트

표시한 항목은 이 브라우저에만 저장되며 어디에도 전송하지 않습니다.

확인한 공식 자료

작성·점검일 2026-10-22. PHP·워드프레스·OWASP·KISA 공식 문서를 바탕으로 정리한 편집 가이드입니다. 보안 설정은 서버 환경에 따라 정상 기능을 막을 수 있으니 운영 서버에 적용하기 전에 테스트 환경에서 확인하세요.