Greasemonkey: CSP ์ œํ•œ ํŽ˜์ด์ง€ ์Šคํƒ€์ผ ์ง€์ •์„ ์œ„ํ•œ GM.addStyle API ์ถ”๊ฐ€

์— ๋งŒ๋“  2017๋…„ 11์›” 22์ผ  ยท  14์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: greasemonkey/greasemonkey

ํ˜„์žฌ ์Šคํฌ๋ฆฝํŒ… ์Šคํƒ€์ผ์˜ ๋ถ€์กฑ์€ ์‹ค์ œ๋กœ ์™„์ „ํ•œ ์žฌ์•™์ž…๋‹ˆ๋‹ค :-(

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

๊ฐ์‚ฌ ํ•ด์š” !

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ˜„์žฌ์˜ ๋ถ€์กฑ์„ ๋”์šฑ ์ดํ•ดํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค ...

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

addStyle ๋Š” 12์ค„์˜ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ๋กœ ์Šคํฌ๋ฆฝํŠธ์— ์‰ฝ๊ฒŒ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ด ์ค„์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— 11์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
style.setAttribute('type', 'text/css');

๊ฐ์‚ฌ ํ•ด์š” !

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ˜„์žฌ์˜ ๋ถ€์กฑ์„ ๋”์šฑ ์ดํ•ดํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค ...

@arantius CSP๊ฐ€ ์žˆ๊ณ  ์›๋ณธ์œผ๋กœ "self"๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž ์Šคํƒ€์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ <style> ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. GM์€ tabs.insertCSS() ( ref )๋ฅผ ํ˜ธ์ถœํ•˜๋Š” API๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐ?

CSP๊ฐ€ ์žˆ๊ณ  ์›๋ณธ์œผ๋กœ "self"๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž ์Šคํƒ€์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ณณ๋ถ€ํ„ฐ Stylish์— ๋Œ€ํ•œ ๋ฒ„๊ทธ ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ GM์˜ ํ˜„์žฌ API๋Š” ์ผ๋ถ€ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ ์ œํ•œ ๋˜๋Š” ๊ธฐํƒ€๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ถŒํ•œ ์žˆ๋Š” WebExt API๋ฅผ ๋Œ€๋ถ€๋ถ„ ๋…ธ์ถœํ•˜๊ณ  insertCSS๊ฐ€ ๊ทธ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐœ๊ฒฌ ๋ฒ„๊ทธ @Sxderp ์ฐธ์กฐํ•œ (๋˜๋Š” ์ด์™€ ). ๊ทธ ๋•…์— ๋„์ฐฉํ•˜๋ฉด ์—ฌ๊ธฐ์™€ Stylish์— ๋Œ€ํ•œ ๋‚˜์˜ ์ œ์•ˆ์€ ๋ถˆํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ๋œ ๋ฒ„๊ทธ์—์„œ "CSS๋ฅผ ํ™•์žฅ์— ๋ฒˆ๋“ค๋กœ ๋ฌถ์œผ๋ฉด ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค..."๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์  ๋…ธ๋“œ ์‚ฝ์ž…์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSP ์•ˆ์ „ ๊ธฐ๋Šฅ์„ ๊ณ ๋ คํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค. (ํ•˜์ง€๋งŒ ์ •๋ง ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์—์„œ...)

์›์น™์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šคํฌ๋ฆฝํŠธ์— ์ „๋‹ฌํ•˜๊ณ  tabs.insertCSS๋ฅผ ์‹คํ–‰ํ•˜์—ฌ FF๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋‹จ ํ•ด๋‹น ๋ฒ„๊ทธ๊ฐ€ ๊ตฌํ˜„๋˜๋ฉด ์ด๋Ÿฌํ•œ ๊ณ ๋ฆฌ๋ฅผ ๋›ฐ์–ด ๋„˜์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@arantius 1415352 ๋Š” "์ด๊ฒƒ์€ HTML style ์†์„ฑ๊ณผ HTML <style> ๋…ธ๋“œ์˜ ๋‚ด์šฉ ๋ชจ๋‘์— ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

GM.addStyle ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด ์—†๋Š” ๊ฒฝ์šฐ(CSP ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ๋˜๋ฉด ์ €์—๊ฒŒ ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค), ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์„ ์ˆ˜์ • ์ด ๋Œ€์•ˆ ๋„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Œ). ๊ทธ๊ฒƒ์€ ๋ช…๋ฐฑํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ์ง€๊ธˆ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  ๊ธฐ๋Šฅ์ด ๋‹ค์‹œ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

