- ํด์ปค์ ์ํด ์กฐ์๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ทธ๋๋ก ์ ๋ฌ๋์ด ๋น์ ์์ ๋ช ๋ น์ ์คํ์ํค๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋งํ๋ค.
1) ์ธ์ฆ ์ฐํ
๋ณดํต ๋ก๊ทธ์ธ์ ํ ๋, ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ input ์ฐฝ์ ์ ๋ ฅํ๋ค.
์๋ฅผ ๋ค์ด, ์์ด๋๊ฐ abc ๋น๋ฐ๋ฒํธ๊ฐ 1234์ผ ๋, ์ฟผ๋ฆฌ๋ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ก๋ ๊ฒ์ด๋ค.
SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";
SQL Injection์ผ๋ก ๊ณต๊ฒฉํ ๋, input ์ฐฝ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํจ๊ณผ ๋์์ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฌธ์ ํจ๊ป ์ ๋ ฅํ๋ ๊ฒ์ด๋ค.
1234; DELETE * FROM USER WHERE ID = "1";
๋ณด์์ด ์๋ฒฝํ์ง ์์ ๊ฒฝ์ฐ, ์ด์ฒ๋ผ ๋น๋ฐ๋ฒํธ๊ฐ ์์ด๋์ ์ผ์นํด์ True๊ฐ ๋๊ณ ๋ค์ ์์ฑํ DELETE๋ฌธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฅ์ ์ค ์๋ ์๊ฒ ๋๋ ์น๋ช ์ ์ธ ์ํฉ์ด๋ค.
์ด ๋ฐ์๋ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฌธ์ WHERE์ ์ OR๋ฌธ์ ์ถ๊ฐํ์ฌ '1' = '1'
๊ณผ ๊ฐ์ true๋ฌธ์ ์์ฑํ์ฌ ๋ฌด์กฐ๊ฑด ์ ์ฉ๋๋๋ก ์์ ํ ๋ค DB๋ฅผ ๋ง์๋๋ก ์กฐ์ํ ์๋ ์๋ค.
2) ๋ฐ์ดํฐ ๋ ธ์ถ
์์คํ ์์ ๋ฐ์ํ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ด์ฉํด ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ณดํต ์๋ฌ๋ ๊ฐ๋ฐ์๊ฐ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ฉด์์ ๋์์ ๋ฐ์ ์ ์๋ ์กด์ฌ์ด๋ค. ํด์ปค๋ค์ ์ด๋ฅผ ์ญ์ด์ฉํด ์ ์์ ์ธ ๊ตฌ๋ฌธ์ ์ฝ์ ํ์ฌ ์๋ฌ๋ฅผ ์ ๋ฐ์ํจ๋ค.
์๋ฅผ ๋ค๋ฉด, ํด์ปค๋ GET ๋ฐฉ์์ผ๋ก ๋์ํ๋ URL ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ถ๊ฐํ์ฌ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
์ด์ ํด๋นํ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ ํตํด ํด๋น ์น์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์ ์ถํ ์ ์๊ณ ํดํน์ ํ์ฉํ๋ค.
1) input ๊ฐ์ ๋ฐ์ ๋, ํน์ ๋ฌธ์ ์ฌ๋ถ ๊ฒ์ฌํ๊ธฐ
๋ก๊ทธ์ธ ์ , ๊ฒ์ฆ ๋ก์ง์ ์ถ๊ฐํ์ฌ ๋ฏธ๋ฆฌ ์ค์ ํ ํน์๋ฌธ์๋ค์ด ๋ค์ด์์ ๋ ์์ฒญ์ ๋ง์๋ธ๋ค.
2) SQL ์๋ฒ ์ค๋ฅ ๋ฐ์ ์, ํด๋นํ๋ ์๋ฌ ๋ฉ์์ง ๊ฐ์ถ๊ธฐ
view๋ฅผ ํ์ฉํด ์๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์๋ ์ ๊ทผ ๊ถํ์ ๋์ธ๋ค. ์ผ๋ฐ ์ฌ์ฉ์๋ view๋ก๋ง ์ ๊ทผํ์ฌ ์๋ฌ๋ฅผ ๋ณผ ์ ์๋๋ก ๋ง๋ ๋ค.
3) prepare statement ์ฌ์ฉํ๊ธฐ
prepare statement๋ฅผ ์ฌ์ฉํ๋ฉด ํน์๋ฌธ์๋ฅผ ์๋์ผ๋ก escaping ํด์ค๋ค.
(statement์๋ ๋ค๋ฅด๊ฒ ์ฟผ๋ฆฌ๋ฌธ์์ ์ ๋ฌ์ธ์ ๊ฐ์ ?๋ก ๋ฐ๋๊ฒ)์ด๋ฅผ ํ์ฉํด ์๋ฒ ์ธก์์ ํํฐ๋ง ๊ณผ์ ์ ํตํด์ ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๋ค.