담비의 개발블로그

[보안]SQL 인젝션 본문

기타

[보안]SQL 인젝션

담비12 2024. 10. 16. 18:29
SQL 인젝션

 

SQL 인젝션(SQL Injection)은 애플리케이션의 취약점을 악용하여, 공격자가 악의적인 SQL 쿼리를 실행해 데이터베이스에 접근하거나 조작하는 보안 공격 기법이다. 이 공격은 주로 애플리케이션에서 사용자가 입력한 데이터를 SQL 쿼리로 처리할 때, 입력값이 적절하게 필터링되거나 검증되지 않으면 발생할 수 있다.

 

예를 들어 사용자가 입력한 값이 SQL 쿼리에 직접 삽입될 때 발생할 수 있다.

SELECT * FROM users WHERE username = 'admin' AND password = 'password';

 

위와 같은 쿼리를 처리하는 애플리케이션이 있다고 가정할 때, 공격자가 다음과 같은 입력을 하면

' OR '1'='1

 

쿼리는 다음과 같이 변형 될 수 있다. 이 경우 '1'='1' 조건이 항상 참이므로, 공격자는 비밀번호 없이도 데이터베이스에 접근할 수 있게 된다.

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';

 

 

방어 방법

1. Prepared Statements (준비된 문): 사용자 입력을 직접 쿼리에 넣지 않고, 바인딩된 변수를 사용하여 쿼리 실행 시 컴파일된 후 데이터를 삽입하는 방식으로 SQL 인젝션을 막을 수 있다.

String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);

 

2. ORM (Object-Relational Mapping) 사용: Hibernate나 JPA 같은 ORM 프레임워크를 사용하면 SQL 쿼리를 직접 작성하지 않고 객체를 통해 데이터베이스와 상호작용하기 때문에 인젝션 위험을 줄일 수 있다.

 

3. 입력 값 검증 및 필터링: 사용자 입력을 철저히 검증하고, 특수 문자를 필터링하여 인젝션 공격을 방지할 수 있다.

 

4. 최소 권한의 원칙: 데이터베이스에 접근하는 계정에 최소한의 권한만 부여하여, SQL 인젝션이 발생하더라도 피해를 최소화할 수 있다.

'기타' 카테고리의 다른 글

2025.04.03.면접문제풀기  (1) 2025.04.21
윈도우11 사용자 암호 만료 기간 해제  (0) 2024.06.10