å°ãåãŸã§ãHabréã®
æçš¿ã¯YiiãšåŒã°ããæ°ããPHPãã¬ãŒã ã¯ãŒã¯ã®åºçŸãã¹ãããããŸããã
ç¥ãåãã«ãªã£ãŠããããã®ãã¬ãŒã ã¯ãŒã¯ã¯èå³æ·±ããææã§ãç§ã«ãšã£ãŠæ³šç®ã«å€ããããã«æããŸããã
Daniel Carreraã¯æè¿ãCakePHPãCodeIgniterãããã³Yiiã®æ¯èŒã«é¢ãã
ãPHPãã¬ãŒã ã¯ãŒã¯ã®æ¯èŒããšããèå³æ·±ãèšäºãããã°ã«æçš¿ããŸããã
ãã·ã¢èªã話ãïŒè±èªãèªããªãïŒäººã
ã®éã§Yiiãæ®åãããããã«ãç§ã¯ç¿»èš³ãè¡ãããšã«ããŸããã
泚æïŒæ¬åœã«ããããã®æçŽããããŸãã
-
å
容
- ã·ã³ãã«ã
- ããã¥ã¡ã³ã
- æ§èœ
- æè»æ§
- å®å
šæ§
- ãã®ä»ã®ã³ã¡ã³ã
- ãŸãšã
-
ã·ã³ãã«ã
ã¢ããªã±ãŒã·ã§ã³ãäœæããåã«ãã¬ãŒã ã¯ãŒã¯ã®åçŽããå€æããããšã¯å°é£ã§ãããããã¥ã¡ã³ãã«åºã¥ããŠããã€ãã®ã³ã¡ã³ããããããšãã§ããŸãã
Cakephpã€ã³ã¹ããŒã«ïŒææžåãããŠããªãApacheã§åé¡ãçºçããŠããŸãã ãRewriteBaseãã³ãã³ããè¿œå ããã«ã¯ã3ã€ã®.htaccessãã¡ã€ã«ãç·šéããå¿
èŠããããŸããã
䜿çšïŒãã«ããŒãã¢ã¯ã·ã§ã³ãæ¯ãèããã¬ã€ã¢ãŠããã³ã³ããŒãã³ã...ããã°ã©ã ãæžãããã«ã¯ãããããã¹ãŠãæ¬åœã«ç¥ãå¿
èŠããããŸããïŒ ã±ãŒãã¿ãã
æé«ã®ãšã³ããªãŒãããå€ã§ãããçŸæç¹ã§ã¯ãä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯æäŸãããªãç¹å¥ãªæ©èœã¯ãããŸããã
ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãããã©ã«ãã®ã¬ã€ã¢ãŠããšCSSãä»å±ããŠããŸãã ãã¹ãã®ç®çã§ãåãã¬ãŒã ã¯ãŒã¯ãå¿
èŠãªããšã ããè¡ãããã«ããããåãé€ãå¿
èŠããããŸããã CakePHPã®å Žåãã©ã®ãã¶ã€ã³ãã¡ã€ã«ã䜿çšãããããèŠã€ããã®ã¯éåžžã«é£ããããšãããããŸããã ããã¯éè«ççãªå Žæã§ããïŒç§ã®ã¢ããªã±ãŒã·ã§ã³ãã£ã¬ã¯ããªå
ïŒã
CodeIgniterã€ã³ã¹ããŒã«ïŒç°¡åã ãã¡ã€ã«ã解åããã ãã§æºåå®äºã§ãã
䜿çšæ³ïŒ CodeIgniterã¯ååã«åçŽãªããã§ãã ããã¥ã¡ã³ãã«ã¯ããããçãçç±ã¯ãããŸããã ç§ã®hello-worldã¢ããªã±ãŒã·ã§ã³ã¯ãCakeã䜿çšããå Žåãããã¯ããã«é«éã«æºåã§ããŸããã äžè¬ã«ãCIã®ãšã³ããªã®ãããå€ã¯äœããªããŸãã
ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãããã©ã«ãã®ã¬ã€ã¢ãŠããšCSSãä»å±ããŠããŸãã ãã¹ãã®ç®çã§ãåãã¬ãŒã ã¯ãŒã¯ãå¿
èŠãªããšã ããè¡ãããã«ããããåãé€ãå¿
èŠããããŸããã CIã®å Žåãããã¯æ°ãããã¥ãŒãäœæãããšãã«èªåçã«çºçããŸããã CIã¯ãããããããã«æ±ããããªãéãããã¶ã€ã³ãæ¿å
¥ããŸããã
Yiiã€ã³ã¹ããŒã«ïŒç°¡åã ã«ãŒãWebãã£ã¬ã¯ããªãäœæããã«ã¯ãyiicãå®è¡ããå¿
èŠããããŸãã PHPããŒãžã§ã³ïŒyiic.phpïŒããããsshã«ã¢ã¯ã»ã¹ã§ããªãå Žåã«é©ããŠããŸãã Yiicã¯ããææžåãããŠããŸãã
䜿çšæ³ïŒ Yiiãã·ã³ãã«ã§ããããããããã«èŠããŸããããããCodeIgniterãããããå°ãªãã§ãããã ç§ã®ããããŒã¯ãŒã«ããã¯ãCIã®å Žåãšã»ãŒåãéãã§äœæãããŸããã
ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãããã©ã«ãã®ã¬ã€ã¢ãŠããšCSSãä»å±ããŠããŸãã ãã¹ãã®ç®çã§ãåãã¬ãŒã ã¯ãŒã¯ãå¿
èŠãªããšã ããè¡ãããã«ããããåãé€ãå¿
èŠããããŸããã Yiiã§ã¯ãéåžžã«ç°¡åã§ããã èšèšãã¡ã€ã«ã¯è«ççãªå Žæã«ãããååã«ææžåãããŠããŸãã
Smartyãªã©ã®ãã³ãã¬ãŒãèšèªãåŠã¶å¿
èŠã®ãããã¬ãŒã ã¯ãŒã¯ã¯ãªãããšãå ±åã§ããŠå¬ããã§ãã PHPèªäœã¯åªãããã³ãã¬ãŒããšã³ãžã³ã§ãã ç§ã¯æ°å¹ŽéSmartyã䜿çšããŸããããççŽã«èšã£ãŠãã¡ãªãããããåé¡ã®æ¹ãå€ããšæããŸãã YiiãšCodeIgniterãä»å±ããŠããããšã«æ³šæããŠãã ãã
ç¹ã«å¥œããªäººã®ããã®ãªãã·ã§ã³ã®ãã³ãã¬ãŒããšã³ãžã³ã ããããç§ãèšã£ãããã«ãããã¯ãªãã·ã§ã³ã§ãã
çµæïŒ CodeIgniterãæãã·ã³ãã«ã§ãYiiãããã«ç¶ããŸãã
ãã¹ãã®2çªç®ã®éšåã§ãããã¿ã€ãã¢ããªã±ãŒã·ã§ã³ãäœæãããŸã§ãæçµå€å®ã延æããŸãã
-
ããã¥ã¡ã³ã
æ¹å€ããŠãã ããã ããã¥ã¡ã³ãã¯éåžžãå®éã«ã¢ããªã±ãŒã·ã§ã³ãäœæããŠãããšãã«å°ãç°ãªã£ãŠèŠãå§ããŸãã äžæ£ç¢ºãŸãã¯äžå®å
šãªå Žåã¯ãäœæ¥ãéå§ãããŸã§ãã®ããšãç¥ããŸããã ãããŸã§ããã¹ãæžã¿ãã¬ãŒã ã¯ãŒã¯çšã«äœæããã¢ããªã±ãŒã·ã§ã³ã¯hello worldã®ã¿ã§ãã
Cakephpç§ã®ç¬¬äžå°è±¡ã¯ããžãã£ãã§ããã ããã¥ã¡ã³ãã¯å®å
šã§èªã¿ãããããã«èŠããŸãã ãã¥ãŒããªã¢ã«ãèŠã€ããã®ã¯ããªãå°é£ã§ããïŒãããã¯ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®ã»ã¯ã·ã§ã³ã§çµãããŸããïŒã ãhello worldããæžãããšããåé¡ïŒ404ãšã©ãŒïŒã«ééããŸããããããã¯ããã¥ã¡ã³ãã«èšèŒãããŠããŸããã§ããã ããã解決ããã«ã¯ã.htaccesãã¡ã€ã«ãç·šéããå¿
èŠããããŸããã ããã¥ã¡ã³ãã®ããã©ãã«ã·ã¥ãŒãã£ã³ã°ãã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã ããã«ãããã©ã«ãã§Cakeã«ååšããããŒã·ã§ã³ïŒããããŒãããã¿ãŒãã¹ã¿ã€ã«ïŒãåãé€ãæ¹æ³ãç解ããããšã¯éåžžã«å°é£ã§ããã
CodeIgniter第äžå°è±¡ã¯åã³ããžãã£ãã§ããã ãhello worldããæžãããšã¯ãCakeãããã¯ããã«çãæéã§ããã ãã®çç±ã¯ãCIã®æ¹ãåçŽã ããã ãšæããŸãããããã¥ã¡ã³ãã圱é¿ãäžããŠãããšæããŸãã
Yiiç¹°ãè¿ãã«ãªããŸãããç§ã®æåã®å°è±¡ã¯è¯å®çã§ããããŒã¯ãŒã«ããéåžžã«è¿
éã«æžããŸããã ãã®åŸãYiiãããŒãžããããã«ããããã«æ¥ç¶ããè¿œå ã®ããŒã·ã§ã³ãåãé€ããŸããã ãã®æ¹æ³ãèŠã€ããã®ã¯éåžžã«ç°¡åãã€è¿
éã§ããã
çµæïŒçŸæç¹ã§ã¯ãå€æããã®ã¯é£ããã§ãã
ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯åªããããã¥ã¡ã³ããããããã§ãã Cakeã«ã¯ããã€ãã®åé¡ããããŸããããä»ã®ãšããã¯ã£ãããšã¯èšããŸããã
-
æ§èœ
ãã®ããŒãã§ã¯ã2ã€ã®ããã©ãŒãã³ã¹ãã¹ãã«ã€ããŠèª¬æããŸãã 1ã€ã¯ç§ã«ãã£ãŠããã1ã€ã¯YiiããŒã ã«ãã£ãŠè¡ãããŸããã äž¡æ¹ãšã泚ç®ã«å€ãããšæããŸãã
äž»ãªé¡äŒŒç¹ïŒäž¡æ¹ã®ãã¹ãã¯ãåãã¬ãŒã ã¯ãŒã¯ã®æå°ãªãŒããŒããããæšå®ããããšããŸãã ãã®ãã¬ãŒã ã¯ãŒã¯ã®ç®æšã¯ããHello Worldããããããããšã§ãã
äž»ãªéãïŒåãã¬ãŒã ã¯ãŒã¯ã®ããã©ã«ãæ§æã䜿çšããŸããã YiiããŒã ã¯ãåãã¬ãŒã ã¯ãŒã¯ãæé©åããŠãHello Worldãã§ããã ãæ©ã衚瀺ããããšããŸããã
Yiiããã®ãã¹ãã¯dieïŒïŒã®ã¿ãå®è¡ããŸãã Mineã¯MVCã䜿çšããŸããã³ã³ãããŒã©ãŒã¯å€æ°ããHello Worldãã«èšå®ããã¡ã€ã³HTMLããŒãžã§åºåããããã«ãã¥ãŒã«æž¡ãããŸãã
Yiiã¯ãã¹ãå°çšã®ãµãŒããŒã䜿çšããå®éã®ã¢ããªã±ãŒã·ã§ã³ããã¹ãããå
±æãã¹ãã£ã³ã°ã䜿çšããŸããã
ãã®ãããYiiããŒã ã®ãã¹ãã¯æè¡çã«ã¯ããæ£çŽã§ãããå®éã®åäœãããããåæ ããŠããŸãã
ãã€ãã®ããã«ããã¹ãŠã®ãã¹ãã¯æ¹å€çã«è¡ãããã¹ãã§ãã
çµæã¯1ç§ãããã®ãªã¯ãšã¹ãæ°ïŒRPSïŒã§è¡šããããããå€ã倧ããã»ã©åªããŠããŸãã
ãã¹ãã®è©³çŽ°ïŒYiiãŠã§ããµã€ãã®
ãã®ããŒãžã§ã¯ããã¹ãã«ã€ããŠèª¬æããŠããŸãã ç§ã®ãã¹ãã§ã¯ãåãã¬ãŒã ã¯ãŒã¯ã«ã¯ãã¥ãŒã«æ¬¡ã®ã³ãŒããå«ãŸããŠããŸããã

