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();
'CS > 데이터베이스' 카테고리의 다른 글
[데이터베이스] Redis, 캐싱(Caching) - 로컬 캐시, 글로벌 캐시 (0) | 2022.09.30 |
---|---|
[데이터베이스] JOIN, UNION (1) | 2022.09.30 |
[데이터베이스] KEY - 후보키, 외래키, 기본키, 슈퍼키, 대리키 (1) | 2022.09.30 |
[데이터베이스] SQL vs NoSQL (1) | 2022.09.30 |
[데이터베이스] 트랜잭션(Transaction) - lock, ACID, 교착상태 (1) | 2022.09.30 |