SQL Injection

  • 클라이언트의 입력 값을 조작하여 서버의 데이터베이스를 공격할 수 있는 보안 공격방법
  • 사용자의 입력 데이터를 제대로 필터링 하지 않을 경우 발생
  • ex. 'OR '1' = '1' 으로 아이디와 비밀번호가 올바르지 않아도 로그인
SELECT user FROM user_table WHERE id='admin' AND password=' ' OR '1' = '1';

 

방어 방법

  • 유저에게 받은 값을 바로 SQL에 넘기지 않는다.
  • input 값을 받고, 특수 문자 여부 검사
  • SQL server 오류 발생 시, 에러 메시지 감추기
    • view를 활용하고, 원본 DB 접근 권한 높이기
  • 요즘 사용하는 DB들은 유저 입력이 의도치 않은 동작을 하지 않도록 escape 함수와 prepared statement 제공
    • prepared statement : 변수를 문자열로 바꾸는 것. 특수 문자를 자동으로 escape
    • statement와 다르게 쿼리문의 전달 값을 ?으로 받는다. 서버 측에서 필터링 후 공격 방어

 

prepared statement 

  • 준비(prepare) : 먼저 애플리케이션에서 문의 틀을 만들고, DBMS에 보낸다.
    • 특정 값은 지정하지 않은 채로 남겨지고, 이 값들을 '변수', '플레이스홀더', '바인드 값'으로 부른다.
  • 그 후에 DBMS에서 문의 틀을 컴파일 하고, 결과만 저장한다.
  • 실행(Excute) : 나중에 애플리케이션에서 바인드 값을 지정하면, DBMS은 결과를 반환할 수도 있는 문을 실행한다. 
INSERT INTO product (name, price) VALUES (?, ?);

 

Java JDBC 예시

import java.sql.PreparedStatement;

PreparedStatement pstmt;
String sql = "INSERT INTO usertbl VALUES (?, ?)";
pstmt = con.prepareStatement(sql);

pstmt.setString(1, 'userId123'); // userId
pstmt.setInt(2, 010-1234-5678) // phoneNum
pstmt.executeUpdate();

+ Recent posts