å€æ°
$ã¡ãã»ãŒãžã¯ã³ã³ãããŒã©ãŒã«ãã£ãŠæäŸããããã®å€ã¯ãHello Worldãã§ãã 1ç§ãããã®ãªã¯ãšã¹ãæ°ã¯ãApacheBenchãŠãŒãã£ãªãã£ãšãab -t 30 -c 10 URLããã©ã¡ãŒã¿ãŒã䜿çšããŠæ±ºå®ãããŸããã ç§ã®ãã¹ãç°å¢ã¯ã次ã®ãã©ã¡ãŒã¿ãŒã䜿çšããå
±æãã¹ãã£ã³ã°ã§ãã
* CentOS 4 Enterprise Linuxã
* Apache 2
* PHP 5.2.6
* CPUïŒã¯ã¢ããã³ã¢AMD OpteronïŒtmïŒããã»ããµãŒ2350
*ã¡ã¢ãªïŒ8GB
çµè«ïŒ YiiãšCIã¯ã©ã¡ããé床ã®ç¹ã§éç«ã£ãŠããŸããã Yiiã«ã¯ããã€ãã®å©ç¹ããããããããŸãããã確ãã«èšãã®ã¯é£ããã§ãã
-
æè»æ§
CakephpCakePHPã¯æ
£ç¿ã«éåžžã«é¢ä¿ããŠããŸãã 圌ã¯ããªãã«ãã¡ã€ã«ãã¯ã©ã¹ãããŒã¿ããŒã¹ãã¡ãœãããªã©ã®ç¹å®ã®åœåãæåŸ
ããŠããŸãã ä»ã®ãšããããããç§ã«ãšã£ãŠåé¡ã«ãªããã©ããã¯èšããŸããããããã¯èµ·ããå¯èœæ§ããããŸãã
CodeIgniterãšYiiCodeIgniterãšYiiã¯ã©ã¡ããéåžžã«æè»ã«èŠããŸãã ããã¥ã¡ã³ããèŠããšãäžæ¹ãä»æ¹ããã確å®ã«æè»ã§ãããšèšãã®ã¯åé¡ã§ãã
ã©ã¡ããMVCãã¿ãŒã³ã䜿çšããŸããããã®ç¹ã«é¢ããŠã¯å³å¯ã§ã¯ãªãããã§ãã CakePHPã¯YiiãCIãããã¯ããã«èŠçŽã«äŸåããŠããŸãã
é¡äŒŒç¹ãšçžéç¹ã®äŸïŒ
*åãã¬ãŒã ã¯ãŒã¯ã§ã¯ãã³ã³ãããŒã©ãŒã®åœåèŠåã«åŸãããšãæåŸ
ãããŠããŸãã
* CakePHPã¯ãããã°ã©ã ã§äœ¿çšãããŠããªãå Žåã§ããã¢ãã«ãããŒã¿ããŒã¹ãããŒãã«ãäœæããå¿
èŠããããŸãã
* Cakeèªäœã¯ãã³ã³ãããŒã©ãŒã®ååã«åºã¥ããŠãã¥ãŒãèªåçã«åŒã³åºããŸãã CIããã³Yiiã§ã¯ãæ瀺çã«ãã¥ãŒãåŒã³åºããããCakeã®èŠåãæ§æãããåªå
ãããŸãã ãŸããCIããã³Yiiã§ã¯ãè€æ°ã®ãã¥ãŒãåŒã³åºãããšãã§ããŸãã
ãµã³ãã«ã³ãŒãã次ã«ç€ºããŸãã

