◆ LAB · DB

SQL 인젝션 직접 시연

데이터와 MyBatis — 실습

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

사전 준비

이번 실습의 목표

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

1
코드 작성
<!-- 위험한 코드 (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>
CHECKPOINT
  • 코드를 작성한 뒤 빨간 줄(컴파일 오류)이 없는가?
2
실행 + 결과 확인

Run on Server 또는 javac+java 로 실행하고 결과를 확인합니다.

CHECKPOINT
  • 예상한 동작이 일어났는가?
  • 안 됐다면 F12 / 콘솔 / 로그 어디서 단서가 보이는가?

실습 완료 체크리스트

#{} = 안전 (PreparedStatement 자동)
${} = 위험 (문자열 치환, 인젝션)
기본은 무조건 #{}