Handlebars.js: Chrome ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๋งค๋‹ˆํŽ˜์ŠคํŠธ v2๋Š” eval ์‚ฌ์šฉ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2013๋…„ 02์›” 25์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: handlebars-lang/handlebars.js

eval ๋ฐ eval๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์˜ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ณด์•ˆ ์ •์ฑ…์œผ๋กœ ์ธํ•ด manifest_version: 2๊ฐ€ ์žˆ๋Š” Chrome ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ํ•ธ๋“ค๋ฐ”๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํฌ์ฐฉ๋˜์ง€ ์•Š์€ EvalError: 'unsafe-eval'์ด ๋‹ค์Œ ์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ… ์ง€์นจ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ JavaScript๋กœ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. "script-src 'self' chrome-extension-resource:".
handlebars.js:1402
JavaScriptCompiler.createFunctionContext ํ•ธ๋“ค๋ฐ”.js:1402
JavaScriptCompiler.compile ํ•ธ๋“ค๋ฐ”.js:1320
handlebars.js:2105 ์ปดํŒŒ์ผ
(์ต๋ช… ํ•จ์ˆ˜) handlebars.js:2112
(์ต๋ช… ํ•จ์ˆ˜) panel.js:14 <--- Handlebars.compile()์ด๋ผ๋Š” ์Šคํฌ๋ฆฝํŠธ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์ž…์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด CSP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์š”์ ์„ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. ๋‹ค์Œ์€ Google ํŽ˜์ด์ง€์˜ ์ธ์šฉ๋ฌธ์ž…๋‹ˆ๋‹ค.

"๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ํ‘œํ˜„์˜ ์šฉ์ด์„ฑ์„ ์œ„ํ•ด eval() ๋ฐ new Function()๊ณผ ๊ฐ™์€ eval๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŠนํžˆ ์ด๋Ÿฌํ•œ ๊ตฌํ˜„ ์Šคํƒ€์ผ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. _์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: Angular .js) CSP๋ฅผ ์ฆ‰์‹œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค._ ๋งŽ์€ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„์ง ํ™•์žฅ ๊ธฐ๋Šฅ์˜ ํ‰๊ฐ€๊ฐ€ ์—†๋Š” ์„ธ๊ณ„์™€ ํ˜ธํ™˜๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์˜ˆ์ƒ๋ณด๋‹ค ๋ฌธ์ œ๊ฐ€ ๋” ๋งŽ์€ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค."

๋”ฐ๋ผ์„œ ์ผ๋ถ€ ํ…œํ”Œ๋ฆฟ ์‹œ์Šคํ…œ์€ CSP ๊ทœ๊ฒฉ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ธ๋“ค๋ฐ”๋Š” ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ์ด์ œ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ Handlebars๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ CSP ํ˜ธํ™˜์„ ์œ„ํ•ด 2๊ฐ€์ง€ ์„ ํƒ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) ํ•ธ๋“ค๋ฐ” ๋œฏ์–ด๋‚ด๊ธฐ
2) ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์„ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ…œํ”Œ๋ฆฟ์˜ ๋™์  ํŠน์„ฑ์„ ๊ฐ์•ˆํ•  ๋•Œ ์‚ฌ์ „ ์ปดํŒŒ์ผ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด์ œ ์ด ๊ฒฐํ•จ์ด ๋‹ซํ˜”๊ธฐ ๋•Œ๋ฌธ์— ํ•ธ๋“ค๋ฐ”๋ฅผ ๋œฏ์–ด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ CSP ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์—†๋‚˜์š”?

"์†Œ์Šค ๋ชฉ๋ก์— 'unsafe-eval'์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์ž…์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด CSP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์š”์ ์„ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

FWIW, Cloudant(Apache CouchDB ๊ธฐ๋ฐ˜)๋Š” ์ตœ๊ทผ eval() ๋ฐ new Function() https://console.bluemix.net/docs/services/Cloudant/release_info๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด ์Šคํฌ๋ฆฝํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์„ JS๋กœ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Handlebars.js๋ฅผ ๋” ๋งŽ์€ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ...๊ทธ๊ฑด ๋‹จ์ง€ ํฌ๋ง์‚ฌํ•ญ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. :์Šค๋งˆ์ผ๋ฆฌ: ๐Ÿ’ญ

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