1. #{}

#{}사용시 mybatis 가 preparedStatement 를 생성하고, preparedStatement 매개변수 #{?} 값을 안전하게 셋팅하게 한다.

#{param} 값을 'param' 과 같이 ''로 감싸며 치환한다.

SQL injection 과 같은 공격을 방지할 수 있다. 더 빠르고, 안전하다.

 

1
2
3
4
5
SELECT *
FROM user_info
WHERE 1=1
AND id = #{id}    -- #{id} >> 'developyo@tistory.com'
AND pw = #{pw}    -- #{pw} >> '1234'
cs

 

2. ${}

${} 사용시 ${param} 값을 param 과 같이 '' 로 감싸지 않은채 치환한다.

SQL injection 과 같은 공격을 받을 수 있다.

직접적인 값 셋팅(ORDER BY 절의 기준 칼럼을 동적으로 지정하고 싶은 경우 등)이 필요한 경우 사용할 수 있다.

1
2
3
SELECT *
FROM user_info
ORDER BY ${columnName} -- ${columnName} >> join_date
cs

 

 

[ SQL injection 공격의 예 ]

1. #{} 사용

id 파라미터로 developyo@tistory.com

pw 파라미터로 '1' OR 1=1 

1
2
3
4
5
SELECT *
FROM user_info
WHERE 1=1
AND id = 'developyo@tistory.com'
AND pw = ''1' OR 1=1'
cs

: sql Exception 발생

 

2. ${} 사용

id 파라미터로 'developyo@tistory.com'

pw 파라미터로 '1' OR 1=1 

1
2
3
4
5
SELECT *
FROM user_info
WHERE 1=1
AND id = 'developyo@tistory.com'
AND pw = '1' OR 1=1
cs

: 조회 성공

 

※ 만약 ${}을 사용할 경우 SQL injection 공격을 막기위해 이스케이프 처리가 필요하다.

 

참고 : https://stackoverflow.com/questions/39954300/when-to-use-vs

반응형

+ Recent posts