๋ฐœํ–‰์ผ:

์ˆ˜์ •์ผ:

ํ‹ฐ์Šคํ† ๋ฆฌ ๋Œ“๊ธ€๋ž€, ๋‹จ์ˆœ ์†Œํ†ต ๋„˜์–ด์„œ ์ฝ˜ํ…์ธ  ํ™•์žฅ ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

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

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

ํ‹ฐ์Šคํ† ๋ฆฌ ๋Œ“๊ธ€์„ ์ฝ˜ํ…์ธ  ํ™•์žฅ ๋„๊ตฌ๋กœ! ์ด๋ฏธ์ง€ ๋งํฌ์™€ HTML ํƒœ๊ทธ ํ‘œ์‹œํ•˜๊ธฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ‹ฐ์Šคํ† ๋ฆฌ ๋Œ“๊ธ€์— ์ˆจ๊ฒจ์ง„ HTML ํƒœ๊ทธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ—ˆ์šฉํ•˜๊ณ , ์ด๋ฏธ์ง€ ๋งํฌ์™€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ธฐ๋Šฅ๊นŒ์ง€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์ ์ธ ์Šคํฌ๋ฆฝํŠธ์™€ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋Œ“๊ธ€์„ ๋‹จ์ˆœํ•œ ์˜๊ฒฌ ๊ตํ™˜์ด ์•„๋‹Œ, ๋ธ”๋กœ๊ทธ ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ฐธ์—ฌํ˜• ์ฝ˜ํ…์ธ  ๊ณต๊ฐ„์œผ๋กœ ํ™•์žฅํ•ด ๋ณด์„ธ์š”!

์™œ ๋ธ”๋กœ๊ทธ์—์„œ๋Š” ๋Œ“๊ธ€์— HTML ํƒœ๊ทธ๋ฅผ ์ฐจ๋‹จํ• ๊นŒ?

ํ‹ฐ์Šคํ† ๋ฆฌ ๋ฐ ๋ธ”๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ“๊ธ€์— script, img, iframe ๋“ฑ HTML ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1. XSS(ํฌ๋กœ์Šค์‚ฌ์ดํŠธ์Šคํฌ๋ฆฝํŒ…) ๋ณด์•ˆ ์œ„ํ˜‘ ๋ฐฉ์ง€

  • ์•…์„ฑ ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ“๊ธ€์— script๋‚˜ img onerror=... ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•  ๊ฒฝ์šฐ,
  • ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•œ ๋‹ค๋ฅธ ์ด์šฉ์ž์—๊ฒŒ ์•…์„ฑ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ŠคํŒธ ๋ฐ ๊ด‘๊ณ  ๋งํฌ ๋‚จ๋ฐœ ๋ฐฉ์ง€

  • a ๋งํฌ, ์™ธ๋ถ€ ์ด๋ฏธ์ง€, iframe ๋“ฑ์„ ์‚ฝ์ž…ํ•ด ๊ด‘๊ณ , ํ”ผ์‹ฑ, ๋ถˆ๋ฒ• ํ™๋ณด๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋ฏ€๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

3. ๋ธ”๋กœ๊ทธ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง ๋ฐฉ์ง€

  • div, table ๊ฐ™์€ ํƒœ๊ทธ๊ฐ€ ๋Œ“๊ธ€์— ๋“ค์–ด๊ฐ€๋ฉด ์ „์ฒด ํŽ˜์ด์ง€ ๊ตฌ์กฐ๊ฐ€ ๋ฌด๋„ˆ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋ถˆ๋ฒ• ์ฝ˜ํ…์ธ  ์œ ํฌ ์ฐจ๋‹จ

  • ์„ฑ์ธ ์ฝ˜ํ…์ธ , ๋ถˆ๋ฒ• ์˜์ƒ ๋งํฌ ๋“ฑ์„ HTML๋กœ ๋…ธ์ถœํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

