
3åéããŒã¿ããŒã¹è¬åº§ 第9å: WebãšããŒã¿ããŒã¹ãã€ãªãïŒïœããŒã¿ããŒã¹é£æºã®åºæ¬ïœ
ç»å Žäººç©ïŒ
ãã£ããå çïŒéç§°:å çïŒïŒ ãªããžã§ã¯ãæåãã¹ã¿ãŒãæè¿ã¯ããŒã¿ããŒã¹ã®äžçã«ã詳ããã
ããã婿ïŒéç§°:ãããåïŒïŒ ããã°ã©ãã³ã°ãå§ããã°ããã®è¥æãããŒã¿ããŒã¹ã¯ãŸã æªç¥ã®äžçã
ãããåïŒ å çãä»ãŸã§ããŒã¿ããŒã¹ã®èšèšãæäœããããŠãããã®æã®å¯ŸçãŸã§åŠãã§ããŸãããã§ããå®éã«Webãµã€ããã¢ããªã§ã©ããã£ãŠäœ¿ãã®ãããŸã ã€ã¡ãŒãžãæ¹§ããªãã§ãã
å çïŒ è¯ã質åã ãããããåïŒåãä»ãŸã§ã«åŠãã ã®ã¯ãããã°æçã®é£æã®éžã³æ¹ãäžããããã®ä»æ¹ã ã仿¥ã®ããŒãã¯ããã®é£æïŒããŒã¿ïŒã䜿ã£ãŠãå®éã«æçïŒWebã¢ããªã±ãŒã·ã§ã³ïŒãäœãæ¹æ³ãã€ãŸããWebãšããŒã¿ããŒã¹ã®é£æºãã«ã€ããŠã ã
ãããåïŒ ããïŒã§ãå çããã®åãã3åéããã°ã©ãã³ã°è¬åº§ãã®ç¬¬14åã§ãSpring Data JPAã䜿ã£ãŠããŒã¿ããŒã¹é£æºã«ã€ããŠåŠã³ãŸããããïŒ
å çïŒ çŽ æŽãããïŒããèŠããŠãããïŒãã®éãã ã第14åã§ã¯ãJavaã®èŠç¹ããO/Rãããã³ã°ã䜿ã£ãŠãããã«ç°¡åã«ããŒã¿ããŒã¹ãæäœã§ããããšããããã°ã©ãã³ã°ã®ãææ³ããåŠãã ã
å çïŒ ä»æ¥ã¯ãããããäžæ©èžã¿èŸŒãã§ãããŒã¿ããŒã¹ã®èŠç¹ãããWebã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«ããŒã¿ããŒã¹ãšç¹ãã£ãŠããã®ãããããå°ãæ·±ãæãäžããŠãããã
ãåçŽã1. Webã¢ããªã±ãŒã·ã§ã³ãšããŒã¿ããŒã¹ã®é¢ä¿
å çïŒ ã»ãšãã©ã®Webã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒã®èŠæ±ã«å¿ããŠåçã«ã³ã³ãã³ããçæããŠããããã®ãšãã**ããŠãŒã¶ãŒã®èŠæ±ããšãããŒã¿ããŒã¹ã**ãã€ãªãã®ããWebã¢ããªã±ãŒã·ã§ã³ã®ããã°ã©ã ã ã
ããšãã°ãECãµã€ãã§ãŠãŒã¶ãŒãååæ€çŽ¢ããããšããWebã¢ããªã±ãŒã·ã§ã³ã¯ä»¥äžã®æé ã§åããŠããã
ãŠãŒã¶ãŒã®èŠæ±: ãã©ãŠã¶ã§åååãæ€çŽ¢ãã©ãŒã ã«å ¥åããã
Webã¢ããªã±ãŒã·ã§ã³: ãŠãŒã¶ãŒã®å ¥åå 容ãåãåãã
ããŒã¿ããŒã¹ãžã®åãåãã: ããã°ã©ã ãSQLæã䜿ã£ãŠãããŒã¿ããŒã¹ã«åãåããããããã®åååã«äžèŽããããŒã¿ããã ããããšèŠæ±ããããã ã
ããŒã¿ããŒã¹ããã®å¿ç: ããŒã¿ããŒã¹ã¯ã該åœããããŒã¿ãWebã¢ããªã±ãŒã·ã§ã³ã«è¿ãã
Webã¢ããªã±ãŒã·ã§ã³: åãåã£ãããŒã¿ã䜿ã£ãŠãWebããŒãžïŒHTMLïŒãåçã«çæãããŠãŒã¶ãŒã®ãã©ãŠã¶ã«è¡šç€ºããã
ãã®äžé£ã®æµãã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®æ ¹å¹¹ããªããã®ã ã
ãäžçŽã2. ããŒã¿ããŒã¹æ¥ç¶ãšSQLã€ã³ãžã§ã¯ã·ã§ã³å¯Ÿç
å çïŒ ããã°ã©ã ããããŒã¿ããŒã¹ã«æ¥ç¶ããããã«ã¯ããã³ãã¯ã·ã§ã³ïŒæ¥ç¶ïŒãã確ç«ããå¿ èŠããããå€ãã®ããã°ã©ãã³ã°èšèªã«ã¯ãããŒã¿ããŒã¹ãæäœããããã®å°çšã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãçšæãããŠãããããã§ã¯ãååã®ã3åéããã°ã©ãã³ã°è¬åº§ãã§åŠãã Springãã¬ãŒã ã¯ãŒã¯ãåæãšããŠãå ·äœçãªããŒã¿ããŒã¹é£æºãèŠãŠãããã
ãããåïŒ Springãã¬ãŒã ã¯ãŒã¯ã£ãŠãããŒã¿ããŒã¹ãšã®é£æºãç°¡åã«ããŠããããã§ãããïŒ
å çïŒ ããã ïŒååã®ããã°ã©ãã³ã°è¬åº§ã§åŠãã ãO/Rãããã³ã°ãããSpring Data JPAãã¯ãããŒã¿ããŒã¹é£æºããããå®å šã«ãããç°¡åã«ããããŠDIãšãã£ãä»ã®Springã®æ©èœãšã·ãŒã ã¬ã¹ã«é£æºãããããã®æè¡ãªãã ã
ãããåïŒ ãªãã»ã©ïŒTaskãšããã¯ã©ã¹ãäœã£ãŠãtaskRepository.save(task)ãšããã ãã§ãããŒã¿ããŒã¹ã«ä¿åã§ããã®ã¯ãããããä»çµã¿ã®ãããã ã£ããã§ããïŒ
å çïŒ ãã®éãïŒãããŠããã®è£åŽã§Springãèªåã§è¡ã£ãŠãããŠããã®ãã仿¥ã®ããŒãã®ãããŒã¿ããŒã¹ãžã®æ¥ç¶ããšãSQLã®å®è¡ããªãã ãç¹ã«æ³šæãå¿ èŠãªã®ãããŠãŒã¶ãŒã®å ¥åå 容ãçŽæ¥SQLã«å«ããŠããŸãããšã§èµ·ãããSQLã€ã³ãžã§ã¯ã·ã§ã³ãæ»æã ã
å±éºãªäŸïŒçµ¶å¯Ÿã«ç䌌ããªãã§ïŒïŒ
// â ïž å±éºãªäŸïŒçµ¶å¯Ÿã«ç䌌ããªãã§ïŒïŒ
// ãŠãŒã¶ãŒã "'; DROP TABLE users; --" ãšå
¥åãããšãã
String query = "SELECT * FROM products WHERE name = '" + user_input + "'";
// å®è¡ãããSQL: SELECT * FROM products WHERE name = ''; DROP TABLE users; --'
å®å šãªäŸïŒæšå¥šïŒ
å çïŒ ãã®ãããªæ»æãé²ãããã«ã¯ããããªãã¢ãã¹ããŒãã¡ã³ãããšããä»çµã¿ã䜿ãããšãæã广çã ãããã¯ãSQLæãšãŠãŒã¶ãŒã®å ¥åå€ãåé¢ããŠæ±ãããšã§ãå ¥åå€ãåãªããããŒã¿ããšããŠæ±ãããäžæ£ãªSQLæãšããŠè§£éãããããšããªããªããSpring Data JPAã¯ããã®ããªãã¢ãã¹ããŒãã¡ã³ããå éšã§èªåçã«äœ¿ã£ãŠãããããå®å šãªãã ã
ãäžçŽã3. ããŒã¿ããŒã¹æ¥ç¶ç®¡çã®æé©å
å çïŒ ããŒã¿ããŒã¹ãžã®æ¥ç¶ã¯ãæ¯å確ç«ããã®ã«ã³ã¹ããããããWebã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããããã®ãªã¯ãšã¹ããåæã«çºçãããããå¹ççãªæ¥ç¶ç®¡çãéèŠã ã
1. åºæ¬çãªæ¥ç¶ïŒåŠç¿æ®µéïŒ:
1ãªã¯ãšã¹ãããšã«æ¥ç¶ã確ç«ããåŠçãçµãã£ããåæããã
泚æ: ãã®æ¹æ³ã¯ãããŸã§åŠç¿çšã ãå®åã®ãã«ãã¹ã¬ããç°å¢ã§ã¯ãæ¥ç¶ãç«¶åãããã絶察ã«é¿ããããšã
2. æ¥ç¶ããŒã«ïŒå®å段éïŒ:
ãããããè€æ°ã®æ¥ç¶ã確ç«ããŠãããå¿ èŠã«å¿ããŠããŒã«ããæ¥ç¶ãåãåºããŠäœ¿çšããã䜿ãçµãã£ããããŒã«ã«æ»ãã
å©ç¹: æ¥ç¶ã®ç¢ºç«ã»åæã³ã¹ããæãã€ã€ãè€æ°ã®ãªã¯ãšã¹ããå¹ççã«åŠçã§ããã
泚æ: å®éã®éçšã§ã¯ãæå€§æ¥ç¶æ°ãã¿ã€ã ã¢ãŠãå€ã¯DBãµãŒããŒã®æ§èœãåææ¥ç¶æ°ã«å¿ããŠãã¥ãŒãã³ã°ãå¿ èŠã«ãªãã
ãããåïŒ ã3åéããã°ã©ãã³ã°è¬åº§ãã®æãapplication.ymlãã¡ã€ã«ã§hikariã®èšå®ãããã®ãèŠããŠããŸãïŒãããæ¥ç¶ããŒã«ã ã£ããã§ããïŒ
å çïŒ ãã®éãïŒSpring Bootã¯ããã©ã«ãã§HikariCPãšããé«éãªæ¥ç¶ããŒã«ã©ã€ãã©ãªã䜿ã£ãŠãããåãapplication.ymlã«èšå®ãèšè¿°ããã ãã§ãSpringãèªåã§æé©ãªæ¥ç¶ããŒã«ã管çããŠããããã ã
ãå®è·µã4. ãããããã©ãã«ãšè§£æ±ºç
ãããåïŒ å çãã³ãŒããæžããŠãããšãæ¥ç¶ãé »ç¹ã«ã¿ã€ã ã¢ãŠãããããã¡ã¢ãªäœ¿çšéãå¢ãç¶ãããããããšããããã§ããããããæãã©ãããã°ãããã§ããããïŒ
å çïŒ ãã質åã ãããããåãããã¯ããŒã¿ããŒã¹é£æºã§ãããããã©ãã«ã ãäžã€ãã€èŠãŠãããã
ãããåïŒ ãæ¥ç¶ãé »ç¹ã«ã¿ã€ã ã¢ãŠããããã£ãŠã©ãããããšã§ããïŒ
å çïŒ ããã¯ãã¢ããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹æ¥ç¶ãå¿ èŠãšãããšãã«ãããŒã«ã«å©çšå¯èœãªæ¥ç¶ããªãããŸãã¯æ¥ç¶ãåæãããŠããŸã£ãŠããå Žåã«èµ·ããããããªæã¯ãmaximum-pool-sizeãå¢ããããpool-pre-pingãæå¹ã«ããŠæ¥ç¶ã®å¥å šæ§ã確èªãããšè¯ãã
ãããåïŒ ãããããã¡ã¢ãªäœ¿çšéãå¢ãç¶ãããã®ã¯ïŒ
å çïŒ ããã¯ãååŸããããŒã¿ãã¡ã¢ãªã«æºã蟌ã¿ãããŠããããæ¥ç¶ãã«ãŒãœã«ãé©åã«ã¯ããŒãºãããŠããªãå Žåã«èµ·ããããšãå€ããSpring Data JPAã¯ãããã®ãªãœãŒã¹ç®¡çãå©ããŠãããããN+1åé¡ãé å»¶ããŒããšãã£ãåé¡ã§å€§éã®ã¯ãšãªãçºè¡ãããããäžèŠãªããŒã¿ãŸã§ãã§ããããŠããŸããæ§èœåé¡ã«ç¹ããããšããããã¯ãšãªèšèšããã§ããæŠç¥ãé©åã«èããããšãéèŠã ã
ãã»ãã¥ãªãã£ã5. ããŒã¿ããŒã¹é£æºã«ãããã»ãã¥ãªãã£ã®å šäœå
å çïŒ SQLã€ã³ãžã§ã¯ã·ã§ã³ã¯ããŒã¿ããŒã¹ã®ã»ãã¥ãªãã£ãªã¹ã¯ã®ä»£è¡šäŸã ããWebã¢ããªã±ãŒã·ã§ã³å šäœã§ã»ãã¥ãªãã£ãèããå¿ èŠãããã
DBå±€: SQLã€ã³ãžã§ã¯ã·ã§ã³å¯ŸçïŒããªãã¢ãã¹ããŒãã¡ã³ãïŒãæå°æš©éã®ååïŒå¿ èŠãªæš©éã ããäžããïŒã
Webã¢ããªå±€: **XSSïŒã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒãCSRFïŒã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªïŒ**ãšãã£ãè匱æ§å¯Ÿçã
ãããã¯ãŒã¯å±€: éä¿¡ã®æå·åïŒSSL/TLSïŒã
å çïŒ ãããã¯ããããç°ãªã察çãå¿ èŠã ããçµã¿åãããŠå®ãããšã§ãããå®å šãªã¢ããªã±ãŒã·ã§ã³ãäœãããšãã§ããã
6. ãŸãšããšæ¬¡åã®äºå
å çïŒ ä»æ¥ã®ãŸãšãã ã
WebãšããŒã¿ããŒã¹ã®é£æº: Webã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒã®èŠæ±ãããŒã¿ããŒã¹ã«äŒããåãåã£ãããŒã¿ã䜿ã£ãŠåçãªããŒãžãçæããã
Springã®åœ¹å²: Springãã¬ãŒã ã¯ãŒã¯ã¯ãããŒã¿ããŒã¹ãžã®æ¥ç¶ãSQLã®å®è¡ãæ¥ç¶ããŒã«ããããŠSQLã€ã³ãžã§ã¯ã·ã§ã³å¯Ÿçãšãã£ãå€ãã®äœæ¥ãèªåã§è¡ã£ãŠãããã
Spring Data JPA: JpaRepositoryãç¶æ¿ããã ãã§ãåºæ¬çãªCRUDæäœãå©çšå¯èœã«ãªãããã¯ãšãªèšèšã誀ããšæ§èœåé¡ã«ç¹ããããšãããã
æ¥ç¶ç®¡ç: 髿§èœãªã¢ããªã±ãŒã·ã§ã³ã§ã¯æ¥ç¶ããŒã«ã䜿ãããSpring Bootã§ã¯HikariCPãããã©ã«ãã§æ¡çšãããŠããã
å çïŒ ãããŸã§ã®åŠã³ã掻ããã°ãã·ã³ãã«ãªWebã¢ããªã±ãŒã·ã§ã³ãªãäœããããã«ãªãã¯ãã ãæ¬¡åã¯ãããããããŒã¿ããŒã¹è¬åº§ã®æçµåããããŸã§ã®åŠã³ãæ¯ãè¿ã£ãŠãå®éã®éçºã«ãããããŒã¿ããŒã¹ã®åœ¹å²ãšãããããã®åŠç¿ã®æ¹åæ§ã«ã€ããŠè©±ããŠãããã
次åïŒç¬¬10å: ããŒã¿ããŒã¹ã®æªæ¥ãšåŠç¿ã®æ
ãžïœæçµåïœ
#ããŒã¿ããŒã¹ #SQL #Webã¢ããªã±ãŒã·ã§ã³ #ããŒã¿ããŒã¹é£æº #Spring #JPA #SQLã€ã³ãžã§ã¯ã·ã§ã³ #ã»ãã¥ãªã㣠#ããã°ã©ãã³ã°åŠç¿