CSS Tutor Study Hub 메인으로

Computersystemsicherheit 2025/26

18. SQL Injection·Prepared statement 완전 초보 강의

비유, 단계별 예시, 자체 흐름도, 강의 스크립트 원본, 시험 답안까지 한 페이지에서 연결합니다.

CSS 1타 강사 · CONCEPT 18/25

문자열 입력이 어떻게 SQL query의 문법을 바꿀까요?

문자열 연결로 query를 만들면 사용자 입력의 따옴표와 SQL syntax가 query 구조에 섞일 수 있습니다. Prepared statement는 SQL 구조를 먼저 고정하고 입력을 parameter value로 따로 전달합니다.

전문 용어를 보기 전에 이 장면부터 잡으세요

주문서의 이름 칸에 ‘모든 주문을 취소하라’는 명령을 써도 직원이 이름으로만 처리해야 합니다. 문자열 연결은 이를 명령으로 읽는 실수입니다.

입력값이 SQL 문장의 구조를 바꾸는 문제

00

한 장면으로 문제를 시작해 봅시다

이번 페이지에서 끝까지 따라갈 예시

Server가 SELECT ... WHERE username='$u' AND password='$p'를 문자열 연결로 만들고, attacker가 따옴표와 OR 조건을 입력합니다.

비유와 실제 시스템을 정확히 연결하기

  • 주문서 이름 칸사용자 parameter value
  • 주문 지시 문법SQL query structure
  • 양식과 값을 따로 전달prepared statement와 binding

이 예시에서 사람·장치·데이터·화살표를 먼저 찾습니다. 아직 용어를 완벽히 몰라도 “누가 무엇을 가지고, 어떤 처리를 거쳐, 무엇이 달라지는가”를 말할 수 있으면 출발점은 충분합니다.

01

긴 이름을 작은 용어로 분리하기

한 제목에 여러 단어가 들어 있어도 같은 기능을 뜻하지 않습니다. 아래 카드를 하나씩 읽고 각 용어의 대상과 역할을 따로 잡으세요.

SQL injection과 prepared statement

SQL은 database에 질문하는 언어다. 프로그램이 SQL 문자열과 사용자 입력을 단순히 이어 붙이면 입력의 따옴표나 연산자가 데이터가 아니라 SQL 문법으로 해석될 수 있다. 이것이 SQL injection이다. Prepared statement는 SQL 구조를 먼저 고정하고 사용자 값은 별도 parameter로 전달해 값이 명령 문법이 되지 못하게 한다.

TERMS FROM ZERO

SQL injection과 prepared statement 핵심 용어

아래 단어는 이미 안다고 가정하지 않습니다. 먼저 쉬운 뜻을 읽고, 본문에서 같은 단어가 나오면 이 정의로 다시 바꾸어 읽으세요.

SQL query

Database에 조회·삽입·변경 등을 요청하는 SQL 문장입니다.

SQL injection

공격자 입력이 SQL data가 아니라 query 구조와 명령으로 해석되는 취약점입니다.

Prepared statement

SQL 구조를 먼저 고정하고 사용자 값을 별도 parameter로 전달하는 방식입니다.

Parameter binding

입력값을 SQL syntax와 분리된 data slot에 연결하는 과정입니다.

Browser, server, HTTP, HTML parser

Browser는 사용자의 client 프로그램이고 web server는 request를 받아 response를 만드는 프로그램이다. HTTP request에는 method, URL, header, body가 있고 response에는 status, header, body가 있다. Browser는 response body를 단순 글자가 아니라 HTML, JavaScript 같은 문법으로 해석(parse)한다. 외부 입력이 처음 들어오는 곳을 source, 그 입력이 실제 기능에 사용되는 위험한 도착점을 sink라고 부른다. 따라서 입력이 어느 문법 위치와 sink에 들어가는지가 보안에 매우 중요하다.

TERMS FROM ZERO

Browser, server, HTTP, HTML parser 핵심 용어

아래 단어는 이미 안다고 가정하지 않습니다. 먼저 쉬운 뜻을 읽고, 본문에서 같은 단어가 나오면 이 정의로 다시 바꾸어 읽으세요.

HTTP request

Browser나 client가 server에 method, path, headers, body를 담아 보내는 message입니다.

HTTP response

Server가 status, headers, body를 담아 client에 돌려주는 message입니다.

Parser / Interpreter

문자열을 HTML, JavaScript, SQL, shell 같은 문법으로 해석하는 구성요소입니다.

Context

같은 문자가 어느 문법의 어느 위치에 놓였는지를 뜻하며 올바른 encoding 방법을 결정합니다.

02

실제 시스템에서는 이 순서로 움직입니다

모바일에서는 그림 안을 좌우로 움직이며 번호 순서대로 읽으세요.

예시를 단계별로 해체하기

  1. 1단계사용자 입력이 form이나 직접 만든 HTTP request로 들어옵니다.
  2. 2단계Application이 입력을 SQL 문자열에 이어 붙입니다.
  3. 3단계입력 안의 quote와 SQL operator가 parser가 보는 query 구조를 바꿉니다.
  4. 4단계조건 우회·data 유출·수정·삭제 같은 impact가 발생할 수 있습니다.
  5. 5단계Prepared statement는 SQL 구조를 먼저 고정하고 값을 parameter로 별도 전달합니다.
  6. 6단계HTML escaping이 아니라 database driver의 parameter binding을 사용해야 합니다.

이 단계들은 시험 답안에서 원인과 결과가 빠지지 않도록 만든 설명 순서입니다.

손으로 따라가는 초보 예제

