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 방어 가능 !_!
'Development > JDBC' 카테고리의 다른 글
| [JDBC] DAO / PreparedStatement 활용 (0) | 2021.10.15 |
|---|---|
| [Java/JDBC] Singleton Pattern (0) | 2021.10.14 |
| [JDBC] ResultSet / Statement 활용 (0) | 2021.10.12 |
| [JDBC] JDBC 작업 순서 / 쿼리문 생성객체 / bind 변수 (0) | 2021.10.11 |
| [JDBC] JDBC / driver 종류 / java.sql package (0) | 2021.10.05 |