Cross-Site Scripting(XSS)๊ณผ escapeHTML ๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ

zizonyoungjunยท2024๋…„ 9์›” 8์ผ
0

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ ์  ๋” ๋ณต์žกํ•ด์ง€๊ณ  ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋ฉด์„œ, ์ด๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ์‹ ์—ญ์‹œ ๋‹ค์–‘ํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘์—์„œ๋„ Cross-Site Scripting(XSS) ๊ณต๊ฒฉ์€ ๊ฐ€์žฅ ํ”ํ•˜๋ฉด์„œ๋„ ์œ„ํ—˜ํ•œ ๋ณด์•ˆ ์œ„ํ˜‘์ธ๋ฐ์š”, ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” XSS๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๊ธฐ๋ฒ•์ธ escapeHTML ํ•จ์ˆ˜์˜ ์›๋ฆฌ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

XSS์˜ ์ž‘๋™ ์›๋ฆฌ

Cross-Site Scripting(XSS)๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ, ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํ–‰๋˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆ ์—†์ด ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ์ƒํ™ฉ์„ ์ด์šฉํ•˜์—ฌ, ๊ธฐ์กด ์˜๋„์™€ ๋‹ค๋ฅธ HTML๊ณผ JavaScript ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฑฐ์ฃ ๐Ÿ˜ˆ

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ XSS ๊ณต๊ฒฉ์˜ ์œ„ํ—˜์€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ HTML ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•  ๋•Œ, ์ด ์ž…๋ ฅ์ด ์ œ๋Œ€๋กœ ๊ฒ€์ฆ๋˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ํƒœ๊ทธ๋กœ ํ•ด์„ํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”๐Ÿ˜จ

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ <h2>Buy Groceries</h2>๋ผ๋Š” ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ HTML๋กœ ํ•ด์„ํ•˜์—ฌ ํˆฌ๋‘ ํ•ญ๋ชฉ์— ํฐ ์ œ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ๋ณ€ํ™”๋Š” ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๋น„์ •์ƒ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด ์—ญ์‹œ ํฌ๋‚˜ํฐ ์˜ค๋ฅ˜๊ธด ํ•˜์ง€๋งŒ, ์ •๋ง ๋ฌด์„œ์šด ์œ„ํ—˜ ์š”์†Œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ <script> ํƒœ๊ทธ์™€ ๊ฐ™์€ ์•…์˜์ ์ธ JavaScript ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์›น ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์„ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

<script>alert('XSS Attack');</script>

์œ„์™€ ๊ฐ™์€ ์•…์˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ์— ์ž…๋ ฅ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๊ณ , ์‚ฌ์šฉ์ž๋Š” ์•Œ๋ฆผ ์ฐฝ์„ ํ†ตํ•ด ๊ณต๊ฒฉ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜๋Š”๊ฑฐ์ฃ . ์‹ค์ œ ๊ณต๊ฒฉ์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ฟ ํ‚ค, ๋กœ๊ทธ์ธ ์ •๋ณด ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์น˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •์œผ๋กœ ์›์น˜ ์•Š๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

XSS์˜ ์ฃผ์š” ์œ ํ˜•

XSS๋Š” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์•…์šฉํ•˜์—ฌ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€๋งŒ, ์–ด๋–ค ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์œ ํ˜•์ด ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

1. Stored XSS (์ €์žฅํ˜• XSS)

์ €์žฅํ˜• XSS๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์„œ๋ฒ„์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต์€ ๊ฒŒ์‹œ๊ธ€, ๋Œ“๊ธ€, ํ”„๋กœํ•„ ์ •๋ณด ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์ด ์„œ๋ฒ„์— ์ €์žฅ๋˜๊ณ , ์ดํ›„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ, ์„œ๋ฒ„๋Š” ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๊ธ€์— <script>alert('XSS');</script>๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ๊ฒŒ์‹œ๊ธ€์„ ๋ณผ ๋•Œ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

2. Reflected XSS (๋ฐ˜์‚ฌํ˜• XSS)

