반응형



SQL Injection(SQL injection)은 한 줄로 말하면:
사용자 입력값을 이용해서,
개발자가 의도하지 않은 SQL을 실행시키는 공격
이다.
가장 핵심 원인
거의 항상 이것 때문.
문자열로 SQL을 직접 이어붙임
위험한 코드 예시
Java 기준:
String sql =
"SELECT * FROM users WHERE id = '" + id + "'";
사용자가 정상 입력
id = hoon
이면:
SELECT * FROM users WHERE id = 'hoon'
정상.
그런데 공격자가 입력
' OR 1=1 --
하면?
최종 SQL
SELECT * FROM users
WHERE id = '' OR 1=1 --'
결과
OR 1=1
은 항상 참.
즉:
전체 사용자 조회
가능.
여기서 -- 의미
SQL 주석(comment).
즉 뒤 코드 무시.
핵심 문제
DB가:
입력값과 SQL 코드를 구분 못함
이다.
실제 가능한 공격
엄청 다양.
1. 로그인 우회
예:
SELECT *
FROM users
WHERE id='admin'
AND pw=''
OR 1=1
2. 데이터 조회
회원정보 탈취
3. 데이터 삭제
DELETE FROM users
삽입 가능성.
4. 관리자 권한 변경
UPDATE users
SET role='ADMIN'
5. DB 서버 장악
심하면:
- 파일 읽기
- 시스템 명령 실행
까지 가능.
왜 위험하냐?
웹앱이:
DB 권한을 대신 가지고 있음
때문.
즉 앱을 속이면 DB 조작 가능.
해결 핵심 — Prepared Statement
실무에서 가장 중요.
안전한 코드
String sql =
"SELECT * FROM users WHERE id = ?";
PreparedStatement ps =
conn.prepareStatement(sql);
ps.setString(1, id);
왜 안전?
DB가:
SQL 구조
와
데이터 값
을 분리 처리.
즉 공격 입력이 와도
그냥 문자열 데이터
로 취급.
SQL 코드가 안 됨.
ORM도 결국 PreparedStatement 사용
예:
- Hibernate
- JPA
- MyBatis #{}
등.
MyBatis 중요 포인트
엄청 실무 중요.
안전
WHERE id = #{id}
↓
PreparedStatement 사용.
위험
WHERE id = ${id}
↓
문자열 치환.
즉 SQL Injection 가능.
${} vs #{}
문법의미
| #{} | 안전(바인딩) |
| ${} | 위험(문자열 치환) |
그런데 ORDER BY는?
실무에서 자주 헷갈림.
이런 코드
ORDER BY ${column}
Injection 가능.
그래서 화이트리스트 사용
예:
if (!allowedColumns.contains(column)) {
throw new IllegalArgumentException();
}
입력값 검증도 중요
하지만:
검증만 믿으면 안 됨
핵심 방어는 반드시
PreparedStatement
이다.
실무 추가 방어
1. 최소 권한 DB 계정
앱 DB 계정에:
DROP 권한
같은 거 최소화.
2. 에러 메시지 숨김
SQL 에러 노출 금지.
3. WAF
예:
- Cloudflare WAF
등.
Blind SQL Injection
중요한 고급 공격.
에러 안 보여도
참/거짓 반응 차이
로 데이터 추출 가능.
예:
AND SUBSTRING(password,1,1)='a'
시간 기반 공격도 존재
예:
SLEEP(5)
같은 함수.
그래서 SQL Injection은 아직도 위험
OWASP Foundation Top10 단골.
실무 핵심 원칙
절대 SQL 문자열 직접 조립하지 말 것
무조건
- PreparedStatement
- ORM 바인딩
- #{}
사용.
핵심 한 줄
SQL Injection은:
사용자 입력값이 SQL 코드로 해석되면서,
개발자가 의도하지 않은 데이터 조회·수정·삭제가 가능해지는 공격
이며,
가장 중요한 방어는:
PreparedStatement를 사용해
SQL 구조와 입력 데이터를 분리하는 것
이다.
반응형
'system_fundamentals > security_cryptography' 카테고리의 다른 글
| SameSite Cookie (0) | 2026.05.19 |
|---|---|
| CSP (0) | 2026.05.19 |
| CSRF (0) | 2026.05.19 |
| XSS (0) | 2026.05.19 |
| 쿠키 보안 옵션 (0) | 2026.05.18 |
댓글