[mybatis][간단] 문자열이 아닌 값을 파라미터로 처리하고 싶다면

cateto·2020년 12월 29일
0

1. 파라미터

 #{value} 

기본적으로 문자열 형식이기 때문에 자동으로 따옴표가 붙게 된다.

SELECT * FROM DEPT WHERE NAME="홍길동"

2. 문자열 대체

${value}

문자열 형식이 아니기 때문에 컬럼의 값이나 문법에 사용되는 sql 곳곳에 사용할 수 있다.

SELECT FROM DEPT WHERE #{NAME} = "홍길동" (X) : NAME이 문자열로 인식되어 값은 False고 검색이 안됨.
SELECT
FROM DEPT WHERE ${NAME}="홍길동" (O) : NAME이 컬럼명으로 인식되어 검색가능.

출처 : https://sourcestudy.tistory.com/470

[2021.01.07 수정 + 중요]

#{value} 는 preparedStatement로 Sql injection을 방지할 수 있으나, ${value}는 Sql injection에 방지할 수 없는 취약점이 발견되었으므로... order by와 같은 절에서만 사용하는 게 좋을 것 같다. 어쩔 수 없이 ${value}를 사용해야하는 경우... SQL injection 처리와 특수문자열 이스케이프 처리를 따로 해주어야 한다.
참고 : sql injection 방지 라이브러리(maven)

발생한 사례 :

AND writer LIKE '%${sname}%'

여기서 ${sname}의 값으로
작은따옴표(')나,
mybatis 파라미터 형식(#{}) 이 대입됬을때
escape가 필요했음!!!

profile
Curious for Everything

0개의 댓글