ã芧ã®ãšãããCIãšYiiã®ããŒãžã§ã³ã¯CakePHPãããè€éã§ã¯ãªãããã§ããããã«ãè¿œå æ©èœããããŸã-è€æ°ã®ãã¥ãŒãã¡ã€ã«ãã¢ããããŒãã§ããŸãã ããšãã°ãç¹å¥ãªããããŒãããŒããããããŠã£ãžã§ãããæ¿å
¥ãããã§ããŸãã
çµæïŒ CodeIgniterãšYiiã¯ã©ã¡ããããæè»ã«èŠããŸãã çŸæç¹ã§ã¯ãã©ã¡ããããæè»ããå€æããããšã¯ã§ããŸããã
-
å®å
šæ§
ããŸããŸãªçš®é¡ã®æ»æãååšãããããã»ãã¥ãªãã£ã¯è€éãªãããã¯ã§ãã ãã®æ®µèœã¯éåžžã«èšå€§ã§ããããã®ãããã¯ã«åºå·ããããã«ããŸãã ãã®æ®µèœã¯ããã¬ãŒã ã¯ãŒã¯ã®æ©èœãšæ»æã®çš®é¡ã«å¿ããŠéšåã«åããããŸãã
ã¢ã¯ã»ã¹å¶åŸ¡ããã§ã®äºåæ
å ±-
èªèšŒãš
æ¿èª ã
CakephpCakePHPã®ã¢ã¯ã»ã¹å¶åŸ¡ã·ã¹ãã ã¯ç解ãã«ããããšãããããŸããã ã³ãŒããžã§ãã¬ãŒã¿ãŒïŒãã±ãŒããã€ã¯ãïŒã
䜿çšããŠãã¹ããŒããã¡ã€ã«ãš
ã¢ã¯ã»ã¹å¶åŸ¡ãªã¹ã ïŒACLïŒãçæããŸãããã®ããã»ã¹ã¯è€éã«èŠããŸãã ããã€ãã®çšèªïŒACOãAROããªã¯ãšã¹ã¿ãŒïŒã§å®å
šã«çµäºããŸããã
ã¢ã¯ã»ã¹å¶åŸ¡ã«ã¯æ³šæãå¿
èŠã ãšæã£ãŠããŸããããCakeã§ã¯äºæ³ä»¥äžã«è€éã§ããã ãšãŠã匷åã«èŠããŸããã䜿ãã«ããã§ãã ç§ã¯ããã»ã¹ãã³ã³ãããŒã«ããŠããªããšæããäœãèµ·ãã£ãŠããã®ãç解ã§ããŸããã§ããã ãããŠãã»ãã¥ãªãã£ã¯ãŸãã«ç§ãã³ã³ãããŒã«ããããã®ã§ãããããç解ããããã®ã§ãã
ã¯ã€ãã¯ãã¹ã ïŒ
ãã¹ã¯ãŒãã®åŒ·åºŠã
匷åããæ¹æ³ãããããŸããã ãã¥ãŒããªã¢ã«ã§ã¯ãèªåã§ãã¹ã¯ãŒããããã·ã¥ãããšãã¢ããªã±ãŒã·ã§ã³ã¯æ©èœããªããšèª¬æãããŠããŸãã
CodeIgniterç§ãç¥ãéããCIã¯ã¢ã¯ã»ã¹å¶åŸ¡æ©èœãæäŸããŠããŸããã ã¢ã¯ã»ã¹å¶åŸ¡ã¯éåžžã«å°é£ãªã¿ã¹ã¯ïŒã°ã«ãŒããããŒã«ãªã©ïŒã«ãªãå¯èœæ§ãããããã¬ãŒã ã¯ãŒã¯ããããå©ããŠãããã°ãããšæããŸãã
YiiYiiã®ã¢ã¯ã»ã¹å¶åŸ¡ã·ã¹ãã ã®æ¹ããã£ãšæ©ãç解ã§ããŸããã ç°¡åã ãšã¯èšããŸããããããã¯ã¢ã¯ã»ã¹å¶åŸ¡èªäœãç°¡åã§ã¯ãªãããã§ãã Yiiã§ã¯ãã¢ã¯ã»ã¹å¶åŸ¡ã·ã¹ãã ã¯å¯èœãªéãã·ã³ãã«ã§ããããã以äžã§ã¯ãããŸããã ããã¥ã¡ã³ããèªãã åŸãããã»ã¹ãç解ããèªåã®ããŒãºã«åãããŠå€æŽã§ããããã«æããŸããã
ã¯ã€ãã¯ãã¹ã ïŒ
ãã¹ã¯ãŒãã®åŒ·åºŠãé«ããæ¹æ³ãããã«èŠã€ããããšãã§ããŸããã
奜ããªYiiããã*
æè»æ§ïŒãŠãŒã¶ãŒã®IPã¢ãã¬ã¹ãŸãã¯ãªã¯ãšã¹ãã¿ã€ãïŒGETãšPOSTïŒã«åºã¥ããã¢ã¯ã»ã¹ã«ãŒã«ããŸãã¯å¿åãŠãŒã¶ãŒãšèš±å¯ãŠãŒã¶ãŒã®ã«ãŒã«ãèšå®ã§ããŸãã
*
ãªã¿ãŒã³URLïŒãªã³ã¯ããã©ã
ãŸãããã»ãã·ã§ã³ã¯ãã§ã«å€ããªã£ãŠããŸãã ãã°ã€ã³ããŒãžã«ãªãã€ã¬ã¯ããããŸãã ãã°ã€ã³ãããšãã·ã¹ãã ã¯èªåçã«ç®çã®ããŒãžã«æ»ããŸãã ç§ã«ãšã£ãŠã¯ãããã¯éåžžã«äŸ¿å©ã§ãã
*
ããŒã«ããŒã¹ã®ã¢ã¯ã»ã¹å¶åŸ¡ ïŒ RBACã¯ãåŸæ¥ã®
ACLãããæè»ã§åŒ·åã§ãã Yiiãã¬ãŒã ã¯ãŒã¯ã䜿çšãããšãRBACã«æ³šæãæããã«ã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããç¹å®ã®åé¡ã解決ããå¿
èŠãããå Žåã«ã®ã¿äœ¿çšã§ããŸãã ãããã£ãŠãã·ã¹ãã ã¯æ¬æ¥ããã¹ãæè»æ§ãåããŠããŸãããã¢ã¯ã»ã¹ã«ãŒã«ã¯å¿
èŠãªãã®ãããè€éã§ã¯ãããŸããã
èŸæžæ»æèŸæžæ»æã¯ãæã䜿çšãããåèªã®ãªã¹ã-èŸæž-ã䜿çšããŠãã¹ã¯ãŒããæšæž¬ããããšããè©Šã¿ã§æ§æãããŸãã Webã¢ããªã±ãŒã·ã§ã³ã®å Žåããã®ãããªæ»æã¯éåžžã«å¹æçã§ãã æè¿ã®
Twitterãžã®æ»æã¯èŸæžæ»æã§ããã
èŸæžæ»æãçµäºãããæ¹æ³ã¯å€æ°ãããŸãïŒXãèªèšŒè©Šè¡ã«å€±æããåŸã®ã¢ã«ãŠã³ãã®ããã¯ã¢ãŠããæéã®é
ããCAPTCHAã ããããã«é·æãšçæããããŸãã ã¢ã«ãŠã³ãã®ããã¯ã¢ãŠãã¯ç°¡åã§å¹æçã§ãã
ããµãŒãã¹æåŠã
æ»æããæ©äŒãæäŸã
ãŸã ã誰ããå€ãã®èªèšŒè©Šè¡ãè¡ãããšãã§ããŸãããã¢ã¯ã»ã¹ãåŸãããã§ã¯ãªããä»ã®ãŠãŒã¶ãŒããããã¯ããããã§ãã ç§ãæ°ã«å
¥ã£ãŠããæ¹æ³ã®1ã€ã¯æ¬¡ã®ãšããã§ãã5å倱æããåŸãè¿œå ã®è©Šè¡ãååŸããã«ã¯ãã£ããã£ã解決ããå¿
èŠããããŸãã ããã«ãããèŸæžæ»æãDoSãããã³äœ¿ãããããå¶åŸ¡ã§ããŸãã
ã©ã®ãã¬ãŒã ã¯ãŒã¯ã«ãèŸæžæ»æããµãŒãã¹æåŠã®åé¡ã«é¢é£ããããŒã«ã¯ãããŸããããç§ã¯ãããæåŸ
ããŠããŸããã§ããã æ¬åœã®åé¡ã¯ã
ãã®ãã¬ãŒã ã¯ãŒã¯ã§æ¿èªæ¹æ³ãå¿
èŠãªæ¹æ³ã§æ£ç¢ºã«æ§æã§ãããã©ããã§ãã ããã¯å¶åŸ¡ãšæè»æ§ã®åé¡ã§ãã CIãšYiiã§ã¯ããããã§ãããšç¢ºä¿¡ããŠããŸãã ãã ããCakePHPã§ããã«ã€ããŠã¯ããããããŸããã
ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°æ»æïŒXSS ïŒXSS㯠ãæãäžè¬çãªã»ãã¥ãªãã£åé¡ã®ã©ã³ã¯ä»ã
ã«ãããŠããããã¡ãªãŒããŒãããŒãäžåã£ãŠããŸãã ããã¯æ¬¡ã®ããã«æ©èœããŸãã誰ããããã°ã«ã³ã¡ã³ããæçš¿ãããã®æçš¿ã«æªæã®ããJavaScriptã³ãŒããå«ãŸããŠããŸãã ããã°ãé²èŠ§ãããšãã³ãŒããå®è¡ãããŸãã ã³ãŒãã¯ãã¡ã€ã³ããååŸãããããããå®å
šãªããã©ãŠã¶ãšèŠãªãããŸãã ãã®ã³ãŒãã¯ãCookieãèªã¿åã£ãããããŒãžã®ã³ã³ãã³ããå€æŽãããã§ããŸãïŒããšãã°ããã»ãã·ã§ã³ã®æå¹æéãåããŸããããã¹ã¯ãŒããå
¥åããŠãã ããããïŒã
CodeIgniterãšYiiã«ã¯ããŠãŒã¶ãŒå
¥åããJavaScriptã³ãŒããåé€ã§ããHTMLãã£ã«ã¿ãŒãä»å±ããŠããŸãã æ®å¿µãªãããCakePHPã«ã¯ãã®ãããªãã£ã«ã¿ãŒã¯ãããŸããã
SQLã€ã³ãžã§ã¯ã·ã§ã³æ»æSQLã€ã³ãžã§ã¯ã·ã§ã³ã¯ãWebã¢ããªã±ãŒã·ã§ã³ïŒã³ããã¯ïŒã§æãäžè¬çãªæ»æãšã»ãã¥ãªãã£äžã®æ¬ é¥ã®1ã€ã§ãã ããã¯ããŠãŒã¶ãŒãå
¥åããããã¹ããå®è¡å¯èœãªSQLã³ãŒããšããŠè§£éãããå Žåã«çºçããŸãã äŸïŒ

