JavaScript postMessageã®ãã¹ããã©ã¯ãã£ã¹ã§Webã¢ããªã±ãŒã·ã§ã³ãä¿è·ããŸããããã¯ãã¹ãªãªãžã³ã®è匱æ§ãé²ããããŒã¿ã®å®å šæ§ã確ä¿ããæ¹æ³ã解説ããŸãã
ã¯ãã¹ãªãªãžã³éä¿¡ã®ã»ãã¥ãªãã£ïŒJavaScript PostMessageã®ãã¹ããã©ã¯ãã£ã¹
仿¥ã®Webç°å¢ã§ã¯ãã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒããã€ã¯ãããã³ããšã³ãã¢ãŒããã¯ãã£ããŸããŸãäžè¬çã«ãªã£ãŠããŸãããããã®ã¢ãŒããã¯ãã£ã§ã¯ãç°ãªããªãªãžã³ïŒãã¡ã€ã³ããããã³ã«ããŸãã¯ããŒãïŒéã§ã®éä¿¡ãé »ç¹ã«å¿
èŠãšãããŸããJavaScriptã®postMessage APIã¯ããã®ã¯ãã¹ãªãªãžã³éä¿¡ã®ããã®ã¡ã«ããºã ãæäŸããŸããããããæ
éã«å®è£
ããªããšãé倧ãªã»ãã¥ãªãã£è匱æ§ãåŒãèµ·ããå¯èœæ§ããããŸãã
PostMessage APIãçè§£ãã
postMessage APIã¯ãç°ãªããªãªãžã³ã®ã¹ã¯ãªããå士ãéä¿¡ããããšãå¯èœã«ããŸããããã¯åŒ·åãªããŒã«ã§ããããã®åã«ã¯è²¬ä»»ããåãæ±ããæ±ããããŸããåºæ¬çãªäœ¿çšæ³ã¯2ã€ã®ã¹ãããã§æ§æãããŸãïŒ
- ã¡ãã»ãŒãžã®éä¿¡ïŒ ã¹ã¯ãªããããŠã£ã³ããŠãªããžã§ã¯ãïŒäŸïŒ
window.parentãiframe.contentWindowããŸãã¯window.openããååŸããWindowProxyãªããžã§ã¯ãïŒã«å¯ŸããŠpostMessageãåŒã³åºããŸãããã®ã¡ãœããã¯ãéä¿¡ããã¡ãã»ãŒãžãšã¿ãŒã²ãããªãªãžã³ã®2ã€ã®åŒæ°ãåããŸãã - ã¡ãã»ãŒãžã®åä¿¡ïŒ åä¿¡åŽã®ã¹ã¯ãªããã¯
windowãªããžã§ã¯ãã§messageã€ãã³ãããªãã¹ã³ããŸããã€ãã³ããªããžã§ã¯ãã«ã¯ãããŒã¿ãéä¿¡è ã®ãªãªãžã³ããœãŒã¹ãŠã£ã³ããŠãªããžã§ã¯ããªã©ãã¡ãã»ãŒãžã«é¢ããæ å ±ãå«ãŸããŠããŸãã
以äžã«ç°¡åãªäŸã瀺ããŸãïŒ
éä¿¡åŽïŒãªãªãžã³AïŒ
// Assuming you have a reference to the target window (e.g., an iframe)
const targetWindow = document.getElementById('myIframe').contentWindow;
// Send a message to origin B
targetWindow.postMessage('Hello from Origin A!', 'https://origin-b.example.com');
åä¿¡åŽïŒãªãªãžã³BïŒ
window.addEventListener('message', (event) => {
// Important: Check the origin of the message!
if (event.origin === 'https://origin-a.example.com') {
console.log('Received message:', event.data);
// Process the message
}
});
äžé©åãªPostMessage䜿çšã®ã»ãã¥ãªãã£ãªã¹ã¯
é©åãªäºé²çãè¬ããªããšãpostMessageã¯ã¢ããªã±ãŒã·ã§ã³ãæ§ã
ãªã»ãã¥ãªãã£è
åšã«ãããå¯èœæ§ããããŸãïŒ
- ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒïŒ ãããããªãªãžã³ããã®ã¡ãã»ãŒãžãç²ç®çã«ä¿¡é Œãããšãæ»æè ãã¢ããªã±ãŒã·ã§ã³ã«æªæã®ããã¹ã¯ãªãããæ³šå ¥ããå¯èœæ§ããããŸãã
- ã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªïŒCSRFïŒïŒ æ»æè ãä¿¡é Œããããªãªãžã³ã«ã¡ãã»ãŒãžãéä¿¡ããããšã§ããŠãŒã¶ãŒã«ä»£ãã£ãŠãªã¯ãšã¹ããåœé ããå¯èœæ§ããããŸãã
- ããŒã¿æŒæŽ©ïŒ ã¡ãã»ãŒãžãååãããããæå³ããªããªãªãžã³ã«éä¿¡ãããããããšãæ©å¯ããŒã¿ãæŒæŽ©ããå¯èœæ§ããããŸãã
å®å šãªPostMessageéä¿¡ã®ããã®ãã¹ããã©ã¯ãã£ã¹
ãããã®ãªã¹ã¯ã軜æžããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããïŒ
1. åžžã«ãªãªãžã³ãæ€èšŒãã
æãéèŠãªã»ãã¥ãªãã£å¯Ÿçã¯ãåä¿¡ã¡ãã»ãŒãžã®ãªãªãžã³ãåžžã«æ€èšŒããããšã§ããã¡ãã»ãŒãžãç²ç®çã«ä¿¡é ŒããŠã¯ãããŸãããevent.originããããã£ã䜿çšããŠãã¡ãã»ãŒãžãæåŸ
ããããªãªãžã³ããæ¥ãŠããããšã確èªããŸããä¿¡é Œã§ãããªãªãžã³ã®ãã¯ã€ããªã¹ããå®è£
ãããã以å€ã®ãªãªãžã³ããã®ã¡ãã»ãŒãžãæåŠããŸãã
äŸïŒJavaScriptïŒïŒ
const trustedOrigins = [
'https://origin-a.example.com',
'https://another-trusted-origin.com'
];
window.addEventListener('message', (event) => {
if (trustedOrigins.includes(event.origin)) {
console.log('Received message from trusted origin:', event.data);
// Process the message
} else {
console.warn('Received message from untrusted origin:', event.origin);
return;
}
});
éèŠãªèæ ®äºé ïŒ
- ã¯ã€ã«ãã«ãŒããé¿ããïŒ ã¡ãã»ãŒãžãéä¿¡ããéã«ãã¿ãŒã²ãããªãªãžã³ã«ã¯ã€ã«ãã«ãŒãïŒ'*'ïŒã䜿çšããèªæã«æµæããŠãã ããã䟿å©ã§ã¯ãããŸãããããã«ããã¢ããªã±ãŒã·ã§ã³ããããããªãªãžã³ããã®ã¡ãã»ãŒãžãåãä»ããããšã«ãªãããªãªãžã³æ€èšŒã®ç®çãç¡æå³ã«ãªããŸãã
- Nullãªãªãžã³ïŒ äžéšã®ãã©ãŠã¶ã§ã¯ã
file://URLããµã³ãããã¯ã¹åãããiframeããã®ã¡ãã»ãŒãžã«å¯Ÿã㊠"null" ãªãªãžã³ãå ±åãããå Žåãããããšã«æ³šæããŠãã ãããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³èŠä»¶ã«åºã¥ããŠããããã®ã±ãŒã¹ãã©ã®ããã«åŠçããããæ±ºå®ããŸããå€ãã®å Žåãnullãªãªãžã³ãä¿¡é Œã§ããªããã®ãšããŠæ±ãã®ãæãå®å šãªã¢ãããŒãã§ãã - ãµããã¡ã€ã³ã«é¢ããèæ
®äºé
ïŒ ãµããã¡ã€ã³ïŒäŸïŒ
app.example.comãšapi.example.comïŒãšéä¿¡ããå¿ èŠãããå Žåã¯ããªãªãžã³æ€èšŒããžãã¯ããããèæ ®ããŠããããšã確èªããŠãã ãããä¿¡é Œã§ãããµããã¡ã€ã³ã®ãã¿ãŒã³ã«äžèŽãããããã«æ£èŠè¡šçŸã䜿çšããããšãã§ããŸãããã ããã¯ã€ã«ãã«ãŒãããŒã¹ã®ãµããã¡ã€ã³æ€èšŒãå®è£ ããåã«ã¯ãã»ãã¥ãªãã£ãžã®åœ±é¿ãæ éã«æ€èšããŠãã ããã
2. ã¡ãã»ãŒãžããŒã¿ãæ€èšŒãã
ãªãªãžã³ãæ€èšŒããåŸã§ããã¡ãã»ãŒãžããŒã¿ã®åœ¢åŒãšå å®¹ãæ€èšŒããå¿ èŠããããŸããåä¿¡ããã¡ãã»ãŒãžã ãã«åºã¥ããŠãç²ç®çã«ã³ãŒããå®è¡ããããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã倿Žãããããªãã§ãã ããã
äŸïŒJavaScriptïŒïŒ
window.addEventListener('message', (event) => {
if (event.origin === 'https://origin-a.example.com') {
try {
const messageData = JSON.parse(event.data);
// Validate the structure and data types of the message
if (messageData.type === 'command' && typeof messageData.payload === 'string') {
console.log('Received valid command:', messageData.payload);
// Process the command
} else {
console.warn('Received invalid message format.');
}
} catch (error) {
console.error('Error parsing message data:', error);
}
}
});
ããŒã¿æ€èšŒã®äž»èŠãªæŠç¥ïŒ
- äºåå®çŸ©ãããã¡ãã»ãŒãžæ§é ã䜿çšããïŒ ã¡ãã»ãŒãžã«å¯ŸããŠæç¢ºã§äžè²«ããæ§é ã確ç«ããŸããããã«ãããå¿ é ãã£ãŒã«ãã®ååšãšãã®ããŒã¿åã容æã«æ€èšŒã§ããŸããJSONã¯ã¡ãã»ãŒãžãæ§é åããããã®äžè¬çã§é©åãªåœ¢åŒã§ãã
- åãã§ãã¯ïŒ ã¡ãã»ãŒãžãã£ãŒã«ãã®ããŒã¿åãæåŸ
ãšäžèŽããããšã確èªããŸãïŒäŸïŒJavaScriptã®
typeofã䜿çšïŒã - å ¥åã®ãµãã¿ã€ãºïŒ ã€ã³ãžã§ã¯ã·ã§ã³æ»æãé²ãããã«ãã¡ãã»ãŒãžå ã®ãŠãŒã¶ãŒæäŸããŒã¿ããµãã¿ã€ãºããŸããããšãã°ãããŒã¿ãDOMã«ã¬ã³ããªã³ã°ãããå Žåã¯ãHTMLãšã³ãã£ãã£ããšã¹ã±ãŒãããŸãã
- ã³ãã³ãã®ãã¯ã€ããªã¹ãåïŒ ã¡ãã»ãŒãžã«ãã³ãã³ãããŸãã¯ãã¢ã¯ã·ã§ã³ããã£ãŒã«ããå«ãŸããŠããå Žåã¯ãèš±å¯ãããã³ãã³ãã®ãã¯ã€ããªã¹ããç¶æãããããã®ã¿ãå®è¡ããŸããããã«ãããæ»æè ãä»»æã®ã³ãŒããå®è¡ããã®ãé²ããŸãã
3. å®å šãªã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã䜿çšãã
è€éãªããŒã¿æ§é ãéä¿¡ããå Žåã¯ãJSON.stringifyãJSON.parseã®ãããªå®å
šãªã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã¡ãœããã䜿çšããŠãã ãããeval()ãä»»æã®ã³ãŒããå®è¡ã§ããä»ã®ã¡ãœããã®äœ¿çšã¯é¿ããŠãã ããã
ãªãeval()ãé¿ããã¹ããïŒ
eval()ã¯æååãJavaScriptã³ãŒããšããŠå®è¡ããŸããä¿¡é Œã§ããªãããŒã¿ã«å¯ŸããŠeval()ã䜿çšãããšãæ»æè
ã¯æååã«æªæã®ããã³ãŒããæ³šå
¥ããã¢ããªã±ãŒã·ã§ã³ã䟵害ããå¯èœæ§ããããŸãã
4. éä¿¡ã®ã¹ã³ãŒããå¶éãã
éä¿¡ãã察話ããå¿ èŠãããç¹å®ã®ãªãªãžã³ãšãŠã£ã³ããŠã«å¶éããŸããä»ã®ãªãªãžã³ãšã®äžå¿ èŠãªéä¿¡ã¯é¿ããŠãã ããã
ã¹ã³ãŒããå¶éããããã®ãã¯ããã¯ïŒ
- ã¿ãŒã²ãããçµã£ãã¡ãã»ãŒãžã³ã°ïŒ ã¡ãã»ãŒãžãéä¿¡ããéã¯ãã¿ãŒã²ãããŠã£ã³ããŠãžã®çŽæ¥ã®åç
§ïŒäŸïŒiframeã®
contentWindowïŒãããããšã確èªããŠãã ããããã¹ãŠã®ãŠã£ã³ããŠã«ã¡ãã»ãŒãžããããŒããã£ã¹ãããã®ã¯é¿ããŠãã ããã - ãªãªãžã³åºæã®ãšã³ããã€ã³ãïŒ éä¿¡ãå¿ èŠãªè€æ°ã®ãµãŒãã¹ãããå Žåã¯ããªãªãžã³ããšã«å¥ã ã®ãšã³ããã€ã³ããäœæããããšãæ€èšããŠãã ãããããã«ãããã¡ãã»ãŒãžã誀ã£ãŠã«ãŒãã£ã³ã°ããããååãããããããªã¹ã¯ãæžå°ããŸãã
- çåœãªã¡ãã»ãŒãžïŒ å¯èœã§ããã°ãã¡ãã»ãŒãžã®å¯¿åœãæå°éã«æããããã«éä¿¡ãããã³ã«ãèšèšããŸããããšãã°ãã¬ã¹ãã³ã¹ãçæéã®ã¿æå¹ãªãªã¯ãšã¹ã-ã¬ã¹ãã³ã¹ãã¿ãŒã³ã䜿çšããŸãã
5. ã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒïŒCSPïŒãå®è£ ãã
ã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒïŒCSPïŒã¯ããã©ãŠã¶ãç¹å®ã®ããŒãžã«å¯ŸããŠããŒããèš±å¯ãããªãœãŒã¹ãå¶åŸ¡ã§ãã匷åãªã»ãã¥ãªãã£ã¡ã«ããºã ã§ããCSPã䜿çšããŠãã¹ã¯ãªãããã¹ã¿ã€ã«ããã®ä»ã®ãªãœãŒã¹ãããŒãã§ãããªãªãžã³ãå¶éã§ããŸãã
CSPãpostMessageã«ã©ã®ããã«åœ¹ç«ã€ãïŒ
- ãªãªãžã³ã®å¶éïŒ
frame-ancestorsãã£ã¬ã¯ãã£ãã䜿çšããŠãã©ã®ãªãªãžã³ãããŒãžãiframeã«åã蟌ãããšãèš±å¯ãããããæå®ã§ããŸããããã«ãããã¯ãªãã¯ãžã£ããã³ã°æ»æãé²ããã¢ããªã±ãŒã·ã§ã³ã«ã¡ãã»ãŒãžãéä¿¡ã§ããå¯èœæ§ã®ãããªãªãžã³ãå¶éã§ããŸãã - ã€ã³ã©ã€ã³ã¹ã¯ãªããã®ç¡å¹åïŒ
script-srcãã£ã¬ã¯ãã£ãã䜿çšããŠã€ã³ã©ã€ã³ã¹ã¯ãªãããçŠæ¢ã§ããŸããããã¯ãæªæã®ããã¡ãã»ãŒãžã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ã®ããXSSæ»æãé²ãã®ã«åœ¹ç«ã¡ãŸãã
CSPããããŒã®äŸïŒ
Content-Security-Policy: frame-ancestors 'self' https://origin-a.example.com; script-src 'self'
6. ã¡ãã»ãŒãžãããŒã«ãŒã®äœ¿çšãæ€èšããïŒäžçŽïŒ
è€æ°ã®ãªãªãžã³ãšã¡ãã»ãŒãžã¿ã€ããé¢ããè€éãªéä¿¡ã·ããªãªã§ã¯ãã¡ãã»ãŒãžãããŒã«ãŒã®äœ¿çšãæ€èšããŠãã ãããã¡ãã»ãŒãžãããŒã«ãŒã¯ä»²ä»åœ¹ãšããŠæ©èœããç°ãªããªãªãžã³éã§ã¡ãã»ãŒãžãã«ãŒãã£ã³ã°ããã»ãã¥ãªãã£ããªã·ãŒã匷å¶ããŸãã
ã¡ãã»ãŒãžãããŒã«ãŒã®å©ç¹ïŒ
- äžå åãããã»ãã¥ãªãã£ïŒ ã¡ãã»ãŒãžãããŒã«ãŒã¯ããªãªãžã³æ€èšŒãããŒã¿æ€èšŒãªã©ã®ã»ãã¥ãªãã£ããªã·ãŒã匷å¶ããããã®äžå€®ã®ãã€ã³ããæäŸããŸãã
- ç°¡çŽ åãããéä¿¡ïŒ ã¡ãã»ãŒãžãããŒã«ãŒã¯ãã¡ãã»ãŒãžã®ã«ãŒãã£ã³ã°ãšé ä¿¡ãåŠçããããšã§ããªãªãžã³éã®éä¿¡ãç°¡çŽ åããŸãã
- ã¹ã±ãŒã©ããªãã£ã®åäžïŒ ã¡ãã»ãŒãžãããŒã«ãŒã¯ãè€æ°ã®ãµãŒããŒã«ã¡ãã»ãŒãžã忣ãããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ãŒãªã³ã°ãæ¯æŽã§ããŸãã
7. 宿çã«ã³ãŒããç£æ»ãã
ã»ãã¥ãªãã£ã¯ç¶ç¶çãªããã»ã¹ã§ããpostMessageã«é¢é£ããæœåšçãªè匱æ§ã«ã€ããŠã宿çã«ã³ãŒããç£æ»ããŠãã ãããéçè§£æããŒã«ãæåã®ã³ãŒãã¬ãã¥ãŒã䜿çšããŠãã»ãã¥ãªãã£äžã®æ¬ é¥ãç¹å®ãä¿®æ£ããŸãã
ã³ãŒãç£æ»äžã«ç¢ºèªãã¹ãããšïŒ
- ãªãªãžã³æ€èšŒã®æ¬ åŠïŒ ãã¹ãŠã®ã¡ãã»ãŒãžãã³ãã©ãåä¿¡ã¡ãã»ãŒãžã®ãªãªãžã³ãæ€èšŒããŠããããšã確èªããŸãã
- äžååãªããŒã¿æ€èšŒïŒ ã¡ãã»ãŒãžããŒã¿ãé©åã«æ€èšŒããã³ãµãã¿ã€ãºãããŠããããšã確èªããŸãã
eval()ã®äœ¿çšïŒeval()ã®ã€ã³ã¹ã¿ã³ã¹ãç¹å®ããããå®å šãªä»£æ¿ææ®µã«çœ®ãæããŸãã- äžå¿ èŠãªéä¿¡ïŒ ä»ã®ãªãªãžã³ãšã®äžå¿ èŠãªéä¿¡ãåé€ããŸãã
å®éã®äŸãšã·ããªãª
ãããã®ãã¹ããã©ã¯ãã£ã¹ãã©ã®ããã«é©çšã§ãããã説æããããã«ãããã€ãã®å®éã®äŸãèŠãŠã¿ãŸãããã
1. Iframeãšãã®èŠªãŠã£ã³ããŠéã®å®å šãªéä¿¡
å€ãã®Webã¢ããªã±ãŒã·ã§ã³ã¯ãä»ã®ãªãªãžã³ããã®ã³ã³ãã³ããåã蟌ãããã«iframeã䜿çšããŸããããšãã°ã決æžã²ãŒããŠã§ã€ããŠã§ããµã€ãã®iframeã«åã蟌ãŸããŠããå ŽåããããŸããiframeãšãã®èŠªãŠã£ã³ããŠéã®éä¿¡ãä¿è·ããããšãéåžžã«éèŠã§ãã
ã·ããªãªïŒ payment-gateway.example.comã§ãã¹ããããŠããiframeããyour-website.comã§ãã¹ããããŠãã芪ãŠã£ã³ããŠã«æ¯æã確èªã¡ãã»ãŒãžãéä¿¡ããå¿
èŠããããŸãã
å®è£ ïŒ
Iframe (payment-gateway.example.com)ïŒ
// After successful payment
window.parent.postMessage({ type: 'payment_confirmation', transactionId: '12345' }, 'https://your-website.com');
芪ãŠã£ã³ã㊠(your-website.com)ïŒ
window.addEventListener('message', (event) => {
if (event.origin === 'https://payment-gateway.example.com') {
if (event.data.type === 'payment_confirmation') {
console.log('Payment confirmed. Transaction ID:', event.data.transactionId);
// Update the UI or redirect the user
}
}
});
2. ãªãªãžã³éã§ã®èªèšŒããŒã¯ã³ã®åãæ±ã
å Žåã«ãã£ãŠã¯ãç°ãªããªãªãžã³éã§èªèšŒããŒã¯ã³ãæž¡ãå¿ èŠããããããããŸãããããã«ã¯ãããŒã¯ã³ã®çé£ãé²ãããã®æ éãªåãæ±ããå¿ èŠã§ãã
ã·ããªãªïŒ ãŠãŒã¶ãŒãauth.example.comã§èªèšŒããapi.example.comã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸããèªèšŒããŒã¯ã³ã¯auth.example.comããapi.example.comã«å®å
šã«æž¡ãããå¿
èŠããããŸãã
å®è£ ïŒçåœãªã¡ãã»ãŒãžãšHTTPSã䜿çšïŒïŒ
auth.example.comïŒèªèšŒæååŸïŒïŒ
// Assuming api.example.com is opened in a new window
const apiWindow = window.open('https://api.example.com');
// Generate a short-lived, one-time-use token
const token = generateShortLivedToken();
apiWindow.postMessage({ type: 'auth_token', token: token }, 'https://api.example.com');
// Immediately invalidate the token on auth.example.com
invalidateToken(token);
api.example.comïŒ
window.addEventListener('message', (event) => {
if (event.origin === 'https://auth.example.com') {
if (event.data.type === 'auth_token') {
const token = event.data.token;
// Validate the token against a server-side endpoint (HTTPS ONLY!)
fetch('/validate_token', { method: 'POST', body: JSON.stringify({ token: token })})
.then(response => response.json())
.then(data => {
if (data.valid) {
console.log('Token validated. User is authenticated.');
// Store the validated token (securely - e.g., HTTP-only cookie)
} else {
console.warn('Invalid token.');
}
});
}
}
});
ããŒã¯ã³åãæ±ãã«é¢ããéèŠãªèæ ®äºé ïŒ
- HTTPSã®ã¿ïŒ èªèšŒããŒã¯ã³ãå«ããã¹ãŠã®éä¿¡ã«ã¯åžžã«HTTPSã䜿çšããŠãã ãããHTTPçµç±ã§ããŒã¯ã³ãéä¿¡ãããšãååãããå±éºããããŸãã
- çåœãªããŒã¯ã³ïŒ ããã«æå¹æéãåããçåœãªããŒã¯ã³ã䜿çšããŸããããã«ãããæ»æè ãããŒã¯ã³ãçãæ©äŒã®çªãå¶éãããŸãã
- ã¯ã³ã¿ã€ã ãŠãŒã¹ããŒã¯ã³ïŒ çæ³çã«ã¯ãäžåºŠãã䜿çšã§ããªãããŒã¯ã³ã䜿çšããŸããããŒã¯ã³ã䜿çšãããåŸããµãŒããŒäžã§ç¡å¹åãããã¹ãã§ãã
- ãµãŒããŒãµã€ãã§ã®æ€èšŒïŒ åžžã«ãµãŒããŒãµã€ãã§ããŒã¯ã³ãæ€èšŒããŸããã¯ã©ã€ã¢ã³ããµã€ãã®æ€èšŒã®ã¿ã«åºã¥ããŠããŒã¯ã³ãä¿¡é ŒããŠã¯ãããŸããã
- å®å šãªã¹ãã¬ãŒãžïŒ æ€èšŒæžã¿ã®ããŒã¯ã³ãå®å šã«ä¿åããŸãïŒäŸïŒHTTP-onlyã¯ãããŒãå®å šãªã»ãã·ã§ã³å ïŒãããŒã«ã«ã¹ãã¬ãŒãžã«ããŒã¯ã³ãä¿åããã®ã¯é¿ããŠãã ãããXSSæ»æã«å¯ŸããŠè匱ã ããã§ãã
çµè«
JavaScriptã®postMessage APIã¯ã¯ãã¹ãªãªãžã³éä¿¡ã«äŸ¡å€ã®ããããŒã«ã§ãããã»ãã¥ãªãã£è匱æ§ãé¿ããããã«ã¯æ
éãªå®è£
ãå¿
èŠã§ãããããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãWebã¢ããªã±ãŒã·ã§ã³ãXSSãCSRFãããŒã¿æŒæŽ©æ»æããä¿è·ã§ããŸããåä¿¡ã¡ãã»ãŒãžã®ãªãªãžã³ãšããŒã¿ãåžžã«æ€èšŒããå®å
šãªã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã¡ãœããã䜿çšããéä¿¡ã®ã¹ã³ãŒããå¶éãã宿çã«ã³ãŒããç£æ»ããããšãå¿ããªãã§ãã ããã
æœåšçãªãªã¹ã¯ãçè§£ãããããã®ã»ãã¥ãªãã£å¯Ÿçãå®è£
ããããšã§ãpostMessageã®åãæŽ»çšããŠãç°ãªããªãªãžã³ããã®ã³ã³ãã³ããšæ©èœãã·ãŒã ã¬ã¹ã«çµ±åãããå®å
šã§å
ç¢ãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã