์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
1. ๊ฐœ์š”2. ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•
2.1. ๋ฐฉ๋ฒ• 12.2. ๋ฐฉ๋ฒ• 22.3. ๋ธ”๋ผ์ธ๋“œ SQL ์ธ์ ์…˜
3. ๋ฐฉ์–ด ๋ฐฉ๋ฒ•



๊ณผ์†๋ฐฉ์ง€ ์นด๋ฉ”๋ผ์— SQL injection ํ•˜๊ธฐ[1]



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๋Š” ์ฐจ๋‹จ๋  ๊ฒƒ์ด๋ฉฐ ์„ค๋ น ๋จนํžŒ๋‹ค ํ•ด๋„ ๋ฒ•๋ฅ ์— ๋”ฐ๋ผ ์ฒ˜๋ฒŒ๋ฐ›๋Š”๋‹ค.

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 ์—๋Ÿฌ๋ฅผ ๋ฟœ์–ด๋‚ด๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.
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 ๊ณต๊ฒฉ์ด ์™„์ „ํžˆ ์ฐจ๋‹จ๋œ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์˜ ์ „๋ถ€๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ(์Šคํ‘ธํ•‘์ด๋‚˜ ๋งจ ์ธ ๋” ๋ฏธ๋“ค ๊ณต๊ฒฉ, ํ‚ค ๋กœ๊ฑฐ ๋“ฑ ์•„์ง ๋งŽ๋‹ค) ์ •๋ณด ์œ ์ถœ์— ๋ฏผ๊ฐํ•œ ์‚ฌ์ดํŠธ๋ฅผ ์šด์˜ํ•  ์ƒ๊ฐ์ด๋ผ๋ฉด ๋ณด์•ˆ ํšŒ์‚ฌ์— ์ปจ์„คํŒ…์„ ๊ผญ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
[1] DROP DATABASE ๊ตฌ๋ฌธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค. ๋จนํžˆ๊ธฐ๋งŒ ํ•˜๋ฉด ๋Œ€ํ˜ผ๋ž€์œผ๋กœ ์งํ–‰ํ•œ๋‹ค(...).
[2] ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ์ž๋Š” ๊ฐœ์ธ์ •๋ณด๊ฐ€ ๋ถ„์‹คยท๋„๋‚œยท์œ ์ถœยท์œ„์กฐยท๋ณ€์กฐ ๋˜๋Š” ํ›ผ์†๋˜์ง€ ์•„๋‹ˆํ•˜๋„๋ก ๋‚ด๋ถ€ ๊ด€๋ฆฌ๊ณ„ํš ์ˆ˜๋ฆฝ, ์ ‘์†๊ธฐ๋ก ๋ณด๊ด€ ๋“ฑ ๋Œ€ํ†ต๋ น๋ น์œผ๋กœ ์ •ํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ผ ์•ˆ์ „์„ฑ ํ™•๋ณด์— ํ•„์š”ํ•œ ๊ธฐ์ˆ ์ ยท๊ด€๋ฆฌ์  ๋ฐ ๋ฌผ๋ฆฌ์  ์กฐ์น˜๋ฅผ ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. (์ถœ์ฒ˜: ๋ฒ•์ œ์ฒ˜ ๊ตญ๊ฐ€๋ฒ•๋ น์ •๋ณด์„ผํ„ฐ)
[3] ์ง์—ญํ•˜๋ฉด '์ค€๋น„๋œ ์„œ์ˆ '๋กœ, SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์ „์— ์ปดํŒŒ์ผํ•œ ๋’ค ๋ณ€์ˆ˜๋งŒ ๋”ฐ๋กœ ์ง‘์–ด๋„ฃ์–ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
[4] ์ด๋•Œ์˜ ํผ ๊ฒ€์ฆ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ธ์ ์…˜์— ํ•„์š”ํ•œ ํŠน์ˆ˜๋ฌธ์ž์˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์•Œ๋ฆฌ๋Š” ์šฉ๋„๋กœ, ๋ฐฉ์–ด๋ฐฉ๋ฒ•๊ณผ๋Š” ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฑธ ์œ ์˜ํ•˜์ž.
[5] ๊ณต๊ฒฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์„ ๋„๊ฑฐ๋‚˜ ํผ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์šด๋ฐ›์•„ ๋งˆ๊ฐœ์กฐํ•˜๋ฉด ๊ทธ๋งŒ์ด๊ธฐ ๋•Œ๋ฌธ.
[6] SQL ๊ตฌ๋ฌธ์„ 'ํ•จ์ˆ˜' ๊ผด๋กœ ๋ฌถ์–ด ๋†“์€ ๊ฒƒ์ด๋‹ค.