JAVA/SPRING

[MyBatis] #{} 과 ${} 의 차이

오선지♬ 2022. 1. 3. 19:54
728x90
반응형

#{ } 

- 파라미터가 String 형태로 들어와서 '파라미터' 형태가 된다.

          ex) id값이 aaa이면  id = #{id} 가 id='aaa' 로 들어간다. 

- 쿼리 주입을 예방할 수 있어 보안측면에서 유리하다.

${ } 

- 파라미터가 바로 출력된다.

- 해당 컬럼의 자료형에 맞춰 파라미터 자료형도 변경된다.

- 쿼리 주입을 예방할 수 없어 보안측면에서는 불리하다.  그리하여 사용자의 입력을 전달할 때는 사용하지 않는 것이 낫다.

- 테이블이나 컬럼명을 파라미터로 전달하고 싶을 때 사용한다.

 

 

쿼리주입 (SQL Injection)이란?

- 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위. 

- 인젝션 공격은 OWASP Top10 중 첫 번째에 속해 있으며, 공격이 비교적 쉬운 편이고 공격에 성공할 경우 큰 피해를 입힐 수 있는 공격이다.

 

- ${}로 값이 주입 될 때는 데이터 값만이 아니라 적혀진 그대로 주입되기 때문에 보안상 취약하게 된다.

 

예를 들어,

       select * form member where id ='${ id }' and password = '${ password }

라는 쿼리문에 

id=' admin' --' 라는 값이 주입이 되면

       select * form member where id = ' admin' --' and password = '${ password } 로 실행되어

관리자 계정으로 로그인 할 수 있게 된다.

 

 

728x90
반응형