- ํด์ปค์ ์ํด ์กฐ์๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ทธ๋๋ก ์ ๋ฌ๋์ด ๋น์ ์์ ๋ช ๋ น์ ์คํ์ํค๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋งํ๋ค
- ์ธ์ฆ ์ฐํ
๋ณดํต ๋ก๊ทธ์ธ์ ํ ๋, ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ 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๋ฅผ ๋ง์๋๋ก ์กฐ์ํ ์๋ ์๋ค
- ๋ฐ์ดํฐ ๋ ธ์ถ
์์คํ ์์ ๋ฐ์ํ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ด์ฉํด ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ์ด๋ค
๋ณดํต ์๋ฌ๋ ๊ฐ๋ฐ์๊ฐ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ฉด์์ ๋์์ ๋ฐ์ ์ ์๋ ์กด์ฌ์ด๋ค. ํด์ปค๋ค์ ์ด๋ฅผ ์ญ์ด์ฉํด ์ ์์ ์ธ ๊ตฌ๋ฌธ์ ์ฝ์ ํ์ฌ ์๋ฌ๋ฅผ ์ ๋ฐ์ํจ๋ค
์๋ฅผ ๋ค๋ฉด, ํด์ปค๋ GET ๋ฐฉ์์ผ๋ก ๋์ํ๋ URL ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ถ๊ฐํ์ฌ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค
URL ์ฟผ๋ฆฌ ์คํธ๋ง : ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ค์ ํ๋๋ก, url ์ฃผ์์ ๋ฏธ๋ฆฌ ํ์๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ๋๊ธฐ๋ ๊ฒ : http://test.com/login.php?id=abc1234 and password=''
์ด์ ํด๋นํ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ ํตํด ํด๋น ์น์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์ ์ถํ ์ ์๊ณ ํดํน์ ํ์ฉํ๋ค
- input ๊ฐ์ ๋ฐ์ ๋, ํน์ ๋ฌธ์ ์ฌ๋ถ ๊ฒ์ฌํ๊ธฐ
๋ก๊ทธ์ธ ์ ์ ๊ฒ์ฆ ๋ก์ง์ ์ถ๊ฐํ์ฌ ๋ฏธ๋ฆฌ ์ค์ ํ ํน์๋ฌธ์๋ค์ด ๋ค์ด์์๋ ์์ฒญ์ ๋ง์๋ธ๋ค
- SQL ์๋ฒ ์ค๋ฅ ๋ฐ์ ์, ํด๋นํ๋ ์๋ฌ ๋ฉ์์ง ๊ฐ์ถ๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฌ ๋ฐ์ ์ ๋ฐ๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์์๋ค๋ฉด, ์๋ฌ๊ฐ ๋ฐ์ํ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ํจ๊ป ์๋ฌ์ ๊ดํ ๋ด์ฉ์ ๋ฐํํด ์ค๋ค. ์ฌ๊ธฐ์ ํ ์ด๋ธ๋ช , ์ปฌ๋ผ๋ช , ์ฟผ๋ฆฌ๋ฌธ์ด ๋ ธ์ถ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์ค๋ฅ๋ฐ์ ์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ์ ์๋ ํ์ด์ง๋ฅผ ๋ฐ๋ก ์ ์ํ๊ฑฐ๋ ๋ฉ์์ง๋ฐ์ค๋ฅผ ๋์ฐ๋๋ก ํด์ผํ๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ view๋ฅผ ํ์ฉํด ์๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์๋ ์ ๊ทผ ๊ถํ์ ๋์ธ๋ค. ์ผ๋ฐ ์ฌ์ฉ์๋ view๋ก๋ง ์ ๊ทผํ์ฌ ์๋ฌ๋ฅผ ๋ณผ ์ ์๋๋ก ๋ง๋ ๋ค
- prepare statement ์ฌ์ฉํ๊ธฐ
prepare statement๋ฅผ ์ฌ์ฉํ๋ฉด ํน์๋ฌธ์๋ฅผ ์๋์ผ๋ก escaping ํด์ค๋ค
(statement์๋ ๋ค๋ฅด๊ฒ ์ฟผ๋ฆฌ๋ฌธ์์ ์ ๋ฌ์ธ์ ๊ฐ์ ? ๋ก ๋ฐ๋๊ฒ) ์ด๋ฅผ ํ์ฉํด ์๋ฒ์ธก์์ ํํฐ๋ง ๊ณผ์ ์ ํตํด์ ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๋ค. ? ์ ๋ค์ด๊ฐ๋ ๋ฐ์ดํฐ๋ ๋จ์ํ ๋ฌธ์์ด๋ก ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์ SQL ์ธ์ ์ ์ด ๋ฐ์ํ ์ ์๋ค
์กฐ์๋ SQL๋ฌธ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ๋ฌ๋์ด ์๋ชป๋ ์ฒ๋ฆฌ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ ๋ ฅ์ฐฝ์ ๋ค๋ฅธ SQL๋ฌธ์ ๋ฃ๊ฑฐ๋, ํน์ GET๋ฐฉ์์ผ๋ก ๋์ํ๋ URL ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ถ๊ฐํ์ฌ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์ ์ถํ๋ค. ์ด๋ฅผ ๋ง๊ธฐ ์ํด์๋ ์กฐ์๋ SQL๋ฌธ์ ๋ฃ๊ธฐ ์ํ '(ํ๋ฐ์ํ) ;(์ธ๋ฏธ์ฝ๋ก ) --(์ฃผ์) ๊ณต๋ฐฑ ๋ฑ์ ๊ฑธ๋ฌ๋ด๊ฑฐ๋, prepareStatement๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ๋ฌ๋๋ ๊ฐ์ด ๋ฌธ์์ด๋ก๋ง ์ ๋ฌ๋๊ฒ ํ์ฌ SQL ์ธ์ ์ ์ ๋ง์ ์ ์๋ค. ๋ํ ์๋ฒ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง๋ฅผ ๋ณ๋๋ก ์ ์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์ ์ถํ ์ ์๋๋ก ๋ง์์ผ ํ๋ค.