ãŠãŒã¶ãŒããã¹ã¯ãŒã
foo 'OR 1 =' 1ãå
¥åãããšããŸãã ãã®å Žåããªã¯ãšã¹ãã¯æ¬¡ã®ããã«ãªããŸãã

1 = '1'ã¯åžžã«trueã§ãããããã¯ãšãªã¯ãã¹ãŠã®ãŠãŒã¶ãŒã®ãªã¹ããè¿ããŸãã æãäžè¬çãªïŒãããŠæ£ãããªãïŒè§£æ±ºçã¯ã
addslashesïŒïŒã
mysql_real_escape_stringïŒïŒãªã©ã®é¢æ°ã䜿çšããŠæååããšã¹ã±ãŒãããããšã§ãã

ãã®æ±ºå®ã®äœãåé¡ã«ãªã£ãŠããŸããïŒ
*ãã©ã¡ãŒã¿ããšã«ãããè¡ãå¿
èŠãããããããšã©ãŒãçºçãããããªããŸãã
*ãŸãããããã³ã°ã«äœ¿çšã§ãããã¹ãŠã®æåã誰ããèŠã€ããããšãã§ãããšããäºå®ã«ãäŸåããŸãã å人ã¯ãã¹ãŠã®ç©ŽãèŠã€ããŸããæªäººã¯ãã äžã€ãèŠã€ããŸãã ããã¯æè
ã®ããã®ã²ãŒã ã§ãã
Chris Shiflett㯠ãäžåœèªæåã䜿çšããŠãã¹ã©ãã·ã¥ããã€ãã¹ããSQLã泚å
¥ããæ¹æ³ã
瀺ããŸãã
mysql_real_escape_stringããã€ãã¹ã§ããã¿ãã«æåããªãããšãã©ã®ããã«ããŠç¥ãããšãã§ããŸããïŒ
æ£ãã決å®ïŒæºåãããã¹ããŒãã¡ã³ãé©åãªè§£æ±ºçã¯ããŠãŒã¶ãŒå
¥åãšã¯å¥ã«SQLã¯ãšãªãã³ã³ãã€ã«ããããšã«ãã£ãŠãã€ãŸãæºåæžã¿ã®åŒïŒã€ãŸãããã©ã¡ãŒã¿ãŒåãããã¯ãšãªïŒã䜿çšããŠåé¡å
šäœã解決ããããšã§ãã æºåãããåŒã¯ãSQLã¯ãšãªããžãã¯ããŠãŒã¶ãŒããŒã¿ããåé¢ããŸãïŒ
ãã¡ããš
ãã¡ããã芧ãã ããïŒã
ãã¬ãŒã ã¯ãŒã¯ã¯æºåãããåŒããµããŒãããŠããŸããïŒæ®å¿µãªããã3ã€ã®ãã¬ãŒã ã¯ãŒã¯ã®1ã€ïŒYiiïŒã ãã
ãã®ãããªæ©äŒãæäŸããŸã ã æºåãããåŒã®æ¬ åŠã¯ãCakePHPãšCodeIgniterã®æãæ·±å»ãªåé¡ã ãšæããŸãã
ã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªæ»æïŒCSRF ïŒã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒæ»æã«å ããŠãããæå³ã§ã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªïŒCSRFïŒã䜿çšãããŸãã XSSã¯ãµãŒããŒã«å¯Ÿããã¯ã©ã€ã¢ã³ãã®ä¿¡é ŒãæªçšããCSRFã¯ã¯ã©ã€ã¢ã³ãã«å¯ŸãããµãŒããŒã®ä¿¡é ŒãæªçšããŸãã Bobã次ã®ç»åã¿ã°ãå«ãæªæã®ãããµã€ãã«ã¢ã¯ã»ã¹ããŠãããšæ³åããŠãã ããã

