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