어플리케이션

Static Query, Dynamic Query, PreparedStatement 에 대해 알아보겠습니다.

forward error correction Circle 2022. 12. 1. 20:40
반응형

Static Query, Dynamic Query, PreparedStatement 에 대해 알아보겠습니다.

 

(1) Static Query
Static Query이란, String형 변수에 담지 않고 직접 기술한 SQL문을 말합니다.
다른 말로 `Embedded SQL`이라고도 합니다.

            SELECT insano
            FROM   insa
            WHERE  INSANO = insano;

이런 형식으로 있는 insano의 값을 입력받아 그대로 출력을 합니다.

(2) Dynamic Query
Dynamic Query이란, 컬럼이나 테이블명을 바꿔 SQL쿼리를 실시간 생성해 DB에 전달하여 처리하는 방식 String형 변수에 담아서 기술하는 SQL문을 말합니다. String 변수를 사용하므로 조건에 따라 SQL문을 동적으로 바꾸거나 실행 시에 사용자로부터 SQL문의 일부 또는 전부를 입력 받아서 실행하기 때문에  [PreCompiler] 시 Syntax, Semantics 체크가 불가능 합니다. Dynamic SQL은  [PreCompiler]의 내용을 확인하지 않고 그대로 통과시킵니다.
 Semantic 체크는 DB 접속을 통해 이루어지지만 Syntax 체크만큼은 [PreCompiler]에 내장되 SQL 파서를 이용하는데, 위 구문들을 사용하면 현재 사용 중인 [PreCompiler]가 그것들을 인식하지 못해 에러를 던지는 것입니다.
해결 방법은 Dynamic SQL을 사용하면 됩니다.

 

INSA 라는 데이터 값을 받을 경우 특정 형식화하여 변수를 받습니다.

 

예시는 다음과 같습니다.
   tochar select_INSA[100] = "SELECT INSANO FROM INSA WHERE INSANO = insano"; 

출력은 다음과 같습니다.
  select_INSA 


데이터베이스(DB)와 연동된 웹 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 URL 입력란에 SQL 문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안약점이 있습니다.

 

사용자로부터 입력된 값을 필터링 과정 없이 넘겨받아 동적쿼리 (Dynamic Query)를 생성하기 때문에 개발자가 의도하지 않은 쿼리가 생성되어 정보유출에 악용가능성이 있습니다.

 

악용하는 것을 보안하기 위해서 Prepared Statement 라는 것을 사용합니다.

Prepared Statement는 컴파일된 쿼리 객체를 의미하며, DB에 컴파일된 쿼리문을 전달하는 방법을 사용합니다.
Prepared Statement는 MySQL, Oracle, DB2, 등에서 지원하며, Java의 JDBC, Perl의 DBI, PHP의 PDO, ASP 의 ADO를 이용하여 사용가능합니다.

SQL 삽입 공격을 대응하기 위하여 파라미터를 받는 Prepared Statement 객체를 상수 스트링으로 생성하고
파라미터 부분을 setString, setParameter 등의 메소드로 설정하여, 외부 입력이 쿼리의 구조문을 바꾸는 것을 방지 할 수 있습니다.

반응형