정보보안, DB - SQL Injection

2024. 11. 12. 16:45·TOPCIT
728x90

💁‍♀️Prepared Statement

일반적인 Statement 사용 시 SQL Injection 공격에 취약

원인 : 매번 parse부터 fetch까지 모든 과정을 수행하기 때문이다

만약 SQL Injection 공격을 가하는 경우, 수정된 쿼리(공격)를 parse

SQL Injection 공격

웹 어플리케이션에서 입력값에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 파라미터에 쿼리문을 조작하여 정보를 열람하거나 데이터를 조작하는 해킹 기술

select문 실행 과정

Prepared Statement를 사용하는 경우 효율을 높이기 위하여 parse 과정을 최초 1번만 수행하고 이후에는 생략이 가능하다

최초 parse를 통한 결과 parse tree를 메모리 상에 저장해두고 필요할 때마다 사용한다

반복적으로 트리를 사용하기 위해 자주 변경되는 부분을 변수로 선언 해두고, 매번 다른 값을 대입(바인딩) 하여 사용한다

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

Prepared Statement 사용의 이점

SQL Injection 공격을 피할 수 있다.

바인딩 변수를 제외한 공통 부분을 반복적으로 실행할 시, parse 실행시간을 절약할 수 있다.

(파싱이 많아질 경우 CPU 점유율이 높아진다.)

가독성이 높아진다.

Prepared Statement 예시

// 일반적인 Statment
Class B {
(~~중략~~)
    try {
        String tableName = props.getProperty("jdbc.tableName");
        String name = props.getProperty("jdbc.name");
        String query = "SELECT * FROM" + tableName + "WHERE Name = " + name;
        //문제가 되는 부분으로 SQL Injection 공격에 취약하다
        stmt = con.prepareStatement(query);
        // prepareStatement() 메소드를 사용했지만, 그냥 statement와 다를 바 없다
        rs = stmt.executeQuery();
    }
    catch (SQLException sqle) {
    }
}
// Prepared Statement

Class B {
(~~중략~~)
    try {
        String tableName = props.getProperty("jdbc.tableName");
        String name = props.getProperty("jdbc.name");
        String query = "SELECT * FROM ? WHERE Name = ?";
        stmt = con.prepareStatement(query);
        stmt.setString(1, tableName);
        stmt.setString(2, name);
        // 바인딩 변수 부분을 ?로 둔다.
    // 그리고 바인딩 변수를 stmt.setString()을 통해 지정해준다.
    // stmt.setString(바인딩 변수 인덱스, 값);
        // 바인딩변수 인덱스는 1번부터 시작한다.
        rs = stmt.executeQuery();
    }
    catch (SQLException sqle) {
    }
}
728x90

'TOPCIT' 카테고리의 다른 글

SW공학 - 소프트웨어 3R  (0) 2024.11.12
SW공학 - 코드 리팩토링과 클린코드  (1) 2024.11.12
DB - VIEW, DCL  (0) 2024.11.12
클라우드 컴퓨팅 - 배치 모델과 서비스 모델  (0) 2024.11.05
OS - CPU 스케줄링  (0) 2024.11.05
'TOPCIT' 카테고리의 다른 글
  • SW공학 - 소프트웨어 3R
  • SW공학 - 코드 리팩토링과 클린코드
  • DB - VIEW, DCL
  • 클라우드 컴퓨팅 - 배치 모델과 서비스 모델
suhsein
suhsein
티끌모아 태산
  • suhsein
    기억 못 할 거면 기록이라는 좋은 수단이 있다
    suhsein
  • 전체
    오늘
    어제
    • 분류 전체보기
      • ASAC
      • Next.js
      • Docker
      • MySQL
      • Java
      • Spring-Proxy, AOP
      • Spring Boot, JPA
      • Spring Security
      • DB
      • 알고리즘
      • PS
      • TOPCIT
      • AWS 자격증
      • 비공개
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 안녕하세요
  • 인기 글

  • 태그

    오블완
    Alias
    포인터
    해시
    티스토리챌린지
    동적프로그래밍
    DP
    tsp
    외판원순회
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
suhsein
정보보안, DB - SQL Injection
상단으로

티스토리툴바