๋ฐ˜์‚ฌํ˜• XSS๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ , ์ฆ‰์‹œ ๋ฐ˜์‚ฌ๋˜์–ด ์›น ํŽ˜์ด์ง€์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ URL ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ ๊ณต๊ฒฉ์ด ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์˜์ ์ธ URL์„ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ํด๋ฆญํ•œ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ URL์†์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, URL์— http://example.com/search?q=<script>alert('XSS');</script>๋ฅผ ํฌํ•จํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์›น ํŽ˜์ด์ง€์— ๋ฐ˜์˜ํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3. DOM-based XSS (DOM ๊ธฐ๋ฐ˜ XSS)

DOM ๊ธฐ๋ฐ˜ XSS๋Š” ์„œ๋ฒ„ ์ธก์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋ธŒ๋ผ์šฐ์ €์˜ DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜์—ฌ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ณดํ†ต JavaScript์—์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, HTML ์š”์†Œ๋‚˜ URL ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ์„ JavaScript๋กœ ์กฐ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, JavaScript ์ฝ”๋“œ์—์„œ document.location.search ๊ฐ’์„ ์ง์ ‘ HTML์— ์‚ฝ์ž…ํ•  ๋•Œ, ๊ณต๊ฒฉ์ž๋Š” ์•…์„ฑ ์ฝ”๋“œ๋ฅผ URL ํŒŒ๋ผ๋ฏธํ„ฐ์— ํฌํ•จ์‹œ์ผœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ XSS๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ฟ ํ‚ค๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด ์‚ฌ์šฉ์ž ๊ณ„์ •์— ๋ฌด๋‹จ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ์„ธ์…˜ ํ•˜์ด์žฌํ‚น์ด๋‚˜, ๊ฐ€์งœ ๋กœ๊ทธ์ธ ์‚ฌ์ดํŠธ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์œ ๋„ํ•˜๋Š” ๋“ฑ์˜ ํ”ผ์‹ฑ ๊ณต๊ฒฉ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค๐Ÿ˜ฐ

๊ทธ๋ ‡๋‹ด ์šฐ์ง ๋‹ค..

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ์—์„œ <, >, &, ', "์™€ ๊ฐ™์€ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ HTML ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ๋กœ ์ธ์‹๋˜๊ฒŒ์—”ํ‹ฐํ‹ฐ ์ธ์ฝ”๋”ฉ์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. escapeHTML ํ•จ์ˆ˜๋Š” ์ด๋Ÿฌํ•œ ์—”ํ‹ฐํ‹ฐ ์ธ์ฝ”๋”ฉ ๊ณผ์ •์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋ฅผ XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.

escapeHTML ํ•จ์ˆ˜

export function escapeHTML(input) {
    const div = document.createElement('div');
    div.appendChild(document.createTextNode(input));
    return div.innerHTML;
}

escapeHTML ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ HTML๋กœ ํ•ด์„๋˜์ง€ ์•Š๊ณ  ํ…์ŠคํŠธ๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ HTML ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•จ์œผ๋กœ์จ <, >, & ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฌธ์ž๊ฐ€ HTML ํƒœ๊ทธ๋กœ ์ธ์‹๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜๋œ ๋ฌธ์ž๋Š” ๊ทธ์ € ํ™”๋ฉด์— ์ถœ๋ ฅ๋  ๋ฟ, ์•…์˜์ ์ธ HTML ํƒœ๊ทธ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

escapeHTML์˜ ํšจ๊ณผ

element.innerHTML = "<script>alert('XSS');</script>";

๋งŒ์•ฝ innerHTML ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ง์ ‘ DOM์— ์‚ฝ์ž…ํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด์„ HTML๋กœ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด <script> ํƒœ๊ทธ๊ฐ€ ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋˜์–ด, XSS ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋  ์œ„ํ—˜์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด์ฃ .