HTML ํƒœ๊ทธ ๋ณต์› ์Šคํฌ๋ฆฝํŠธ ์†Œ๊ฐœ (์ด๋ฏธ์ง€, ๋งํฌ ์ž๋™ ํ‘œ์‹œ)

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

์ฝ”๋“œ ๊ธฐ๋Šฅ ์„ค๋ช…

์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋Œ“๊ธ€์— img, a ๋“ฑ HTML ํƒœ๊ทธ๊ฐ€ ์ด์Šค์ผ€์ดํ”„๋œ ์ฑ„ ์ €์žฅ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ, ์ด๋ฅผ ์‹ค์ œ ํƒœ๊ทธ๋กœ ๋ณต์›ํ•˜๊ณ , ์ด๋ฏธ์ง€๋ฅผ lazy-loading ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋กœ๋”ฉ ์˜ค๋ฅ˜ ์‹œ ์ˆจ๊น€ ์ฒ˜๋ฆฌ๊นŒ์ง€ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ ์šฉ ํšจ๊ณผ

  • ๋Œ“๊ธ€์— ์ด๋ฏธ์ง€, ๋งํฌ ์ž๋™ ํ‘œ์‹œ
  • ๋ณด์•ˆ ์œ„ํ˜‘ ์—†์ด HTML ํƒœ๊ทธ ๋ณต์›
  • ๋Œ“๊ธ€ UI ์œ ์ง€ ๋ฐ ๋ ˆ์ด์•„์›ƒ ์•ˆ์ •์„ฑ ๋ณด์žฅ
  • React ๊ธฐ๋ฐ˜ ํ‹ฐ์Šคํ† ๋ฆฌ ์Šคํ‚จ์—์„œ๋„ ์ž๋™ ์ ์šฉ

๋‹จ. ์ฝ”๋“œ๋Š” ํ•œ์ค„๋กœ ์ž‘์„ฑํ•˜์„ธ์š”!

๊ตฌ๋ถ„ ์„ค๋ช…
1. HTML ๋””์ฝ”๋”ฉ ๋Œ“๊ธ€ ๋‚ด์— , ๋“ฑ์œผ๋กœ ํ‘œ์‹œ๋œ HTML ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ํƒœ๊ทธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
2. ์ด๋ฏธ์ง€ lazy-loading ์ฒ˜๋ฆฌ ์ด๋ฏธ์ง€์— loading="lazy" ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
3. ์ด๋ฏธ์ง€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ด๋ฏธ์ง€๊ฐ€ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค.
4. ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€ ์ด๋ฏธ ์ฒ˜๋ฆฌํ•œ ๋Œ“๊ธ€์—๋Š” ํ‘œ์‹œ ์ฒ˜๋ฆฌ ์ค‘๋ณต์„ ๋ง‰๊ธฐ ์œ„ํ•œ ํ‘œ์‹œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
5. ๋™์  ๋Œ“๊ธ€ ๋Œ€์‘ ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•ด ์ค๋‹ˆ๋‹ค.
6. ๋Œ“๊ธ€ ์ž‘์„ฑ ํ›„ ์žฌ์ฒ˜๋ฆฌ ๋Œ“๊ธ€ ์ž‘์„ฑ ํ›„ 1์ดˆ ๋’ค์— ๋‹ค์‹œ ํ•œ๋ฒˆ ์ฒ˜๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ •์ƒ ๋ฐ˜์˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ ์šฉ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ

