# Security/WEB, APP Vulnerabilities

SQL injection Prepared Statement 1

Artifex_Ethan_ 2024. 4. 5. 01:19
반응형

Prepared Statement

SQL Injection에 대한 취약점 대응 방안으로 Prepared Statement와 바인딩 변수를 이용하도록 권고하고 있다.
Prepared Statement를 사용하면 SQL injection 취약점을 차단할 수 있는 점이 있다.

[그림 - SELECT문 실행 프로세스]

Statement와 Prepared Statement의 차이 (파싱과 바인딩)
일반적인 Statement를 사용하여 SELECT 쿼리를 입력했을 때에는 매번 parse부터 fetch까지 모든 과정을 수행한다.
Prepared Statement를 사용하는 경우에는 효율을 높이기 위해 parse 과정을 최초 1번만 수행하고 이후에는 생략할 수 있다.
parse과정을 모두 거친 후에 생성된 결과는 메모리 어딘가에 저장 해두고 필요할 때마다 사용한다.
반복적으로 트리를 사용하기 위해서 자주 변경되는 부분을 변수로 선언해 두고, 매번 다른 값을 대입(바인딩)하여 사용한다.

핵심 : 바인딩 데이터는 SQL 문법이 아닌 내부의 인터프리터나 컴파일 언어로 처리하기 때문에 문법적인 의미를 가질 수 없다.
따라서 바인딩 변수에 SQL공격 쿼리를 입력할지라도 의미있는 쿼리로 동작하지 않는다.


Prepared Statement는 다음과 같은 특징을 가지고 있다.

  1. SQL 쿼리를 미리 컴파일하므로 실행 시간 단축.
  2. 변수가 쿼리에 직접 삽입되지 않고, 대신에 Placeholder(플레이스홀더)를 사용하여 SQL Injection을 방지.
  3. 동일한 쿼리를 반복적으로 사용할 때 성능 향상.

Prepared Statement 예제 코드 :

String query = "UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
pstmt.executeUpdate();

이 예제에서는 '?' 플레이스홀더가 사용되었으며, 이는 나중에 pstmt.setBigDecimal() 및 pstmt.setInt() 메소드를 통해 채워진다. 이 방법을 통해, SQL 쿼리 내부에 직접적인 데이터 값이 들어가지 않으므로 SQL Injection 공격을 방지할 수 있다.

  • PreparedStatement는 SQL injection 공격을 방지하는 데 사용된다. 사용자 입력을 매개변수로 전달함으로써 입력 값을 안전하게 처리한다.
  • SQL injection 공격에서는 사용자 입력에 대한 이스케이프나 검증이 제대로 이루어지지 않기 때문에, PreparedStatement를 사용하여 이 문제를 해결할 수 있다.
  • 또한 PreparedStatement를 사용하면 쿼리의 재사용이 가능하며, 이는 성능상의 이점을 제공할 수 있다.
  • SQL injection 공격은 보안 문제를 야기할 수 있으므로, 웹 응용 프로그램 개발에서는 PreparedStatement와 같은 방어 메커니즘을 적용하는 것이 중요하다.

 

반응형