매일처럼 j2kb 동아리에서 spring 서브젝트를 진행하고 있었다. 내 발표 때 내가 만들고 있는 spring 게시판을 보여주었다. 보여준 상세한 기능은 select * from ${table} 을 수행한 결과인데, 한 현직자분께서 ${}가 아닌 #{}를 쓰는 것이 sql injection을 방지할 수 있으니 #{}로 수정해서 해볼 것을 추천해주셨다.
처음에는 단순히 쿼리문이 적혀있는 .xml파일의 쿼리에서 ${table명}을 #{table명}로 바꾸었는데 자꾸만 에러가 발생하였다. 그 이유는 첫번째로 내가 mySQL상의 값의 이름과 프로젝트 내에서의 이름을 구분하려 mybatis-config.xml파일을 만들었다는 것이었다. 그래서 이 파일은 사용하지 않아주도록 하였다. 두번째 이유는 table명
에 접근하는데 #{}을 사용했다는 것이다. ${}와 #{}의 차이는 아래에서 알아보자.
mybatis 의
${...} : 치환
#{...} : 대입(parepared statmant)
치환에 대해 이해하셨다면 언급하신 sql injection 에 대해 왜 취약한지 이해할 수 있을 것 같다.
#{}는 ''가 씌워진 형태가 반환되고,
${}는 ''가 씌워지지 않은 형태가 반환된다.
대개
#는 값에 사용한다.
$는 컬럼명이나 테이블 명에 사용한다.
참고
https://grandma-coding.tistory.com/entry/MyBatis-%EC%99%80-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
테이블 명이 test_board인 경우,
<select id="selectPosts" resultType="Board">
SELECT * FROM test_board
</select>
<select id="selectPosts" resultType="Board">
SELECT * FROM ${test_board}
</select>
<select id="selectPosts" resultType="Board">
SELECT * FROM #{test_board}
</select>