script
(function() {
 const decodeEntities = (str) = {
 const textarea = document.createElement("textarea");
 textarea.innerHTML = str;
 return textarea.value;
 };

 const processComments = () = {
 const commentContainer = document.querySelector('[data-tistory-react-app="Comment"]');
 if (!commentContainer) return;

 commentContainer.querySelectorAll('.tt_desc').forEach((el) = {
 if (!el.dataset.processed) {
 const decoded = decodeEntities(el.innerHTML);
 if (/[a-z][\s\S]*/i.test(decoded)) {
 el.innerHTML = decoded;
 el.querySelectorAll('img._LAZY_LOADING').forEach(img = {
 img.classList.remove('_LAZY_LOADING_INIT_HIDE');
 img.loading = 'lazy';
 img.onerror = function() {
 this.style.display = 'none';
 };
 });
 }
 el.dataset.processed = 'true';
 }
 });
 };

 if (document.readyState !== 'loading') {
 processComments();
 } else {
 document.addEventListener('DOMContentLoaded', processComments);
 }

 const observer = new MutationObserver((mutations) = {
 let shouldProcess = false;
 mutations.forEach((mutation) = {
 if (mutation.addedNodes.length) {
 shouldProcess = true;
 }
 });
 if (shouldProcess) {
 processComments();
 }
 });

 observer.observe(document.body, {
 childList: true,
 subtree: true
 });

 const commentForm = document.querySelector('.tt-area-write form');
 if (commentForm) {
 commentForm.addEventListener('submit', () = {
 setTimeout(processComments, 1000);
 });
 }
})();
/script

์ ์šฉ ๋ฐฉ๋ฒ•

  1. ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ ๊ด€๋ฆฌ์ž ์ ‘์†
  2. ์Šคํ‚จ ํŽธ์ง‘ HTML ํŽธ์ง‘
  3. body ํƒœ๊ทธ ๋ฐ”๋กœ ๋‹ซํžˆ๊ธฐ ์ง์ „ /body ์œ„์— ์Šคํฌ๋ฆฝํŠธ ์‚ฝ์ž…
  4. ์ €์žฅ ํ›„ ๋ธ”๋กœ๊ทธ์—์„œ ๋Œ“๊ธ€ ์˜์—ญ ํ™•์ธ

๋Œ“๊ธ€์„ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ๋งํฌ์™€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํ™œ

์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ธ”๋กœ๊ทธ ๋Œ“๊ธ€์„ ์ƒˆ๋กœ์šด ๋„ค๋น„๊ฒŒ์ด์…˜ ์ˆ˜๋‹จ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ฐฉ๋ฌธ์ž,์šด์˜์ž๊ฐ€ ๋Œ“๊ธ€๋กœ ์ด๋ฏธ์ง€ ๋งํฌ๋ฅผ ๋‚จ๊ธฐ๋ฉด ์ž๋™์œผ๋กœ ๋ณด์ž„
  • a href="๋งํฌ"์„ค๋ช…/a ํ˜•ํƒœ๋„ ๋ณต์›๋˜๋ฏ€๋กœ ๊ด€๋ จ ํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐ
  • ๋Œ“๊ธ€๋กœ ๋ณด์กฐ ์ฝ˜ํ…์ธ , ์ฐธ๊ณ  ์ž๋ฃŒ, ์™ธ๋ถ€ ์ด๋ฏธ์ง€ ๋“ฑ ๊ณต์œ  ๊ฐ€๋Šฅ
  • ๋Œ“๊ธ€ ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ์ฐธ์—ฌํ˜• ์ฝ˜ํ…์ธ  ๊ณต๊ฐ„ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

์ฃผ์˜์‚ฌํ•ญ ๋ฐ ๋ณด์•ˆ ํŒ

  • script ํƒœ๊ทธ ์‚ฝ์ž…์€ ์‹œ์Šคํ…œ์—์„œ ๋ฌด์กฐ๊ฑด ์ฐจ๋‹จ๋˜๋ฏ€๋กœ ์ด ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์„ ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ“๊ธ€ ํ•„ํ„ฐ๋ง์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๋ฉฐ, ๋‹จ์ˆœํžˆ ๋ฌธ์ž์—ด๋กœ ๋ณด์ด๋Š” HTML์„ ์‹ค์ œ๋กœ ๋ณต์›ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ์ž๋Š” ์•…์„ฑ ๋Œ“๊ธ€ ํ•„ํ„ฐ๋ง์„ ๋ณ‘ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€ ๊ธฐ๋Šฅ์„ ๋ธ”๋กœ๊ทธ ์ฝ˜ํ…์ธ ๋กœ ํ™•์žฅ

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