ํ•˜์ง€๋งŒ ์ด์™€ ๋‹ฌ๋ฆฌ, escapeHTML ํ•จ์ˆ˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ DOM API๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๊ฐ’์„ HTML์ด ์•„๋‹Œ ํ…์ŠคํŠธ ๋…ธ๋“œ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ HTML์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ๋ชจ๋“  ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์ž๋™์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ์— ์‚ฌ์šฉ์ž๊ฐ€ <script>์™€ ๊ฐ™์€ ์•…์˜์ ์ธ ํƒœ๊ทธ๋ฅผ ์ž…๋ ฅํ•ด๋„, ์ด๋ฅผ ๊ทธ์ € ํ…์ŠคํŠธ๋กœ๋งŒ ์ทจ๊ธ‰ํ•˜์—ฌ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ƒํƒœ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์•„๊นŒ ์˜ˆ์‹œ๋ฅผ ๋“ค์—ˆ๋˜ ์•„๋ž˜ ์ฝ”๋“œ๋Š”,

  <script>alert('XSS');</script>

escapeHTML ํ•จ์ˆ˜์— ์˜ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

  &lt;script&gt;alert('XSS');&lt;/script&gt;

๋ธŒ๋ผ์šฐ์ €๋Š” <script> ํƒœ๊ทธ๋ฅผ HTML๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๊ณ , ํ…์ŠคํŠธ๋กœ๋งŒ ํ‘œ์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ JavaScript ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ํ™”๋ฉด์—๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€ํ™˜๋œ HTML ์ฝ”๋“œ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

escapeHTML ํ•จ์ˆ˜์˜ ํ•œ๊ณ„

๋น„๋ก escapeHTML ํ•จ์ˆ˜๊ฐ€ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ ๋ช‡๋ช‡ ์ƒํ™ฉ์—์„œ๋Š” ํ•œ๊ณ„๋ฅผ ์ง€๋‹™๋‹ˆ๋‹ค. ์šฐ์„ , CSS ์ธ์ ์…˜์ด๋‚˜ URL ๊ธฐ๋ฐ˜ ๊ณต๊ฒฉ ๋“ฑ์˜ ์œ ํ˜•์€ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, CSS์—์„œ url() ํ•จ์ˆ˜์— ์•…์˜์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๋Š” ์‚ฌ์šฉ์ž๋ฅผ ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ฑฐ๋‚˜, CSS ํŒŒ์ผ์— ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‹ฌ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, DOM ๊ธฐ๋ฐ˜ XSS ๊ณต๊ฒฉ์€ escapeHTML ํ•จ์ˆ˜๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, JavaScript ์ฝ”๋“œ๊ฐ€ ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” DOM ์š”์†Œ์˜ ์†์„ฑ์ด๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•œ๊ณ„์ ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, escapeHTML ํ•จ์ˆ˜๋Š” XSS ๋ฐฉ์ง€์˜ ์™„์ „ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ, ๋ณด์กฐ์ ์ธ ๋ณด์•ˆ ๋ ˆ์ด์–ด๋กœ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. XSS์™€ ๊ฐ™์€ ๊ณต๊ฒฉ์„ ์™„๋ฒฝํžˆ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณด์•ˆ ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ ์ €ํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋Š” ๋“ฑ์˜ ๋ณด์•ˆ ์กฐ์น˜๊ฐ€ ํ•จ๊ป˜ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ง€๊ธˆ๊นŒ์ง€ XSS์™€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์–ด์„ ์ธ escapeHTML ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. escapeHTML์€ XSS ๋ฐฉ์ง€์— ํšจ๊ณผ์ ์ธ ๋„๊ตฌ์ด์ง€๋งŒ, CSS ์ธ์ ์…˜์ด๋‚˜ DOM ๊ธฐ๋ฐ˜ XSS ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์œ„ํ˜‘์— ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ ๋Œ€์ฑ…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ํ•œ ๊ฐ€์ง€์˜ ๊ธฐ๋ฒ•์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ๋ณด์•ˆ ๊ณ„์ธต์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ณตํ•ฉ์ ์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๋ฐฉ์–ด์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋‹ค์ธต์ ์ธ ์ ‘๊ทผ์„ ํ†ตํ•ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ๋ณด์•ˆ ์œ„ํ˜‘์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€