◆ PART · DB

SQL 인젝션 직접 시연

데이터와 MyBatis — 읽기 자료

📍 지금 어디를 만지고 있나요?
브라우저
데이터와 MyBatis
DB

핵심 용어

SQL 인젝션SQL 문에 악의적 코드를 끼워넣어 의도치 않은 동작을 일으키는 공격.
PreparedStatement미리 컴파일된 SQL. 파라미터를 안전하게 바인딩.

1. 문제

전 차시까지의 답답함

"#{} 와 ${} 의 차이가 뭐예요?" — 잘못 쓰면 보안 사고.

2. 새 도구

두 파라미터 표기법

#{} = 안전한 PreparedStatement (값을 따옴표로 감쌈). ${} = 위험한 문자열 치환 (그대로 끼워넣음).

3. 코드

<!-- 위험한 코드 (Demo 용) -->
<select id="login" resultType="com.smhrd.domain.Member">
    SELECT * FROM mymember
    WHERE id = '${id}' AND pwd = '${pwd}'
</select>

-- 공격 입력:
   id = "admin' OR '1'='1"
   → 완성된 SQL:
   SELECT * FROM mymember WHERE id='admin' OR '1'='1' AND pwd='...'
   → 누구나 admin 으로 로그인 가능!

<!-- 안전한 코드 -->
<select id="login" resultType="com.smhrd.domain.Member">
    SELECT * FROM mymember
    WHERE id = #{id} AND pwd = #{pwd}
</select>

4. 정리

5. Before / After

전 차시 끝

"#{} 와 ${} 의 차이가 뭐예요?" — 잘못 쓰면 보안 사고.

이번 차시 끝

`#{}` 만 쓰는 습관이 들어 있다. `${}` 는 정렬 컬럼 같은 특수 경우만.