04 · CHAPTER 02 · WEB SECURITY

문장과 데이터가
섞일 때

SQL Injection이 발생하는 원인과 매개변수화 쿼리의 방어 원리를 이해합니다.

읽는 시간 약 16분SQL Injection · Query · Prepared Statement2026. 08. 02
실습 범위 안내 이 장의 확인 과정은 본인이 소유하거나 명시적으로 허가받은 교육·실습 환경에서만 수행합니다. 운영 시스템과 제3자의 장비에는 적용하지 않습니다.
WEB SECURITY STUDY NOTE문장과 데이터가 섞일 때SQL Injection · Query · Prepared Statement

01

주문 내용이 주방 규칙을 바꾼다면

핵심 용어
SQL Injection Query Prepared Statement

손님의 요청은 재료 정보여야지 주방의 전체 작업 지시가 되어서는 안 됩니다.

문자열을 이어 붙여 SQL을 만들면 사용자 입력이 쿼리 구조 일부로 해석될 수 있습니다.

Prepared Statement는 쿼리 틀과 값을 따로 전달하여 DB가 입력값을 데이터로 처리하게 합니다.

02

취약점의 조건과 방어

핵심 개념
문자열 결합 과도한 DB 권한 Prepared Statement DB 제약 조건 감사 로그

오류 숨기기만으로 원인은 사라지지 않습니다.

문자열 결합입력이 SQL 구조에 섞임
과도한 DB 권한침해 영향이 확대됨
Prepared Statement쿼리와 값을 분리
DB 제약 조건데이터 무결성 보완
감사 로그반복 실패와 이상 조회 탐지

03

안전한 코드 비교하기

관련 명령어
php spark db:table users php spark db:show grep -R "query(" app/Models app/Controllers 2>/dev/null

DVWA 등 승인된 실습 환경에서 취약 코드와 매개변수화 코드를 비교합니다.

직접 확인해 보기
$ php spark db:table users $ php spark db:show $ grep -R "query(" app/Models app/Controllers 2>/dev/null

04

DB 오류를 사용자에게 보여 주지 않기

보안 관점
위험 요소 확인 기준 대응 원칙

상세 오류는 내부 로그에 남기고 외부에는 일관된 메시지를 반환합니다.

웹 계정의 DB 권한을 필요한 테이블과 동작으로 제한하고, 비밀번호와 연결 정보는 저장소 밖에서 관리합니다.

SQL Injection 방어의 중심은 입력에서 특수문자를 지우는 것이 아니라 쿼리와 데이터를 분리하는 것이다.

CHAPTER REVIEW

이번 장에서 기억할 한 문장

SQL 문장과 사용자 데이터를 분리하면 입력값이 명령의 구조를 바꾸지 못한다.