본문 바로가기

cs(with 매일메일)

[260306금] SQL 인젝션에 대해 설명해주세요.

웹 애플리케이션에서 사용자의 입력값이 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오류나 예외 메시지를 사용자에게 직접 노출하지 않는다.