티스토리 뷰

The Statement Objects


- Use the for general-purpose access to your database. Useful when you are using static SQL statements at runtime. The Statement interface cannot accept parameters.

- 쿼리문을 처리하기 전에 이미 Statement가 결정되어 있음

- SQL Injection 공격이 가능하기 때문에 오라클 내에서 권장하지 않는 표기 법이다.

- 쿼리문이 정적으로 준비된 상태.


다음과 같은 sql 문장이 있다.


String sql = String.format("SELECT mid, name_, phone, email, 
                                   TO_CHAR(regDate, 'YYYY-MM-DD') \"regDate\" "
                    + "FROM members\r\n"
                    + "WHERE mid='%s'", m);
외부에서 정상적인 자료가 제공된 경우에는


String m = "M02";

와 같은 형태가 들어간다.


그러나 악의적인 사용자가 다음과 같이 비정상적인 자료를 제공 할 수 있다.


String m = "M02' OR 'x' = 'x";
위와 같이 정보가 들어갈 경우 sql문은 최종적으로


SELECT mid, name_, phone, email, TO_CHAR(regDate, 'YYYY-MM-DD') \"regDate\" "
                    + "FROM members\r\n"
                    + "WHERE mid='M02' OR 'x' = 'x';
다음과 같은 형태로 들어가게 된다.

OR 뒤의 'x' = 'x'의 구문은 항상 참을 만족하게 된다.

즉  관리자가 의도하지 않은 SELECT문의 결과를 악의적인 사용자는 얻을 수가 있다.


SQL Injection을 방지하기 위해서 PreparedStatement를 사용하게 된다.


The PreparedStatement 


- Use the when you plan to use the SQL statements many times. The PreparedStatement interface accepts input parameters at runtime.

- 쿼리문이 동적으로 준비된 상태.

- 쿼리가 사전에 컴파일 되어 있는 상태이고 필요한 데이터 자료만 매개변수를 통해서 전달을 함.

- SQL Injection 공격을 방지할 수 있고 보안적인 측면에서 더 좋은 방법이다.

PreparedStatement는 Statement문에 대한 처리를 전처리로 진행하게 된다.

PreparedStatement pstmt = null;
사전 준비시 Statement가 아닌 PreparedStatement Interface를 준비한다.

String sql = "SELECT mid, name_, phone, email, TO_CHAR(regDate, 'YYYY-MM-DD') \"regDate\" "
                    + "FROM members\r\n"
                    + "WHERE mid=?";
구문을 삽입할 때 데이터바인딩 문자열인 '?'를 사용한다.

pstmt = conn.prepareStatement(sql);
쿼리문을 진행하기 전에 Oracle 측에서 쿼리문의 형태를 분석하는 전처리 작업을 진행한다.

pstmt.setString(1, m);
데이터 바인딩 문자열에 매핑할 자료를 setXXX() 메소드로 넘겨준다.

이때, 첫번째 인자는 데이터 바인딩 문자열 순서('?'의 순서), 두번째 인자는 들어갈 데이터가 된다.

ResultSet rs = pstmt.executeQuery();

이후 executeQuery() 메소드를 이용해 쿼리를 실행하면 된다.

Statement로 처리할때와 다르게 executeQuery 값에 sql 문이 삽입되어 있지 않다.

'IT 공부 in 교육센터 > JDBC_개념정리' 카테고리의 다른 글

Oracle Database와 Java 연동 방법  (0) 2018.09.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함