SQL injection (+ Mybatis 방어)

SQL INJECTION

 

SQL Injection 이란,

  • SQL Injection 은 웹 애플리케이션에서 데이터의 유효성 검증을 하지 않아, 개발자가 의도하지 않은 동적 쿼리(Dynamic Query)를 생성하여  조작된 SQL문으로 DB 정보를 열람하거나 변경할 수 있는 보안 취약점입니다.
  • 예시
    • SELECT * FROM userInfo Where userID = '${userID}' and userPW = '${userPW}' 라는 쿼리가 있다
    • 정보를 빼내려는 유저가 pw' or 1=1 limit 1-- 를 비밀번호로 입력하면
    • 쿼리가 SELECT * FROM userInfo Where userID = 'admin' and userPW = 'pw' or 1=1 limit 1--' 이며
    • 잘못된 결과가 실행된다
    • 마지막에 '는 주석 처리되며, 1=1이 absolutely true로 만들어 주기 때문이다.
    • 홈페이지 쿼리에 따라 SQL Injection으로 충분히 해킹될 가능성이 있다!!

 


 

Spring framework에서 mybatis를 사용하고 있을 경우 방어하기!

 

  • Mybatis에서는 #{} 또는 ${} 두 가지 형식으로 파라미터를 받는다.
  • #{} : 내부적으로 PreparedStatement를 사용하기 때문에 sql injection 공격에 안전하다. 쿼리와 입력값 분리한다 (문자열 형태로 들어와서 파라미터 형태가 됨)
  • ( PreparedStatement : 값을 바인딩하는 시점에서 전달된 특수문자 쿼리 등을 필터링하여 sql injection을 막는다.)
  • ${} : 파라미터가 바로 출력된다 > SQL Injection 공격에 취약

 

>>> ${} 대신 #{}로 파라미터를 받는 것이 안전!

 

 

 

 

참고 사이트

https://sas-study.tistory.com/96

http://blog.plura.io/?p=6056 

 

'WEB > DB' 카테고리의 다른 글

MariaDB 설치 + workbench 연결 for MAC  (0) 2022.03.26
Mysql 서버 타임존 변경하기  (2) 2021.02.16