Mybatis #{} vs ${}
Spring์์ JDBC๋ฅผ ์ฌ์ฉํ์ฌ DB์ ์ฐ๋ํ๋ ๊ฒ์ผ๋ก MyBatis๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
์ฐ์ Mybatis์์ resultType, parameterType์ผ๋ก ์ฌ์ฉํ ์ ์๋ type ๋ช ๋ถํฐ ์์๋ณด์.
์ด๋ VO๋ DTO๋ฅผ ๋งค๊ฐ๋ณ์๋ก ํ์ฌ๊ธ ๋ฐ์ดํฐ์ ์ด๋์ ํ๊ฒ ํ๋๋ฐ, ๊ทธ ๊ธฐ๋ฅ์ผ๋ก $์ #๋ฌธ๋ฒ์ด ์๋ค.
์ฆ, VO์ name์ด๋ผ๋ ๋ณ์๊ฐ ์๊ณ getter๊ฐ getName()์ด๋ผ๋ ๋ฉ์๋๋ก ๋์ด ์์๋, #{name}์ ํ๊ฑฐ๋ ${name}์ ํ๊ฒ๋๋ฉด VO์์๋ name๊ฐ์ด MyBatis์ XML์ ํ์ฑ๋ ๋ getNameํ ๊ฐ์ด ์ค๊ฒ ๋๋ค.
#{ }
- Parameter๊ฐ String ํํ๋ก ๋ค์ด์ ์๋์ ์ผ๋ก โParameterโ ํํ๊ฐ ๋๋ค.
- ์๋ฅผ๋ค์ด, VO์ ๋ด๊ธด myid๊ฐ์ด getter๋ก ๋ฐํ๋ ๋, myid๊ฐ์ด 123์ด๋ผ๋ฉด mybatis ์ฟผ๋ฆฌ์๋ userid=โ123โ์ ํํ๊ฐ ๋๋ค.
- SQL Injection์ ์๋ฐฉํ ์ ์์ด ๋ณด์์ธก๋ฉด์์ ์ ๋ฆฌํ๋ค.
${ }
-
Parameter๊ฐ ๋ฐ๋ก ์ถ๋ ฅ๋๋ค.
-
์๋ฅผ ๋ค์ด, VO์ ๋ด๊ธด myid๊ฐ์ด getter๋ก ๋ฐํ๋ ๋, myid๊ฐ์ด 123์ด๋ผ๋ฉด mybatis ์ฟผ๋ฆฌ์๋ userid=123์ ํํ๊ฐ ๋๋ค.
-
SQL Injection์ ์๋ฐฉํ ์ ์์ด ๋ณด์์ธก๋ฉด์์ ๋ถ๋ฆฌํ๋ค.
SQL injection
SQL์ธ์ ์ ์ ์์ฉ ํ๋ก๊ทธ๋จ ๋ณด์ ์์ ํ์ ์ ์๋์ ์ผ๋ก ์ด์ฉํด, ์ ์์ ์ธ SQL๋ฌธ์ ์คํ๋๊ฒ ํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋น์ ์์ ์ผ๋ก ์กฐ์ํ๋ ์ฝ๋ ์ธ์ ์ ๊ณต๊ฒฉ๋ฐฉ๋ฒ์ด๋ค. ${}๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฃผ๋ก ๋ฐ์ํ ์ ์๋ ๊ฐ์ฅ ํฐ ํ์ ์ด์์ผ๋ฉฐ ์ด๋ฅผ ๋ง๊ธฐ์ํด ๋๋ถ๋ถ #{} ๋ฌธ๋ฒ์ ์ฌ์ฉํจ์ผ๋ก์จ ๋์ฒํ๋ค.
SQL Injection Example
์ฌ์ฉ์๊ฐ ID์ PASSWORD๋ฅผ ์ ๋ ฅํ๋ ์ํฉ์ผ ๊ฒฝ์ฐ Mabatis์ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ๊ฐ ์๋ค๊ณ ํ ๋,
select * from UserInfo where id = '${id}' and password = '${password }'
์ ์์ ์ธ ์ ์ ๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ [passwordโ OR 1=1 limit 1โ] ๋ผ๊ณ ์ ๋ ฅํ๊ฒ ๋๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฌธ์ด ์์ฑ๋ ๊ฒ์ด๋ค.
select * from tblUserInfo where id = 'admin' and password = 'password' OR 1=1 limit 1-- '
๋ง์ฝ, ํจ์ค์๋ ๋ฐ์ดํฐ๊ฐ ์ํธํ๊ฐ ๋์ด์์ง ์๋ค๋ฉด, ํฐ ๋ฌธ์ ๋ก ์ด์ด์ง๊ฒ ๋๋ค.
์ฑ๊ธ์ฟผํ ์ด์ (โ)์ผ๋ก ๊ฐ์ธ๋ ๋์ ์๋ ์ฑ๊ธ์ฟผํ ์ด์ 1๊ฐ๊ฐ โ ์ฃผ์์ฒ๋ฆฌ๋๊ณ 1=1์ด๋ผ๋ ์กฐ๊ฑด์ด absolutely true๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ํํ์ด์ง์ ์์ฑ๋ ์ฟผ๋ฆฌ์ ๋ฐ๋ผ sql Injection์ผ๋ก ์ถฉ๋ถํ ํดํน์ด ๊ฐ๋ฅํ ์ ์๋ค.
๋ฐ๋ผ์ ๋๋๋ก #{}์ ์ฌ์ฉํ๋๋ก ํ์.
Leave a comment