1. SQLException 

- Connection Class에서 쿼리문 객체를 생성하면 SQLException 발생

- 클래스에서 쿼리문 실행 method 작성 시 연결을 반드시 끊기 위해 try~finally로 작성

     Ex)  Connection con = null; Statement stmt = null;

             try { connection 연결 ~ 쿼리문 생성 객체 얻기~ 쿼리문 수행 후 결과얻기~ }

             finally { conncetion 및 쿼리문 객체 연결 끊기}

-  SQLException은 getErrorCode() 존재 : DB에서 발생한 error code를 확인할 수 있음

     > 반환형 int  

        1 : PK 제약

        1438 : 정수 컬럼의 설정된 길이보다 큰 값이 입력된 경우

        12899 : 문자열 컬럼의 설정된 길이보다 큰 값이 입력된 경우

 

 

 2.SQLInjection 

- Web에서 DBMS의 정보를 탈취하기 위해 가장 많이 발생하는 공격

- 프로그램 외부에서 쿼리문을 예상하여, 나머지 쿼리문을 작성하여 입력하는 방법

- 방어 방법) PreparedStatement를 사용 / injection block code 작성

- Statement 사용시 발생 / PreparedStatement 사용하면 발생 X

   Ex) login창에서 id와 password를 입력받아서 인증을 진행하는 경우

   > Statement 사용시, JTextArea로 사용자로부터 값을 입력받을 때 ' or 1=1 -- 로그인 창에서 id에 id대신 이것을 입력하면

       항상 참이 되어 첫번째 사람 정보로 로그인 됨

   > SQLInjection 발생

   > 따라서, Injection 방어 코드를 아래와 같이 만들어서 쿼리 실행문에 적용해야 함

- PreparedStatement를 사용하면 방어 코드 필요 없음!!

 

 

# 방어코드 작성 예시 #

	/**
	 * SQLInjection 방어하기<br>
	 * 입려값에 공백, 주석, ', 쿼리문이 입력되면 해당 데이터를 삭제함
	 * @return
	 */
	public String blockInjection(String value) {
		//' or 1=1 --  : 로그인 창에서 id에 id대신 이것을 입력하면 항상 참이 되어 첫번째 사람 정보로 로그인 됨 
		//>> SQLInjection 발생!
		return value.replaceAll(" ", "").replaceAll("--", "").replaceAll("'", ""); 
        // --대신 -해도 됨
		
	}//blockInjection

 

# 방어코드 적용 예시 #

 // 쿼리문 생성 객체 작성시
			StringBuilder selectName = new StringBuilder();
			selectName
			.append("	select	name ")
			.append("	from 	test_login	")
			.append("	where	id='").append(blockInjection(loginVO.getId())).append("' and pass='")
			.append(loginVO.getPass()).append("'");

 

이렇게 적용하면 Statement 도 SQL Injection 방어 가능 !_!

+ Recent posts