이름 값이 WHERE 조건으로 바뀌는 과정

Application이 `SELECT * FROM users WHERE name='` + input + `'`처럼 query를 만듭니다.

  1. 1단계정상 입력 `alice`는 `WHERE name='alice'`라는 의도한 조건을 만듭니다.
  2. 2단계공격 입력의 quote는 문자열을 일찍 닫고 뒤의 SQL operator가 query 구조에 참여하게 할 수 있습니다.
  3. 3단계Database parser는 application이 만든 한 문자열만 보므로 어느 부분이 data였는지 알 수 없습니다.
  4. 4단계결과적으로 조건 우회나 의도하지 않은 row 접근이 발생할 수 있습니다.
  5. 5단계Prepared statement는 `WHERE name=?` 구조를 먼저 database에 전달합니다.
  6. 6단계그 뒤 `alice` 같은 입력을 parameter로 binding하면 입력 속 quote도 SQL syntax가 아니라 값으로 처리됩니다.

그래서 무엇을 배웠나? 근본 방어는 특수문자 추측 삭제가 아니라 SQL 구조와 data를 API 수준에서 분리하는 것입니다.

03

관련 개념도 하나씩 따로 이해하기

SQL injection과 prepared statement

비유에서 실제 시스템으로 옮겨 보기

먼저 떠올릴 장면 · 주문서의 이름 칸에 ‘주문 취소하고 금고 열기’라고 썼을 때 직원이 그것을 이름이 아니라 새 지시로 실행하는 문제다. Prepared statement는 이름 칸을 끝까지 데이터 칸으로 고정한다.

정확한 뜻 · SQL은 database에 질문하는 언어다. 프로그램이 SQL 문자열과 사용자 입력을 단순히 이어 붙이면 입력의 따옴표나 연산자가 데이터가 아니라 SQL 문법으로 해석될 수 있다. 이것이 SQL injection이다. Prepared statement는 SQL 구조를 먼저 고정하고 사용자 값은 별도 parameter로 전달해 값이 명령 문법이 되지 못하게 한다.

  1. 1단계$_GET, $_POST 같은 입력 source를 찾는다.
  2. 2단계SQL 문자열 연결 또는 interpolation 지점을 찾는다.
  3. 3단계입력이 query 구조를 바꿀 수 있는지 확인한다.
  4. 4단계Prepared statement와 bound parameter로 구조와 값을 분리한다.
  5. 5단계Database account 권한도 최소화한다.

Browser, server, HTTP, HTML parser

비유에서 실제 시스템으로 옮겨 보기

먼저 떠올릴 장면 · 같은 기호도 일반 편지 본문에서는 글자지만 계산식 칸에서는 연산자로 읽힌다. Browser도 입력이 HTML text, attribute, script 중 어디에 들어갔는지에 따라 다르게 해석한다.

정확한 뜻 · Browser는 사용자의 client 프로그램이고 web server는 request를 받아 response를 만드는 프로그램이다. HTTP request에는 method, URL, header, body가 있고 response에는 status, header, body가 있다. Browser는 response body를 단순 글자가 아니라 HTML, JavaScript 같은 문법으로 해석(parse)한다. 외부 입력이 처음 들어오는 곳을 source, 그 입력이 실제 기능에 사용되는 위험한 도착점을 sink라고 부른다. 따라서 입력이 어느 문법 위치와 sink에 들어가는지가 보안에 매우 중요하다.

  1. 1단계사용자 입력이 들어오는 source를 찾는다.
  2. 2단계입력이 출력·DB·명령으로 들어가는 sink를 찾는다.
  3. 3단계그 sink를 어떤 parser가 어떤 context로 읽는지 확인한다.
  4. 4단계공격 영향과 context에 맞는 방어를 연결한다.

04

강의 스크립트 원본과 연결하기

SQL injection 정의·login query 예시·parameterized 방어를 보여 주는 대표 슬라이드입니다. 먼저 위의 초보 설명을 읽고, 원본에서는 같은 개념이 어떤 기호와 독일어·영어 용어로 표현되는지 확인하세요.

SQL Injection·Prepared statement 관련 강의 스크립트 대표 슬라이드
원본 Vorlesung/10 Web Application Security.pdf · p.10, p.12, p.16 · SQL injection 정의·login query 예시·parameterized 방어
  • 10 Web Application Security.pdf · p.10, p.12, p.16

05

시험 함정과 답안에 적용하기

  • SQL injection과 prepared statement · 따옴표를 몇 개 치환하는 blacklist나 client-side validation만으로 해결하려 하지 않는다.
  • Browser, server, HTTP, HTML parser · 입력 문자열 자체만 보고 취약점을 이름 붙이지 말고 source에서 sink까지 실제 흐름을 추적한다.

서술형 답안 골격

vulnerable concatenation line, attacker input, changed query, impact, parameterized query를 한 묶음으로 씁니다.

정의 → 등장 주체 또는 입력 → 작동 순서 → 보안 효과 → 조건과 한계 순서로 쓰고, 위 단계별 예시에서 필요한 문장을 골라 붙이세요.

30초 자가 확인

책을 덮고 “문자열 입력이 어떻게 SQL query의 문법을 바꿀까요?”에 대해 핵심 용어 두 개, 작동 단계 세 개, 대표 함정 하나를 말해 보세요.

다음 개념으로 넘어가기 전 확인

  1. 문자열 연결이 data와 syntax를 섞는 이유는?
  2. Prepared statement가 query 구조를 고정하는 시점은?
  3. HTML escaping이 SQL injection 방어가 아닌 이유는?