Language/SQL

[DATABASE] PreparedStatement를 사용하여 시큐어코딩하기

simDev1234 2022. 4. 21. 18:05

■ SQL Injection

공격자가 악의적인 의도를 갖는 SQL 구문을 삽입하여, 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법

 

▶ 해커의 해킹 방식

//아래의 SQL문에 항상 참인 값을 넣으면 모든 정보가 노출이된다.
String sql = "SELECT * FROM test_member WHERE id = 'test' AND pwd = '1234'" + "or 1 = 1";

- 위와 같은 방식으로 SQL구문을 삽입하여 DB를 조작하는 공격을 SQL 인젝션이라 한다.

- 해결 방법 : PreparedStatement를 사용한다.

 

■ Statement와 PreparedStatment의 차이점

  Statement PreparedStatement
차이점 캐시 미사용 캐시 사용
절차 쿼리 문장 분석
컴파일
실행
--> 계속해서 위 세단계를 반복
쿼리 문장 분석
컴파일
실행
-> 처음 한번만, 캐시에 담아 재사용
결론 보안 낮음, 성능 낮음 보안 높음, 성능 높음

 

■ PreparedStatement로 JDBC프로그래밍 하는 순서

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class _00_preparedStatement {

	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 정보를 찾을 수 없습니다.");
		}
	}
	
	public static void main(String[] args) throws Exception{
		//1. 연결
		String url = "  /* url 정보 */";
		String user = "계정명";
		String pwd = "비밀번호";
		
		Connection conn = DriverManager.getConnection(url, user, pwd);
		
		//2. preparedStatement
		//1) SQL문에 '?'를 넣어 값을 넣을 parameter를 형성
		// parameter index   1        2
		//                   id = ?   pwd = ?  
		String sql = "SELECT * FROM test_member WHERE id = ? AND pwd = ?";
		
		//2) PreparedStatement안에 SQL문을 넣기
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		//3) SQL문의 parameter를 세팅한다.
		pstmt.setString(1, "사용자 아이디");
		pstmt.setString(2, "사용자 비밀번호");
		
		//3. 처리
		ResultSet rs = pstmt.executeQuery();
		
		while (rs.next()) {
			String name = rs.getString("name");
			String id = rs.getString("id");
			String password = rs.getString("pwd");
			
			System.out.printf("[%s]님의 아이디는 %s, 비밀번호는 %s\n",name,id,password);
		}
		
		//4. 닫기
		rs.close();
		pstmt.close();
		conn.close();
		
	}//end main

}

 

 

 

- 출처:

  - SQL인젝션 개념 https://dev-coco.tistory.com/158 [슬기로운 개발생활😃]

  - 캐시에 대한 자세한 내용 https://p829911.tistory.com/11

  - 그 외 ) 국비지원 수업 과정

- 참고 : 여기어때의 해킹 사건 https://show-me-the-money.tistory.com/entry/%EC%97%AC%EA%B8%B0-%EC%96%B4%EB%95%8C-%ED%95%B4%ED%82%B9-%EC%82%AC%EA%B1%B4%EC%9D%84-%ED%8C%8C%ED%97%A4%EC%B9%98%EB%8B%A4