웹 애플리케이션에서 사용자의 입력값이 SQL쿼리에 안전하게 처리되지 않을 때 발생하는 보안 취약점
공격자는 이 취약점을 이용해서 쿼리를 조작하거나, 인증을 우회하거나, 데이터 자체를 삭제할 수도 있다.
예시
로그인 검증 시 아래 코드 사용
public boolean login(String username, String password) {
String sql = "SELECT * FROM users WHERE username = " + username + " AND password = " + password";
// DB커넥션 코드
}
사용자가 로그인 폼에 아래 같이 입력
username = admin --
password = (아무거나)
-- 이후는 주석처리되므로 비밀번호 조건은 무시된다.
다른 SQL 인젝션 공격 방법
' OR ' 1 '='1 : 항상 참이 되는 조건
' UNION SELECT * FROM accounts -- : 다른 테이블의 정보 조회
'; DROP TABLE users --: 테이블 삭제
SQL인젝션 예방 방법
1. PreparedStatement를 사용 : placeholder(?)에 값을 바인딩한다.
String sql = "SELECT * FROM users WHERE username = ? AND pasword = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
2. JPA 같은 ORM프레임워크를 사용하면 SQL쿼리를 직접 작성하지 않으므로 예방
3. 사용자 입력에 대해 공격에 사용되는 SQL구문의 포함 여부를 검증한다
4. SQL오류나 예외 메시지를 사용자에게 직접 노출하지 않는다.
'cs(with 매일메일)' 카테고리의 다른 글
| [260310화] NOT IN쿼리를 사용할 때 발생할 수 있는 문제와 최적화 방법에 대해 설명해 주세요. (1) | 2026.03.10 |
|---|---|
| [260309월] 최종적 일관성이란 무엇인가요? (0) | 2026.03.09 |
| [260305목] 테스트 격리란 무엇인가요? (0) | 2026.03.05 |
| [260304수] NoSQL데이터베이스의 유형에는 어떤 것들이 있나요? (0) | 2026.03.04 |
| [260303화] 템플릿 메서드 패턴이란 무엇인가요? (0) | 2026.03.03 |