Html-react-parser: ์Šคํƒ€์ผ ์†์„ฑ์—์„œ !important๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2021๋…„ 02์›” 18์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: remarkablemark/html-react-parser

๋•Œ๋•Œ๋กœ !important๊ฐ€ ํฌํ•จ๋œ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ํฌํ•จํ•˜๋Š” cms์—์„œ html ํƒœ๊ทธ๋ฅผ ์–ป๋Š” ๋ถˆํ–‰ํ•œ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  React ์•ฑ์—์„œ ๋ Œ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์—†์œผ๋ฉฐ !important๊ฐ€ ์ฒจ๋ถ€๋œ ๋ชจ๋“  ์Šคํƒ€์ผ์€ React์— ์˜ํ•ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
html-react-parser๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜์—ฌ ๋ณธ๋ฌธ์— ๋‚จ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์—ฌ๊ธฐ์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•  ์ ์ ˆํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ด ์ฃผ์„ธ์š”.

๊ฐ์‚ฌ!

question

๋ชจ๋“  8 ๋Œ“๊ธ€

@linkurzweg html-react-parser ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด์˜ฌ๋ฆฐ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์œ„ํ—˜ํ•˜๊ฒŒ SetInnerHTML์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ XSS ์ทจ์•ฝ์ ์— ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค.

@remarkablemark ์•„, ์œ„ํ—˜ํ•˜๊ฒŒ
์ œ ๊ฒฝ์šฐ์—๋Š” XSS์— ๋Œ€ํ•œ ์‹ค์ œ ์œ„ํ—˜์ด ์—†์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋ณธ๋ฌธ์— ์ผ๋ถ€ React ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋Š” ์š”์†Œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ html-react-parser๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๊ฒƒ์„ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์†Œ์— ์Šคํƒ€์ผ ์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ทธ๋Œ€๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ domNode๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@linkurzweg domToReact() domNode๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ React ์š”์†Œ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ์˜ˆ๋ฅผ ์ฐธ์กฐ

@remarkablemark ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋‚ด ๊ฒฝ์šฐ์— ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๊นŒ?
์—ฌ์ „ํžˆ domNode๋ฅผrisklySetInnerHTML๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด๋กœ ๋˜๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋ญ”๊ฐ€๋ฅผ ์–ป์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@linkurzweg ๋‚˜๋Š” ๋‹น์‹ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CodeSandbox , JSFiddle ๋˜๋Š” Repl.it์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@remarkablemark ์—ฌ๊ธฐ์—์„œ ๋ฐ”์ด์˜ฌ๋ฆฐ์„ ์ฐธ์กฐํ•˜์„ธ์š”: https://jsfiddle.net/9bezs1rt/.
๊ทธ๋ž˜์„œ, ๊ทธ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  html์ด ํฌํ•จ๋œ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ๋ฌธ์ž์—ด์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ, iframe, ์†Œ์…œ ๋ฏธ๋””์–ด ํฌํ•จ ๋“ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ). ๋ชจ๋“  dom ๋…ธ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

dom ๋…ธ๋“œ์— ์ผ๋ถ€ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ผ๋ถ€ React ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ต์ฒดํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ !important๊ฐ€ ์žˆ๋Š” ์Šคํƒ€์ผ์„ ํฌํ•จํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ–‰ํžˆ๋„ ๊ทธ๋“ค์€ ๊ธธ์„ ์žƒ์Šต๋‹ˆ๋‹ค.

@linkurzweg ๋ฐ”์ด์˜ฌ๋ฆฐ์„ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํƒ€์ผ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์ธ๋ผ์ธ ์Šคํƒ€์ผ์— !important ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

!important ์ œ๊ฑฐํ•œ ํ›„ ๋นจ๊ฐ„์ƒ‰ ํ…Œ๋‘๋ฆฌ๋ฅผ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ๋ฐ”์ด์˜ฌ๋ฆฐ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@remarkablemark ๋ฌผ๋ก , ๋ฐ”๋ณด์•ผ! ์ธ๋ผ์ธ ์Šคํƒ€์ผ๊ณผ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋Š” html ๋ฌธ์ž์—ด ๋‚ด๋ถ€์— !important๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ์Šคํƒ€์ผ ํƒœ๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ชจ๋‘ ๋งค์šฐ ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ !important๋„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. :D ์ด๊ฒƒ๊ณผ ๋„์›€์„ ์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