๊ฐ์‚ฌ ํ•ด์š”!

ํด๋ฆฌํ•„ ๊ด€๋ จ: GM_addStyle์ด ๋„๋งˆ ์œ„์— ์žˆ๋‹ค๋Š” ์†Œ์‹์„ ๋“ค์€ ์ดํ›„๋กœ ์ €๋Š” ์‹ค์ œ๋กœ 3๊ฐ€์ง€ ๋ช…๋ น๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ต์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค. HEAD๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋Œ€์‹  ๋ฌธ์„œ ์‹œ์ž‘ ์‹œ์—๋„ ํ•ญ์ƒ ์กด์žฌํ•˜๋Š” documentElement์— STYLE์„ ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

var style = document.createElement('style'); var style.textContent = `
<Stylesheet here>
`; document.documentElement.appendChild(style);

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ๋” ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ๋ฒ„์ „์œผ๋กœ 5์ค„์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

addStyle = function (css) {
  var style = document.createElement('style');
  style.textContent = css;
  document.documentElement.appendChild(style);
  return style; //optional, but convenient for changing the styling later.
};

ํ‘œ์ค€์ด ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Firefox์˜ GM 3 ๋ฐ 4์™€ Chrome์˜ TamperMonkey์—์„œ ๋ฌธ์ œ ์—†์ด ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  HEAD๊ฐ€ ์•„์ง ๋กœ๋“œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‹คํŒจํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น„ํ‘œ์ค€์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค(๋†€๋ž๊ฒŒ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ๋งŒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๋˜ํ•œ UserStyles,org๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ์˜ ๋Œ€์ฒด ์ˆ˜๋‹จ์œผ๋กœ ๋‚ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•ฉ๋‹ˆ๋‹ค.

HEAD๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋Œ€์‹  ๋ฌธ์„œ ์‹œ์ž‘ ์‹œ์—๋„ ํ•ญ์ƒ ์กด์žฌํ•˜๋Š” documentElement์— STYLE์„ ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

FF57 ๋ฐ GM4์—์„œ documentElement๋Š” ์ ์–ด๋„ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋ฌธ์„œ ์‹œ์ž‘ ์‹œ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค .

GM 4(ํ˜„์žฌ๋กœ์„œ๋Š”) ๋ฌธ์„œ ์‹œ์ž‘์ด ์ด์ „๋ณด๋‹ค ๋Šฆ๊ฒŒ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Š”
๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ documentElement๊ฐ€ ์—†์œผ๋ฉด
documentElement๊ฐ€
HTML ์š”์†Œ. ์ด๊ฒƒ์€ HEAD ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด ๋ฐฉ๋ฒ•์€
๋” ๋‚˜๋น .

๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” Fx 59์—์„œ ์ตœ์‹  ๊ฐœ๋ฐœ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Œ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์„œ ์‹œ์ž‘์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ documentElement๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋งŒ์•ฝ์—
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค
documentElement๊ฐ€ ์žˆ๊ธฐ ์ „์— ๋ฌธ์„œ. ๋‚˜๋Š” ๋‹น์‹ ์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
๋Œ์—ฐ๋ณ€์ด ๊ด€์ฐฐ์ž.

๋ฌธ์„œ ์š”์†Œ๊ฐ€
๋ชจ๋“  ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

2017๋…„ 12์›” 26์ผ ํ™”์š”์ผ ์˜คํ›„ 6์‹œ 26๋ถ„์— CoolCmd [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

HEAD๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋Œ€์‹  STYLE์„ ์ง์ ‘ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์„œ ์‹œ์ž‘ ์‹œ์—๋„ ํ•ญ์ƒ ์กด์žฌํ•˜๋Š” documentElement.
FF57 ๋ฐ GM4์—์„œ documentElement๋ฅผ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
๋ฌธ์„œ ์‹œ์ž‘, ์ ์–ด๋„ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š”.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/greasemonkey/greasemonkey/issues/2724#issuecomment-354028964 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AFNSrmb5eKj-nY9vnR3d94bq5kIjaz9Tks5tEY7PgaJpZM4QnG03
.

๋Œ์—ฐ๋ณ€์ด ๊ด€์ฐฐ์ž๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

document ์— ๋Œ์—ฐ๋ณ€์ด ๊ด€์ฐฐ์ž๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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