SQL Injection
악의적인 SQL 코드가 DB Query 에 삽입되어 논리가 변경되고
이에 따라 민감한 정보가 추출되거나 데이터가 수정 및 삭제가 되는 상황
SQL Injection 예시
input: ' OR '1'='1
original query: SELECT * FROM users WHERE username = 'value' AND password = 'value';
injected query: SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'value';
공격자는 ' OR '1' = '1' 구문을 사용하여 원래의 조건과
별개로 항상 참인 조건('1' = '1' 은 항상 참인 조건)을 추가했으므로
원래 Query 의 목적인 사용자 이름과 비밀번호 검증은 무의미해지고
WHERE 조건이 항상 참인 Query 로 변질되어 악의적인 사용이 가능해집니다
해당 공격 방식은 로그인과 같은 보안 인증 절차를
우회하여 무단으로 시스템에 접근할 수도 있고
항상 참인 조건을 통해 DB 의 민감한 정보가 노출될 우려가 있습니다
SQL Injection 방지하기
에러 메세지 관리
SQL 오류 메세지를 사용자에게 직접 노출하지 않고
일반적인 오류 메세지를 제공하여
DB 구조에 대한 정보가 노출되지 않도록 관리
Prepared Statement
사용자 입력값이 쿼리의 문자열 리터럴로
직접 포함되지 않도록 설계
(PreparedStatement 에 대한 설명 보러 가기)
보안이 강화된 프레임워크 사용
SQL Injection 방지 기능을 내장한 프레임워크를
사용하여 SQL Query 를 자동 생성하고
내부적으로 파라미터 바인딩과 이스케이프 처리 수행
(ex: Spring Data JPA, Hibernate ORM, Django ORM)
※ 하지만 여전히 보안 관행을 이해하고 적용해야 하고
주의 깊게 데이터 입력과 생성을 관리해야 한다
입력값 검증 및 이스케이프 처리
허용된 문자나 패턴만을 사용하는
화이트리스트 방식으로 입력값을 검증하거나
SQL Query 에 영향을 미칠 수 있는 특수 문자를
이스케이프 처리하여 SQL Injection 에 대비
ETC
악의적인 트래픽을 감지하고 차단하는
웹 어플리케이션 방화벽(WAF)을 사용
어플리케이션의 취약점을 주기적으로 검토하고
보안 위험을 줄이기 위한 코드 리뷰를 실시
'Computing and DB 🖥 > Database' 카테고리의 다른 글
[JDBC] - PreparedStatement (0) | 2024.01.31 |
---|---|
DB LOCK 에 대해서 알아보자 (0) | 2024.01.23 |
NoSql 이 뭐야? (0) | 2023.12.12 |
대용량을 대비한 DB... 어떻게 설정해? (feat.PostgreSQL) (33) | 2023.11.14 |