çŸåšããããéè¡ã®ããŒãžã§æ¿èªãããŠããå Žåãéè¡ãµãŒããŒã¯ããããEvaã®å£åº§ã«10,000ãã«ã転éãããªã¯ãšã¹ããåãåããŸãã
CSRFããä¿è·ããããã«äœãã§ããŸããïŒ Cookieã®æå¹æéãççž®ããããšã«å ããŠãäž»ãªè§£æ±ºçã¯ãç§å¯ã®å€ã䜿çšããŠããµãŒããŒäžã®ããŒã¿ãå€æŽã§ããGETããã³POSTãã©ã¡ãŒã¿ãŒãèªèšŒããããšã§ãã
CakePHPãšCodeIgniterã«ã¯ãCSRFãšæŠãæ段ããªãããã§ãã Yiiã¯ãã·ãŒã¯ã¬ããããŒã¯ã³ã䜿çšããŠPOSTãªã¯ãšã¹ãã®CSRFä¿è·ãæäŸããŸãïŒãã®æ©èœãæå¹ã«ããå¿
èŠããããŸãïŒã CSRFããå®å
šã«ä¿è·ããã«ã¯ãGETãªã¯ãšã¹ãããµãŒããŒäžã®ããŒã¿ãå€æŽã§ããªãããšã確èªããå¿
èŠããããŸãã
Cookieã®çé£ ïŒ Cookieãã€ãžã£ãã¯æ»æ ïŒCookieã¯éåžžãã»ãã·ã§ã³èå¥åããŠãŒã¶ãŒåããã¹ã¯ãŒãããã·ã¥ãªã©ã®ååãªæå³ã®ããæ
å ±ãä¿åããããã«äœ¿çšãããŸãã Cookieã®çé£ãšã¯ã第äžè
ãã客æ§ã®Cookieã«ã¢ã¯ã»ã¹ããããšã§ãã ããã¯ãXSSãŸãã¯ãã±ããã¹ããã¡ãŒã䜿çšããŠå®è¡ã§ããŸãã
ã¯ãããŒã®çé£ãã身ãå®ãã«ã¯ïŒ
SSLã¯ã¹ããã¡ãŒãããŠãŒã¶ãŒãä¿è·ãããããXSSæ»æãé²ãããã®å¯Ÿçãè¬ããå¿
èŠããããŸãã éèŠãªæ
å ±ãé·æéä¿åããããšãæåŠããããšã§ãCookieã®éèŠåºŠãäžããããšãã§ããŸãã ããšãã°ãmd5ïŒpasswdïŒãä¿åãã代ããã«ãæéåãã®ããã·ã¥-HMACïŒdateãmd5ïŒpasswdïŒïŒã䜿çšããŸãã
ç§ãç¥ãéããCakePHPãšCIã«ã¯Cookieã®çé£ã«å¯Ÿããä¿è·ã¡ã«ããºã ããããŸããã Yiiã«ã¯Cookieãæ€èšŒããæ©èœããããHMACã䜿çšããŠå«ãŸããããŒã¿ãèªèšŒããŸãã æ»æè
ã¯ãæ°ä»ãããããšãªãæéåãã®Cookieã®ããŒã¿ïŒæå¹æéãªã©ïŒãå€æŽããããšã¯ã§ããŸããã
ãã¡ãããããªããæããªééããç¯ããå Žåãããã¯ãã¹ãŠããªããå©ããŸãã-äŸãã°ãã¯ãããŒã«å¹³æã§ãã¹ã¯ãŒããä¿åããŸãã
åè
ïŒYii
Yiiã«ã¯ãåªããã¢ã¯ã»ã¹å¶åŸ¡ãšXSSä¿è·ãSQLã€ã³ãžã§ã¯ã·ã§ã³ãã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªãCookieçé£ãªã©ãã»ãã¥ãªãã£äžã®å€§ããªå©ç¹ããããŸãã
CakePHPãšCodeIgniterã¯ããã®ç¹ã§å°ããã£ããããŠããŸãã CIã¯æè»æ§ãé«ããããå¿
èŠãªã»ãã¥ãªãã£æ©èœãèªåã§ç°¡åã«è¿œå ã§ããŸãã
-
ãã®ä»ã®ã³ã¡ã³ã
èšåããå¿
èŠããããšæããããã®ãããã€ããããŸããããããã¯ãã®ãã¹ãã®åºæºã«è©²åœããŸããã
è©Šäœæ©CakePHPã¯
Prototypeã©ã€ãã©ãªã䜿çšããŸãã ãããã¿ã€ã
ãæ±ã£ãŠããŸããã åºæ¬çã«ãã°ããŒãã«ãªåå空éãæ±æãããã§ã«å®è¡äžã®JavaScriptã³ãŒããå£ãå¯èœæ§ããããŸãã ãããã£ãŠãPrototypeã¯ã³ãŒããä»ã®ã©ã€ãã©ãªã§ã¯ããŸãåäœããŸããã
èšç»çãªãªãŒã¹Yiiã«ã¯
ä»åŸã®ãªãªãŒã¹ããããŸã ã ãã¹ãŠã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«ããã欲ããã§ãã
å
¥åãã£ã«ã¿ãªã³ã°CodeIgniterã«ã¯ãããŒã¿ãã¯ãªãŒã³ã¢ããããåªãã
Inputã¯ã©ã¹ããããŸãã GETé
åãšãPOSTããã³COOKIEãé€ããã¹ãŠã®ã°ããŒãã«å€æ°ãç Žæ£ããŸãã ãã®æ©èœã¯ç§ã®åºæºã«å®å
šã«ã¯é©åããŸããããã³ãŒãã®æ¹åã«è²¢ç®ãããããèšåãã䟡å€ããããŸãã åã®ã»ã¯ã·ã§ã³ã§XSSãã£ã«ã¿ãªã³ã°ã«ã€ããŠèšåããŸããã
-
ãŸãšã
ç§ã®æèŠ-CakePHPã¯ééããªãCIãYiiãããæªãã§ãã ããã¥ã¡ã³ãã¯äžè¬çã«åªããŠããŸãããCIãšYiiã«åããã®ã¯ãããŸããã CakeãCIãYiiããæããã«è¯ãèŠããé åã¯èŠåœãããŸããã CakeãæåŸ
ãããšããã«ãã¹ãŠãè¡ãåçŽãªã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯ãããè¯ããããããŸããã ããããäžè¬çã«ãCakeã¯CIãYiiãããè€éã§ããããã®äŸ¡å€ã¯ãªãããã§ãã
YiiãšCodeIgniterã¯éåžžã«è¿ããã®ã§ãã ããã©ãŒãã³ã¹ãããã¥ã¡ã³ããããã³æè»æ§ã¯ã»ãŒåçã§ããã©ã¡ããé«éã§ãååã«ããã¥ã¡ã³ãåãããŠãããååãªæè»æ§ããããŸãã CodeIgniterã¯ããã·ã³ãã«ã§ãããYiiã«ã¯ã»ãã¥ãªãã£äžã®å©ç¹ããããŸãã æçµçãªæèŠããŸãšããããã«ãããããã®ã¢ããªã±ãŒã·ã§ã³ã®ãããã¿ã€ããäœæãããŸã§åŸ
ã¡ãŸãã
æ¯èŒããŒãã«ã¯ç©äºãåçŽåããããã®ã§ãç§ã¯éåžžãæ¯èŒããŒãã«ã¯å¥œãã§ã¯ãããŸããã ãããã人ã
ã¯ãã°ãã°çãèŠçŽè¡šãèŠãããšæãã®ã§ãããããã®ã¹ã±ãããæäŸããŸãïŒ

[1]éèŠã§ãã ããã°ã©ã ã®äœæãéå§ããåã«ããã¥ã¡ã³ããå€æããã®ã¯å°é£ã§ãã
[2] CodeIgniterã¯ãXSSãã£ã«ã¿ãªã³ã°ãšå
šäœçãªæè»æ§ã§ãã€ã³ããç²åŸããŸãã
å
ã®èšäºãšèäœæš©-ãããšã«ã»ã«ã¬ã©ã
ãPHPãã¬ãŒã ã¯ãŒã¯ã®æ¯èŒ-ããŒãIã