์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
xkcd 327ํ 'Exploits of a Mom'
์์ ๋งํ์ ๋ํด ์ค๋ช ํ์๋ฉด, ์ ํ๊ต์์ ์ ๋ ฅํ ๋ช ๋ น์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
INSERT INTO students (์ด๋ฆ) VALUES ('ํ์ ์ด๋ฆ');
์ฌ๊ธฐ์ "Robert'); DROP TABLE students;--"ํ์์ "ํ์ ์ด๋ฆ" ์๋ฆฌ์ ๋ฃ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น๋ฌธ์ด ๋๋ค.
INSERT INTO students (์ด๋ฆ) VALUES ('Robert');
DROP TABLE students;
--');
์ฒซ ๋ฒ์งธ ์ค์์๋ Robert๋ผ๋ ํ์์ด ์
๋ ฅ๋์์ง๋ง, ๋ ๋ฒ์งธ ์ค์์ ํ์๋ค์ ๋ฐ์ดํฐ๊ฐ ์๋ ํ
์ด๋ธ์ ์ ๊ฑฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ ๋ฒ์งธ์์๋ ๋ค์ ์ค๋ ๋ด์ฉ์ ๋ชจ๋ ์ฃผ์ ์ฒ๋ฆฌํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก โ๋ชจ๋ ํ์ ๊ธฐ๋ก์ ์ญ์ ํ๋ค.โ๋ผ๋ ๋ป์ ๋ช
๋ น๋ฌธ์ด ์์ฑ๋๋ค.
1. ๊ฐ์[ํธ์ง]
SQL ์ธ์ ์
(SQL ์ฝ์
, SQL ์ฃผ์
์ผ๋ก๋ ๋ถ๋ฆฐ๋ค)์ ์ฝ๋ ์ธ์ ์
์ ํ ๊ธฐ๋ฒ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์
๋ ฅ๊ฐ์ ์กฐ์ํ์ฌ ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ณต๊ฒฉํ ์ ์๋ ๊ณต๊ฒฉ๋ฐฉ์์ ๋งํ๋ค. ์ฃผ๋ก ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ์ ๋๋ก ํํฐ๋ง, ์ด์ค์ผ์ดํํ์ง ๋ชปํ์ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค. ๊ณต๊ฒฉ์ ์ฌ์ด ๋์ด๋์ ๋นํด ํ๊ดด๋ ฅ์ด ์ด๋ง์ด๋งํ๊ธฐ ๋๋ฌธ์ ์ํ์ด ์ฝ๋ฉ์ ํ๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ฐฐ์ฐ๊ฒ ๋๋ ๋ด์ฉ์ด๋ค. ์ด๋ฌํ injection ๊ณ์ด์ ์ทจ์ฝ์ ๋ค์ ํ
์คํธ๋ฅผ ํตํด ๋ฐ๊ฒฌํ๊ธฐ๋ ํ๋ค์ง๋ง ์ค์บ๋ํด์ด๋ ์ฝ๋ ๊ฒ์ฆ์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ฉด ๋ณดํต ์ฝ๊ฒ ๋ฐ๊ฒฌ๋๊ธฐ ๋๋ฌธ์ ํ์งํ๊ธฐ๋ ์ฌ์ด ํธ์ด๋ค. ๋ณด์ํ์ฌ Imperva๊ฐ 2012๋
์ ๋ฐํํ ๋ณด๊ณ ์์ ๋ฐ๋ฅด๋ฉด ์ํ๊ท 4ํ๊ฐ๋์ SQL ์ธ์ ์
๊ณต๊ฒฉ์ด ์ผ์ด๋๋ค๊ณ ํ๋ค. OWASP์์๋ ์๋
๋์ ์ธ์ ์
๊ธฐ๋ฒ์ด ๋ณด์ ์ํ 1์์๋ก ๋ถ๋ฅ๋๋ ๋งํผ ๋ณด์์ ๊ฐ๋ณํ ์ฃผ์๊ฐ ํ์ํ๋ค.
๋๋ฌด๋๋ ์ ์๋ ค์ง ์ทจ์ฝ์ ๊ณต๊ฒฉ์ด๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์๋ฒ๋ SQL ์ธ์ ์ ์ ๋ํ ๋ฐฉ์ด๊ฐ ๋์ด์๋ค. ๊ดํ ์ํ๊ณณ์์ ์ด ๊ณต๊ฒฉ์ ์๋ํ์ง ๋ง์. ๊ณต๊ฒฉ์ด ๋จนํ์ง๋ ์๊ณ ๋ณธ์ธ์ IP๋ ์ฐจ๋จ๋ ๊ฒ์ด๋ฉฐ ์ค๋ น ๋จนํ๋ค ํด๋ ๋ฒ๋ฅ ์ ๋ฐ๋ผ ์ฒ๋ฒ๋ฐ๋๋ค.
๋๋ฌด๋๋ ์ ์๋ ค์ง ์ทจ์ฝ์ ๊ณต๊ฒฉ์ด๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์๋ฒ๋ SQL ์ธ์ ์ ์ ๋ํ ๋ฐฉ์ด๊ฐ ๋์ด์๋ค. ๊ดํ ์ํ๊ณณ์์ ์ด ๊ณต๊ฒฉ์ ์๋ํ์ง ๋ง์. ๊ณต๊ฒฉ์ด ๋จนํ์ง๋ ์๊ณ ๋ณธ์ธ์ IP๋ ์ฐจ๋จ๋ ๊ฒ์ด๋ฉฐ ์ค๋ น ๋จนํ๋ค ํด๋ ๋ฒ๋ฅ ์ ๋ฐ๋ผ ์ฒ๋ฒ๋ฐ๋๋ค.
2. ๊ณต๊ฒฉ ๋ฐฉ๋ฒ[ํธ์ง]
2.1. ๋ฐฉ๋ฒ 1[ํธ์ง]
๋ก๊ทธ์ธ ํผ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ฉด ์
๋ ฅํ ๊ฐ์ด ์๋ฒ๋ก ๋์ด๊ฐ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ์ฌ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๊ฒ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ์กฐํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ธ์ด๋ฅผ SQL์ด๋ผ๊ณ ํ๋ฉฐ, SQL๋ฌธ์ด ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋์๋ค๊ณ ๊ฐ์ ํ์.
SELECT user FROM user_table WHERE id='์ ๋ ฅํ ์์ด๋' AND password='์ ๋ ฅํ ๋น๋ฐ๋ฒํธ';
์ฌ๊ธฐ์๋ ํจ์ค์๋๋ฅผ ํ๋ฌธ์ผ๋ก ๋น๊ตํ๋๋ฐ ์ฌ์ค ์ด๋ ์์ ๋ฅผ ๊ฐ๋จํ ํ๊ธฐ ์ํ ๊ฑฐ๊ณ , ํ ์คํธ๊ฐ ์๋ ์ผ๋ฐ ์ฌ์ดํธ์์ ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ธ์ ๋ณด๋ณดํธ๋ฒ 29์กฐ ์๋ฐ[2]์ผ๋ก ๊ณผํ๋ฃ ํญํ์ ๋ง์ ์ ์๋ค. ํจ์ค์๋๋ ๋ฐ๋์ PBKDF2 ์ด์์ ๋ณด์์ฑ์ ๊ฐ์ง๋ ํด์ ํจ์๋ก ํด์ฑํด์ผ ํ๋ค. ๋๋ถ๋ถ SHA๋ฅผ ์ด๋ค.
์ผ๋ฐ์ ์ธ ์ ์ ๋ผ๋ฉด ์ด๋ ๊ฒ ๋ก๊ทธ์ธํ ๊ฒ์ด๋ค.
์์ด๋: | |
๋น๋ฐ๋ฒํธ: | ๋๋ฌด |
SELECT user FROM user_table WHERE id='์ธํผ๋กํธ' AND password='๋๋ฌด';
๊ทธ๋ฆฌ๊ณ SQL injection์ ์๋ํ๋ ค๋ ๊ณต๊ฒฉ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํ๋ค.
์์ด๋: | |
๋น๋ฐ๋ฒํธ: | ' OR '1' = '1 |
SELECT user FROM user_table WHERE id='admin' AND password=' ' OR '1' = '1';
๋น๋ฐ๋ฒํธ ์
๋ ฅ๊ฐ๊ณผ ๋ง์ง๋ง ๊ตฌ๋ฌธ์ ์์ธํ ์ดํด๋ณด์. ๋ฐ์ดํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ซ์ผ๋ฉฐ password=' '๋ฅผ ๋ง๋ฆ๊ณผ ๋์์ SQL ๊ตฌ๋ฌธ ๋ค์ ' OR '1' = '1'์ ๋ถ์๋ค. WHERE ๋ค์ ์๋ ๊ตฌ๋ฌธ์ ๊ฐ๋จํ ์ถ์ฝํ๋ฉด false AND false OR true๋ก ์ ๋ฆฌํ ์ ์๋๋ฐ, ๋
ผ๋ฆฌํ์ ๋ฐ๋ฅด๋ฉด AND ์ฐ์ฐ์ OR๋ณด๋ค ์ฐ์ฐ ์ฐ์ ์์๊ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ํด๋น ๊ตฌ๋ฌธ์ ์ฐ์ฐ ๊ฐ์ true๊ฐ ๋์ด ์ฌ๋ฐ๋ฅธ ๊ฐ์ผ๋ก ํ๋จํ๊ณ ์คํํ๊ฒ ๋๋ค. ์ฆ, ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ชฐ๋ผ๋ ' OR '1' = '1 ๊ตฌ๋ฌธ ๋๋ฌธ์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
login admin.asp๋ผ๊ณ ๋๋๊ณ ์ ์ณ์ ๋์ค๋ ์น์ฌ์ดํธ ์๋ฌด๋ฐ๋ 1'or'1'='1์ ๋ฃ์ผ๋ฉด ์๋์ด ๋๋ ์ฌ์ดํธ์ธ ๊ฒฝ์ฐ ์๋์ด ๋๋ค!
๋ก๊ทธ์ธ๋ฟ๋ง ์๋๋ผ JOIN์ด๋ UNION ๊ฐ์ ๊ตฌ๋ฌธ์ ํตํด ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ์ฝ๋๋ฅผ ์คํํ ์๋ ์๋ค.
MySQL ๊ธฐ์ค์ผ๋ก SQL injection์ด ๋๋์ง ํ์ธํ๋ ค๋ฉด ' ๋ " ๋ฅผ ๋ก๊ทธ์ธ ์ฐฝ์ ๋ฃ์ด์ SQL ์๋ฌ๋ฅผ ๋ฟ์ด๋ด๋์ง ํ์ธํ๋ฉด ๋๋ค.
login admin.asp๋ผ๊ณ ๋๋๊ณ ์ ์ณ์ ๋์ค๋ ์น์ฌ์ดํธ ์๋ฌด๋ฐ๋ 1'or'1'='1์ ๋ฃ์ผ๋ฉด ์๋์ด ๋๋ ์ฌ์ดํธ์ธ ๊ฒฝ์ฐ ์๋์ด ๋๋ค!
๋ก๊ทธ์ธ๋ฟ๋ง ์๋๋ผ JOIN์ด๋ UNION ๊ฐ์ ๊ตฌ๋ฌธ์ ํตํด ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ์ฝ๋๋ฅผ ์คํํ ์๋ ์๋ค.
MySQL ๊ธฐ์ค์ผ๋ก SQL injection์ด ๋๋์ง ํ์ธํ๋ ค๋ฉด ' ๋ " ๋ฅผ ๋ก๊ทธ์ธ ์ฐฝ์ ๋ฃ์ด์ SQL ์๋ฌ๋ฅผ ๋ฟ์ด๋ด๋์ง ํ์ธํ๋ฉด ๋๋ค.
Warning: mysql_fetch_array():
Warning: mysql_fetch_assoc():
Warning: mysql_numrows():
Warning: mysql_num_rows():
Warning: mysql_result():
Warning: mysql_preg_match():
๋ณดํต์ ์ด๋ ๊ฒ ๋์ฌ ๊ฒ์ด๋ค.
2.2. ๋ฐฉ๋ฒ 2[ํธ์ง]
๋ก๊ทธ์ธ ํผ๋ ๊ฒฐ๊ตญ์ ์๋ฒ์ ์์ฒญ์ ํด์ ๋ฐ๋ ๊ฒ์ด๋ค. HTTP ํค๋๋ฅผ ๋ณด๋ฉด ์๋ต ํค๋์ ์๋ฒ์ ์ข
๋ฅ์ ๋ฒ์ ์ด ๋์จ๋ค. Apache ์๋ฒ๋ MySQL ์๋ฒ, IIS๋ MS SQL ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข
๋ฅ๋ฅผ ์ถ์ธกํ ์ ์๋ค. DB์์ง์ ์์๋ด์ ํด๋น ์์คํ
์ ๋ง๋ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋ด๊ฑฐ๋ ํ ์ ์๋ค.
2.3. ๋ธ๋ผ์ธ๋ SQL ์ธ์ ์ [ํธ์ง]
์๋ฌ ๋ฉ์์ง๊ฐ ์ ๋ณด๊ฐ ์๋ฌด๋ฐ ๋์์ด ๋์ง ์๊ฑฐ๋ ์์ ์๋ฌ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ์ง ์์ ๋ ์ฌ์ฉํ๋ค. ๋ํ์ ์ธ ๊ธฐ์ ๋ก๋ ์๊ฐ ์ง์ฐ ๊ณต๊ฒฉ์ด ์๋ค. ๊ฐ๋จํ๊ฒ ๋ช ์ด ์ ๋์ time for delay๋ฅผ ์ด์ฉํด ์ํ๋ ์๊ฐ ๋งํผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ง์ฌ ์ค๋ค๋ฉด ์ทจ์ฝํ๋ค๊ณ ๋ณผ ์ ์๋ค.
3. ๋ฐฉ์ด ๋ฐฉ๋ฒ[ํธ์ง]
์๋ง๋ XSS์ ์๋น ๋ถ๋ถ ๊ฒน์น๊ฒ ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ์๊ฒ ๋ฐ์ ๊ฐ์ ์ง์ SQL๋ก ๋๊ธฐ๋ฉด ์ ๋๋ค. ์์ฆ์ ์ฐ์ด๋ ๊ฑฐ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ์ ์ ์
๋ ฅ์ด ์๋์น ์์ ๋์์ ํ๋ ๊ฑธ ๋ฐฉ์งํ๋ escape ํจ์์ prepared statement[3]๋ฅผ ์ ๊ณตํ๋ค. prepared statement ๋ ๋ณ์๋ฅผ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋๊ฒ์ด๋ผ ์์ ํ๋ค.
๋ํ DB์ ์ ์ ๋ณ๋ก ์ ๊ทผ ๊ถํ๊ณผ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ช ๋ น์ด๋ฅผ ์ค์ ํ๋ฉด ์ต์ ์ ๊ฒฝ์ฐ์ SQL injection์ ์ฑ๊ณตํ์๋ค๊ณ ํ๋๋ผ๋ ๊ทธ๋๋ง ํผํด๋ฅผ ์ต์ํํ ์ ์๋ค. ํน์๋ SQL injection์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์์์ผ ๊ฐ๋ฅํ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ด๋ผ๊ณ ํ์ง๋ง ์คํค๋ง ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ SQL injection์ ์ฌ์ฉํ๋ฉด ์คํค๋ง ๊ตฌ์กฐ๋ฅผ ์์๋ผ ์๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ์กฐํ๋ ค๋ ๊ฒ ์๋๋ผ ํ๊ดดํ๋ ค๋ ๊ฑฐ๋ผ๋ฉด ์์ผ๋์นด๋ ๋ฌธ์( * )๋ฅผ ์ฌ์ฉํด์ ๊ทธ๋ฅ ์น ๋ค ์ง์๋ฒ๋ฆฌ๋ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅ.
DBMS ๋ง๋ค ๋ฌธ๋ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ๊ทธ๊ฑธ ๋ค ๊ณ ๋ คํด์ ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋น์ถ์ฒํ๋ค. ํด๋น ์ธ์ด๋ ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ prepared statement๋ผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ ์ต์ . escape_string ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช๋ช ๊ตฐ๋ฐ์์ ๋นผ๋จน๊ฑฐ๋ ํ๋ ์ค์๋ก ๋ณด์ ๊ตฌ๋ฉ์ด ์๊ธธ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ prepared statement๋ ์ฌ์ฉ ์ ์ ์ผ๋ถ ์ปดํ์ผ๋ผ์ DB ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์์์ผ์ฃผ๋ฏ๋ก ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์. ๋ค๋ง ์ปดํ์ผํ๋ ์๊ฐ์ด ์๋ค ๋ณด๋ ๋ณ์๋ง ๋ค๋ฅธ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ๋ ์์ ์์์ผ ์ ์๋ฏธํ ์๋ ํฅ์์ด ์๋ค. ํ๋ก์์ (Procedure)๋ผ๋ ์ฟผ๋ฆฌ ์บก์ํ ๊ธฐ๋ฅ๋ ์ฐ๋ฉด ์ข๋ค.
์ถ์ฒ๋๋ ๋ฐฉ์ด๋ฒ์ ํด๋ผ์ด์ธํธ ์ธก์ ์ ๋ ฅ์ ๋ฐ์ ์น ์ฌ์ดํธ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํผ ์ ๋ ฅ๊ฐ์ ํ ๋ฒ ๊ฒ์ฆํ๊ณ [4], ์๋ฒ ์ธก์ ํด๋ผ์ด์ธํธ ์ธก์ ์๋ฐ์คํฌ๋ฆฝํธ ํํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ [5]ํ ๋ฒ ๋ ์ ๋ ฅ๊ฐ์ ํํฐํ๋ค. ์ด๋ ์ ๊ทํํ์๋ฑ์ผ๋ก ํ๋ฒ ๊ฑธ๋ฌ๋ด๊ณ , SQL ์ฟผ๋ฆฌ๋ก ๋๊ธธ ๋ ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ prepared statement๋ก ์ ๋ ฅ๋ฐ๊ณ ์ด๋ฅผ ํ๋ก์์ [6]๋ก ์ฒ๋ฆฌํ๋๊ฒ ์ข๋ค. ๋ค์, ์ฟผ๋ฆฌ์ ์ถ๋ ฅ๊ฐ์ ํ ๋ฒ ๋ ํํฐํ๊ณ (XSS ๊ณต๊ฒฉ ๋ฐฉ์ด์ ๋ชฉ์ ์ด ๊ฐํ๋ค) ์ ์ ์๊ฒ ์ ์กํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํด๋น ํผ์ ๋ํด์๋ SQL injection ๊ณต๊ฒฉ์ด ์์ ํ ์ฐจ๋จ๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ์ ๋ถ๊ฐ ์๋๋ฏ๋ก(์คํธํ์ด๋ ๋งจ ์ธ ๋ ๋ฏธ๋ค ๊ณต๊ฒฉ, ํค ๋ก๊ฑฐ ๋ฑ ์์ง ๋ง๋ค) ์ ๋ณด ์ ์ถ์ ๋ฏผ๊ฐํ ์ฌ์ดํธ๋ฅผ ์ด์ํ ์๊ฐ์ด๋ผ๋ฉด ๋ณด์ ํ์ฌ์ ์ปจ์คํ ์ ๊ผญ ๋ฐ์์ผ ํ๋ค.
๋ํ DB์ ์ ์ ๋ณ๋ก ์ ๊ทผ ๊ถํ๊ณผ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ช ๋ น์ด๋ฅผ ์ค์ ํ๋ฉด ์ต์ ์ ๊ฒฝ์ฐ์ SQL injection์ ์ฑ๊ณตํ์๋ค๊ณ ํ๋๋ผ๋ ๊ทธ๋๋ง ํผํด๋ฅผ ์ต์ํํ ์ ์๋ค. ํน์๋ SQL injection์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์์์ผ ๊ฐ๋ฅํ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ด๋ผ๊ณ ํ์ง๋ง ์คํค๋ง ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ SQL injection์ ์ฌ์ฉํ๋ฉด ์คํค๋ง ๊ตฌ์กฐ๋ฅผ ์์๋ผ ์๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ์กฐํ๋ ค๋ ๊ฒ ์๋๋ผ ํ๊ดดํ๋ ค๋ ๊ฑฐ๋ผ๋ฉด ์์ผ๋์นด๋ ๋ฌธ์( * )๋ฅผ ์ฌ์ฉํด์ ๊ทธ๋ฅ ์น ๋ค ์ง์๋ฒ๋ฆฌ๋ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅ.
DBMS ๋ง๋ค ๋ฌธ๋ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ๊ทธ๊ฑธ ๋ค ๊ณ ๋ คํด์ ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋น์ถ์ฒํ๋ค. ํด๋น ์ธ์ด๋ ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ prepared statement๋ผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ ์ต์ . escape_string ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช๋ช ๊ตฐ๋ฐ์์ ๋นผ๋จน๊ฑฐ๋ ํ๋ ์ค์๋ก ๋ณด์ ๊ตฌ๋ฉ์ด ์๊ธธ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ prepared statement๋ ์ฌ์ฉ ์ ์ ์ผ๋ถ ์ปดํ์ผ๋ผ์ DB ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์์์ผ์ฃผ๋ฏ๋ก ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์. ๋ค๋ง ์ปดํ์ผํ๋ ์๊ฐ์ด ์๋ค ๋ณด๋ ๋ณ์๋ง ๋ค๋ฅธ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ๋ ์์ ์์์ผ ์ ์๋ฏธํ ์๋ ํฅ์์ด ์๋ค. ํ๋ก์์ (Procedure)๋ผ๋ ์ฟผ๋ฆฌ ์บก์ํ ๊ธฐ๋ฅ๋ ์ฐ๋ฉด ์ข๋ค.
์ถ์ฒ๋๋ ๋ฐฉ์ด๋ฒ์ ํด๋ผ์ด์ธํธ ์ธก์ ์ ๋ ฅ์ ๋ฐ์ ์น ์ฌ์ดํธ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํผ ์ ๋ ฅ๊ฐ์ ํ ๋ฒ ๊ฒ์ฆํ๊ณ [4], ์๋ฒ ์ธก์ ํด๋ผ์ด์ธํธ ์ธก์ ์๋ฐ์คํฌ๋ฆฝํธ ํํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ [5]ํ ๋ฒ ๋ ์ ๋ ฅ๊ฐ์ ํํฐํ๋ค. ์ด๋ ์ ๊ทํํ์๋ฑ์ผ๋ก ํ๋ฒ ๊ฑธ๋ฌ๋ด๊ณ , SQL ์ฟผ๋ฆฌ๋ก ๋๊ธธ ๋ ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ prepared statement๋ก ์ ๋ ฅ๋ฐ๊ณ ์ด๋ฅผ ํ๋ก์์ [6]๋ก ์ฒ๋ฆฌํ๋๊ฒ ์ข๋ค. ๋ค์, ์ฟผ๋ฆฌ์ ์ถ๋ ฅ๊ฐ์ ํ ๋ฒ ๋ ํํฐํ๊ณ (XSS ๊ณต๊ฒฉ ๋ฐฉ์ด์ ๋ชฉ์ ์ด ๊ฐํ๋ค) ์ ์ ์๊ฒ ์ ์กํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํด๋น ํผ์ ๋ํด์๋ SQL injection ๊ณต๊ฒฉ์ด ์์ ํ ์ฐจ๋จ๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ์ ๋ถ๊ฐ ์๋๋ฏ๋ก(์คํธํ์ด๋ ๋งจ ์ธ ๋ ๋ฏธ๋ค ๊ณต๊ฒฉ, ํค ๋ก๊ฑฐ ๋ฑ ์์ง ๋ง๋ค) ์ ๋ณด ์ ์ถ์ ๋ฏผ๊ฐํ ์ฌ์ดํธ๋ฅผ ์ด์ํ ์๊ฐ์ด๋ผ๋ฉด ๋ณด์ ํ์ฌ์ ์ปจ์คํ ์ ๊ผญ ๋ฐ์์ผ ํ๋ค.
[1] DROP DATABASE ๊ตฌ๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ญ์ ํ๋ ๋ช
๋ น์ด์ด๋ค. ๋จนํ๊ธฐ๋ง ํ๋ฉด ๋ํผ๋์ผ๋ก ์งํํ๋ค(...).
[2] ๊ฐ์ธ์ ๋ณด์ฒ๋ฆฌ์๋ ๊ฐ์ธ์ ๋ณด๊ฐ ๋ถ์คยท๋๋ยท์ ์ถยท์์กฐยท๋ณ์กฐ ๋๋ ํผ์๋์ง ์๋ํ๋๋ก ๋ด๋ถ ๊ด๋ฆฌ๊ณํ ์๋ฆฝ, ์ ์๊ธฐ๋ก ๋ณด๊ด ๋ฑ ๋ํต๋ น๋ น์ผ๋ก ์ ํ๋ ๋ฐ์ ๋ฐ๋ผ ์์ ์ฑ ํ๋ณด์ ํ์ํ ๊ธฐ์ ์ ยท๊ด๋ฆฌ์ ๋ฐ ๋ฌผ๋ฆฌ์ ์กฐ์น๋ฅผ ํ์ฌ์ผ ํ๋ค. (์ถ์ฒ: ๋ฒ์ ์ฒ ๊ตญ๊ฐ๋ฒ๋ น์ ๋ณด์ผํฐ)
[3] ์ง์ญํ๋ฉด '์ค๋น๋ ์์ '๋ก, SQL ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ ์ ์ปดํ์ผํ ๋ค ๋ณ์๋ง ๋ฐ๋ก ์ง์ด๋ฃ์ด ์คํํ๋ ๊ฒ์ด๋ค.
[4] ์ด๋์ ํผ ๊ฒ์ฆ์ ์ฌ์ฉ์์๊ฒ ์ธ์ ์
์ ํ์ํ ํน์๋ฌธ์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๋ฆฌ๋ ์ฉ๋๋ก, ๋ฐฉ์ด๋ฐฉ๋ฒ๊ณผ๋ ๊ด๋ จ์ด ์๋ค๋ ๊ฑธ ์ ์ํ์.
[5] ๊ณต๊ฒฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฌ์ฉ์ ๋๊ฑฐ๋ ํผ ํ์ด์ง๋ฅผ ๋ค์ด๋ฐ์ ๋ง๊ฐ์กฐํ๋ฉด ๊ทธ๋ง์ด๊ธฐ ๋๋ฌธ.
[6] SQL ๊ตฌ๋ฌธ์ 'ํจ์' ๊ผด๋ก ๋ฌถ์ด ๋์ ๊ฒ์ด๋ค.