æè¿ãæ ãè
ã ãããœãŒã¹ã³ãŒãã®ã»ãã¥ãªãã£ã®åæã«ã€ããŠæžããŠããŸããã æ°å¹Žåã«ãœãŒã¹ã³ãŒãã®åæãæ°ããèªå€§åºåãšèŠãªãããšã
ææ¡ãã Gartnerã®ç·ãããããããããšããæå¿ããŸã äžããŠããªãããã§ãã ãããŠãç§ã®ä»äºã®çŸåšã®æ¹åïŒ
PT Application Inspectorã®éçºãžã®åå ã以äžAIïŒãšãæè¿ã§ã¯ãœãŒã¹ã³ãŒãåæã®ãããã¯ã«é¢ããé©åãªèšäºããªãã£ããšããäºå®ãèãããšãä»æ¥ãŸã§ãªããšãªãå¥åŠãªããšã§ããã®ããã°ã®æ¥ã«ã¯ããã®çãããããªãããã¯ã«ã€ããŠ1æ¥ãæ±ãæ¥ã¯ãããŸããã§ããã ãŸããä¿®æ£ããŸããã
å®éãAIã®ãœãŒã¹ã³ãŒãã»ãã¥ãªãã£ã®åæãèªååããããã®ã¢ãããŒãã«ã€ããŠèšããããšã¯ãã¹ãŠãPHDays IVã®ã¬ããŒãã
ãœãŒã¹ã³ãŒãã«ãããšã¯ã¹ããã€ãã®èªåçæã®åé¡ ãã§ãSergey PlekhovãšAlexei Moskvinããã§ã«èšã£ãŠããŸãã ã¬ããŒãã«åºåžãããèšé²ãèŠãªãã£ã人ã®ããã«ãèšäºãããã«èªãåã«ãããè¡ãããšã匷ããå§ãããŸãã ããããIvan Novikov aka
@ d0znppããã®ã¬ããŒãã®æåŸã«ããã±ãŒã¹ã¯äœã§ããïŒãããããªãã®ã¢ãããŒãã¯åãRIPSãšã©ã®ããã«éããŸããïŒããããã³ãã©ã®ããã«ãšã³ããªãã€ã³ããååŸããŸããïŒãã¢ããªã±ãŒã·ã§ã³ããããã€ããªããšããšã¯ã¹ããã€ãã®æ§ç¯ã«å¿
èŠãªå€éšããŒã¿ïŒããšãã°ãç¹æš©ãŠãŒã¶ãŒã®ååãšãã¹ã¯ãŒãããšã³ããªãã€ã³ããžã®ã«ãŒããªã©ïŒãååŸããããšã¯ã§ããŸããã çšèªã®æ··ä¹±ãããããšãããã«äºçŽãããïŒç§ãã¡ã®åŽã§ç¡æ¡ä»¶ã«è¡ãããŸãïŒïŒããœãŒã¹ã³ãŒãã«ããæ»æãã¯ãã«ã®ã»ãããèªåçã«åºåããåé¡ããšããååã¯ãAIã®äœæ¥äžã«è§£æ±ºãããã¿ã¹ã¯ã®æ¬è³ªãã¯ããã«æ£ç¢ºã«åæ ããŸã ãšã¯ã¹ããã€ããšããŠAIã®åºåã§å€æããããšãåŒã³åºãããšã¯ãå®éã«ã¯ãŸã£ããæ£ãããããŸããã äŒçµ±çãªçšèªã§ã®æªçšãããã¯ãŒã«ã ãããšããçç±ã ãã§:)ãããŠãç§ã¯ãã®èããæããã«ããã€ãŽã¡ã³ãå°ãã質åã«å¯Ÿãããã詳现ãªçããååã«è£è¶³ããããšããŸãã
ã©ãããã®ïŒ
ãŸã第äžã«ããã®ã±ãŒã¹ã¯ã³ãŒãã®æ¬ é¥ãèŠã€ããç¹å®ã®ã¯ã©ã¹ã®æ»æã«å¯Ÿããè匱æ§ã確èªããããšã«ãããŸãã ãã®ã±ãŒã¹ã®ãã¬ãŒã ã¯ãŒã¯å
ã§ã®èªåãšã¯ã¹ããã€ãçæã®ã¿ã¹ã¯ã¯ãè匱æ§ã®ååšã確èªããæå°éã®æ»æãã¯ãã«ã®çµè«ã«éããŸãã åæã«ããã¯ã¿ãŒã¯ç¹å®ã®HTTPèŠæ±ã§ã¯ãªããã·ã¹ãã ãè匱ãªç¶æ
ã«ããæ»æãæåãããèŠå ã®ç¹å®ã®ã»ãããæå³ããŸãã ããã«èšããŸãïŒäžè¬çãªã±ãŒã¹ã§ã¯ãæ»æãã¯ãã«ãHTTPãªã¯ãšã¹ãã®ã¿ãšããŠè¡šçŸããããšã¯ã§ããŸããã 第äžã«ããã®ãã¯ãã«ã«ã¯è€æ°ã®ã¯ãšãªãå¿
èŠã«ãªãå Žåãããããã§ãã 第äºã«ïŒãããŠããã¯éèŠã§ãïŒããã¯ã¿ãŒã«ã¯HTTPãªã¯ãšã¹ãã®ã³ã³ããã¹ãã§ã¯èšè¿°ã§ããªãç°å¢ããããã£ã®æ¡ä»¶ãå«ãŸããŠããå¯èœæ§ãããããã§ãã ããã«ãããããããæ€èšäžã®äºä»¶ã®æ çµã¿ã®äžã§ãç§ãã¡ã¯æ¬¡ã®ããšãããªããã°ãªããŸããã bïŒäœããã®æ¹æ³ã§åæçµæã«ããããé
眮ããŸãã ããããŸãã«ããã®ãããªè€éãªãã¯ãã«ã®å®çŸ©ã«ã€ãªãã£ããã®ã§ãã ç°¡åãªäŸã瀺ããŸãïŒä»¥éãASP.NET Webãã©ãŒã ã®CïŒã³ãŒããæ€èšããŸãïŒã
var settings = Settings.ReadFromFile("settings.xml"); string str1; if (settings["key1"] == "validkey") { Response.Write(Request.Params["parm"]); } else { Response.Write("Wrong key!"); }
æããã«ããã®å ŽåãXSSæ»æã«å¯Ÿããè匱æ§ã¯ãsettings.xmlæ§æãã¡ã€ã«ã®key1ãã©ã¡ãŒã¿ãŒã®å€ã«äŸåããŸãã ãããŠãæ£çŽã«ãããèªãã å ŽåïŒã€ãŸããå®éã«ã¯ã象城çã«Settings.ReadFromFileïŒ "settings.xml"ïŒãåŒã³åºããŠçµæãå€æ°èšå®ã«å²ãåœãŠãªãïŒã2ã€ã®å¯èœãªæ¹æ³ã®ãã¡ã®1ã€ã ããå®è¡ããŸãããã¡ã€ã«ã®key1ããvalidkeyãã«èšå®ãããŠããªãå Žåãå¿
ç¶çã«è匱æ§ãã¹ãããããããšã«ãªããŸãã æåã®åŒã³åºããã·ã³ããªãã¯ã«å®è¡ãããšãæçµçã«æ¬¡ã®åŒãåŸãããŸããããã¯ç®çã®ãã¯ãã«ã§ãã
Settings.ReadFromFile("setings.xml")["key1"] == "validkey" -> {Request.Params["Parm"] = <script>alert(0)</script>}
ããããHTTPãšã¯ã¹ããã€ããæšæž¬ããããšãã§ããŸãã
GET http:
ãã ããããã¯èªçµŠèªè¶³ã§ã¯ãªããWebã¢ããªã±ãŒã·ã§ã³ã®ç°å¢ã«èª²ãããæ¡ä»¶ã«äŸåããŸãã
ããŒã¿ããŒã¹ããã¡ã€ã«ã·ã¹ãã ããŸãã¯ãã®ä»ã®å€éšãœãŒã¹ããå€ãååŸãããšãåçŽãªãžã¬ã³ãã«ã€ãªãããŸããå€éšããŒã¿ãååŸããæ¬æ Œçãªãšã¯ã¹ããã€ããæ§ç¯ããèœåãããïŒçè«çã«ã¯å¯èœïŒããæœåšçãªè匱æ§ãèŠéãå®è¡ãã¹ã倱ãããå ŽåããŸãã¯å€éšãœãŒã¹ãžã®åŒã³åºãã象城çã«åŠçããããã«ããããã®ãããªåŒã³åºãã®çµæãšããŠçºçããå¯èœæ§ã®ãããã¹ãŠã®å€ãšå®è¡ãã¹ã®ã»ãããã«ããŒããŸãã ãŸããå
šå€©ååã®æ®éçãªæ»æè
ãäœæããã®ã§ã¯ãªããå¯èœãªéãã³ãŒãã»ãã¥ãªãã£ãåæãã人éã®ã«ãŒãã³ãèªååãããšããã¿ã¹ã¯ã«çŽé¢ãããããæ¬æ Œçãªãšã¯ã¹ããã€ããæ§ç¯ãã芳ç¹ããããããªã人éã®äœæ¥ãå¿
èŠãšããå®èšŒæžã¿ã®è«çåŒã®åœ¢åŒã§ãã¯ãã«ãååŸããããšã¯ããã®ãããªãšã¯ã¹ããã€ããèªåã§ååŸããããã奜ãŸããæ©èœã
ãã ããå€éšããŒã¿ãèªã¿åããã«å®éã«ã©ãã«ãååšããªãç¶æ³ãçºçããå¯èœæ§ããããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ã¯ãªãå€éšæ§æãã¡ã€ã«ã§å®çŸ©ãããŠããå ŽåãWebã¢ããªã±ãŒã·ã§ã³ãžã®ãšã³ããªãã€ã³ããžã®ã«ãŒãã決å®ããè¿œå ã®ãã¡ã€ã«ããœãŒã¹ã³ãŒããšæ¥ç¶ããããšã§ãããããæ§æãã¡ã€ã«ïŒåçèšèªã«é¢é£ïŒã«ãªã¹ãããåæ§ã®ã¿ã¹ã¯ãããã€ãå®è¡ããŸãã ãããã質åã¯ãããŸãããå¿
èŠãªå Žåã¯ãæã亀差ãããŠèªã¿ãŸãã ãã¡ãããã§ãããšããã
èŠçŽãããšãçŸæç¹ã§ã¯ãAIãããŒã¿ããŒã¹ããããŒã¿ãèªã¿åããåæãããã³ãŒãã®ã·ã³ããªãã¯å®è¡äžã«ããã䜿çšããããã«æããããšã«å¯Ÿããé害ã¯ãããŸããã ãã ããããã«ã¯ãå°ãªããšãWebã¢ããªã±ãŒã·ã§ã³ããŒã¿ããŒã¹ãå±éããå¿
èŠããããäžèšã§èª¬æããã¿ã¹ã¯ã»ããã®ãã¬ãŒã ã¯ãŒã¯å
ã§æ確ãªå©ç¹ãæäŸããããšãªããã¢ãã©ã€ã¶ãŒã®è匱æ§æ€åºèœåã倧å¹
ã«äœäžãããŸãã
ããªãã®ã¢ãããŒãã¯RIPSãšã©ãéããŸããïŒ
ç§ãRIPSã§æ¡çšãããŠãã
ã¢ãããŒããå€æã§ããéããAI'shnyã¯ãã¹ãŠãããå°ãç°ãªããŸãã RIPSã¯ãå€æ°ã®æšæºã©ã€ãã©ãªé¢æ°ã®ãšãã¥ã¬ãŒã·ã§ã³ã䜿çšããŠããŒã¿ãããŒã°ã©ãã®ãã¹ãã¿ã°ä»ãããããšã«ãããå€å
žçãªéçæ±æåæãå®è£
ãããšããäºå®ããå§ãŸããAIã¢ãããŒãã§ã¯ãè«çã¹ããŒãã¡ã³ãã®èšè¿°åœ¢åŒã§ã¢ãã«ïŒåãšã³ããªãã€ã³ãã«1ã€ïŒãæ§ç¯ããå¿
èŠããããŸãåCFGããŒãã®ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãšãã®éææ¡ä»¶ãããã«ããããšãã¥ã¬ãŒããã代ããã«å®éã®ã³ãŒããéšåçã«å®è¡ããããšã§ããã®ãã¹ïŒifãæ¡ä»¶ä»ããªã¿ãŒã³ãäŸå€åŠçãªã©ãå«ãïŒã解決ã§ããŸããæé«ã®å ãã£ã©ã¯ã¿ãŒã®å®è¡ãšæ¯èŒããçµæã ãããŠãRIPSãã«ã¹ã¿ã ãã£ã«ã¿ãªã³ã°é¢æ°ã§æãã«äžæããããšãïŒãããããã«éå®ãããªãïŒçµäºããŸãããAIã¯ãããã䜿çšããããšããŸãïŒãããŠã»ãšãã©ã®å®éã®ã±ãŒã¹ã§éåžžã«æåããŸãïŒã
äŸã瀺ãæ¹ãè¯ãã§ãããã 次ã®ãœãŒã¹ã³ãŒãã®æçããããšããŸããã
[1] ïŒ
string name = Request.Params["name"]; string key1 = Request.Params["key1"]; string parm = Request.Params["parm"]; byte[] data; if (string.IsNullOrEmpty(parm)) { data = new byte[0]; } else { data = Convert.FromBase64String(parm); } string str1; if (name + "in" == "admin") { if (key1 == "validkey") { str1 = Encoding.UTF8.GetString(data); } else { str1 = "Wrong key!"; Response.Write(str1); return; } } else { str1 = "Wrong role!"; } Response.Write("<a href='http://host.domain' onclick='" + CustomSanitize(str1) + "'>Click me</a>");
æããã«ãæœåšçãªå±éºãªæäœã2åãããŸãïŒä»¥éãPVO-æœåšçã«è匱ãªæäœïŒ-HTTPèŠæ±ã«å¯ŸãããµãŒããŒã®å¿çã®ã¹ããªãŒã ã«æžã蟌ãResponse.Writeã¡ãœãããžã®åŒã³åºãã æåã®ã±ãŒã¹ã§ã¯ãå®æ°ãWrong KeyïŒããã¡ãœããã«æž¡ãããŸãããããã¯ç§ãã¡ã«ã¯é¢ä¿ãããŸããã ãã ãã2çªç®ã®çµæã¯ãåŒæ°ã䜿çšããŠCustomSanitizeã¡ãœãããåŒã³åºããçµæã§ããããã®å€ã¯ãåä¿¡ããèŠæ±ã®ãã©ã¡ãŒã¿ãŒã®å€ããèšç®ãããŸãã ããããHTMLããŒã¯ã¢ããèŠçŽ ã®æ¿å
¥ã«ãã£ãŠXSSæ»æã®å¯èœæ§ã確èªããã®ã«ååãªå€ãstr1ã«è»¢éã§ããããã«ããã«ã¯ãäœããã¹ãã§ããããïŒ ãã®è³ªåã«å¯ŸããçããèŠã€ããããã»ã¹ãã©ã®ããã«èŠãããèŠãŠã¿ãŸããã
[2] ã
ãŸãã2çªç®ã®Response.Writeã®å°éå¯èœæ§æ¡ä»¶ãå°åºããŸãã ããèªäœãå¶åŸ¡ãããŒã«åœ±é¿ãäžããæ§é ã«åã蟌ãŸããŠããªããšããäºå®ã«ããããããã以åã®ã³ãŒããããã¯ã§ã¯ãã³ãŒãå
šäœã«å
±éããé¢æ°ããã®æ»ããããããã®å°éå¯èœæ§æ¡ä»¶ã¯åæã«PVOã®å°éäžèœã®æ¡ä»¶ã§ããããŸãã æããã«ãå®è¡ãããreturnã¹ããŒãã¡ã³ãã®æ¡ä»¶ã¯è«çåŒã§ãïŒïŒname == "adm" && key1ïŒ= "Validkey"ïŒã ãããã£ãŠããã®å°éäžèœã®æ¡ä»¶ã¯æ¬¡ã®åŒã«ãªããŸãïŒïŒnameïŒ= "Adm" || name == "adm" && key1 == "validkey"ïŒã ãã®æ»ãå€ã¯2çªç®ã®Response.Writeã®å°éå¯èœæ§ã«åœ±é¿ããå¯äžã®ã¹ããŒãã¡ã³ãã§ãããããæåŸã®åŒã¯PVOã®å°éå¯èœæ§ã®æ¡ä»¶ã«ãªããŸãã
å®éãåŒïŒnameïŒ= "Adm" || name == "adm" && key1 == "validkey"ïŒã¯ãå¶åŸ¡ãããŒã°ã©ãäžã®PVOãžã®ãã¹ã圢æããããã®çžäºã«æä»çãª2ã€ã®æ¡ä»¶ãæäŸããŸãã ãããããå®è¡ããããšãã®str1ã®å¯èœãªå€ãèæ
®ããŠãã ããã ïŒnameïŒ=â AdmâïŒã䜿çšãããšãå€æ°str1ã¯å®æ°å€â Wrong roleïŒâãååŸããŸããããã«ãããæ»æãæåããããšã¯ééããããŸããã ãã ããïŒname ==â admâ && key1 ==â validkeyâïŒã䜿çšãããšãstr1ã¯ããŒã¿åŒæ°ã䜿çšããŠEncoding.UTF8.GetStringã¡ãœãããåŒã³åºããçµæãååŸããŸãããã®ã¡ãœããã¯ã次ã®2ã€ã®å€ãåããŸãïŒnew byte [0] with string.IsNullOrEmpty ïŒparmïŒããã³Convert.FromBase64StringïŒparmïŒwithïŒstring.IsNullOrEmptyïŒparmïŒã ãå«ãèå³ã®ãªãç Žæ£ã è匱æ§å€ã®æªçšå¯èœæ§ãšããã¹ãŠã®å€æ°ã®å€ãæ±ææºãŸã§å·»ãæ»ããšã次ã®åŒãåŸãããŸãã
(Request.Params["name"] == "adm" && Request.Params["key1"] == "validkey" && !string.IsNullOrEmpty(Request.Params["parm"])) -> Response.Write("<a href='http://host.domain' onclick='" + CustomSanitize(Convert.FromBase64String(Request.Params["parm"])) + "'>Click me</a>")
ãã®å Žåã«æ§ç¯ãããå®è¡ã¢ãã«ã®ã°ã©ãã£ã«ã«è¡šçŸã¯ã次ã®ããã«ãªããŸãïŒã¯ãªãã¯å¯èœïŒã
ãããã£ãŠãã¯ãšãªãã©ã¡ãŒã¿ãŒåãškey1ã®å€ã¯æ¢ã«ãããè¡ãã¹ãããšã¯ãCustomSanitizeåŒã®æçµå€ïŒConvert.FromBase64StringïŒRequest.Params ["parm]ã®ããã«ãRequest.Params [" parm "]ã®å€ãèŠã€ããããšã ãã§ãã »]ïŒïŒXSSã«ã€ãªããè匱æ§ã®æªçšãæäŸããŸãã
ãããŠãããã§ãéç解æã®åŸæ¥ã®æ段ã§ã¯å¯ŸåŠã§ããªããšããåé¡ãçºçããŸãã Convert.FromBase64Stringã¡ãœããã¯ã©ã€ãã©ãªã¡ãœããã§ãããã¢ãã©ã€ã¶ãŒã®ãã¬ããžããŒã¹ã§Convert.ToBase64Stringã®éé¢æ°ãæã€ãšèª¬æã§ããŸãããã®é¢æ°ãããCustomSanitizeã®çµæã¯å
¥åConvert.ToBase64Stringã«éããããšçµè«ä»ããããšãã§ããŸãã ããããã©ã€ãã©ãªã§ã¯ãªãCustomSanitizeãã©ããããã¯ãã©ãã«ãèšè¿°ãããŠããããåæã®ãã®æ®µéã§ã¯çœé»ã®ããã¯ã¹ã§ããïŒ ããŠããã®ã¡ãœããã®ãœãŒã¹ãå©çšå¯èœã§ããã°-ãã®å Žåããã®æ¬äœã«ããã©ãŒã«ã¹ã«ãŒãããäžèšãšåæ§ã®æ¹æ³ã§ã·ã³ããªãã¯ã³ãŒãã®å®è¡ãç¶ç¶ã§ããŸãã ãããããœãŒã¹ã³ãŒãããªãå Žåã¯ã©ãã§ããããã çãã¯åã®æã«ãããŸãããããã«ã€ããŠãã°ããã®éå¿ããŠããããã«ãåæã¯éçã§ããããã®ã¡ãœããããã©ãã¯ããã¯ã¹ãšããŠäœ¿çšããŸãã 以åã«å€æãããåŒConvert.ToBase64StringïŒCustomSanitizeïŒRequest.Params ["parm"]ïŒïŒããããŸããå€ãã®XSSãã¯ãã«ããããŸãïŒ{`<script> alertïŒ0ïŒ</ script>`ã onmouseover = 'a [ã¢ã©ãŒã]; a [0] .callïŒa [1]ã1ïŒ `and`â onmouseover =â a [ã¢ã©ãŒã]; a [0] .applyïŒa [1]ã[1]ïŒ `}ïŒ-ããã§ãRequest.Params [" parm "]ã·ã³ãã«å€æ°ããã¯ãã«ã®å€ã§æå®ããçµæã®åŒãçŽæ¥å®è¡ããããšã§ããã®åŒã®çŠç¹ãå€ããªãã®ã¯ãªãã§ããïŒ
CustomSanitizeãå±±ãã£ãæåã®ã¿ãåé€ãããšããŸãã 次ã«ããã¡ãžã³ã°ã®çµæãšããŠã3ã€ã®å€ãååŸããŸãã
scriptalert(0)/script 'onmouseover='a[alert];a[0].call(a[1],1) "onmouseover="a[alert];a[0].apply(a[1],[1])
åŸè
ã®2ã€ã¯ãæ»æãã¯ãã«ãšããŠèæ
®ãã䟡å€ããããŸãã ãããã£ãŠãPVOåŒæ°ãšããŠæž¡ãããå®å
šãªåŒãããããŸãã æåå€æ°Request.Params ["parm"]ã®å€ããã¯ãã«ã®å€ã§æå®ãããŠããå Žåããã®å€ãèœã¡ãæ£ç¢ºãªå Žæãç¥ã£ãŠããŸãã ãããã®2ã€ããããã®äœ¿çšã泚å
¥ã«ã€ãªãããã¯ãã«ãéžæããããã«ãä»ã«äœãå¿
èŠã§ããïŒ ã
å®å
šãªWebã¢ããªã±ãŒã·ã§ã³ãéçºããåæã«ããªãã®å¿ã倱ããªãããã«ããã«ã¯ ããŠã§ãããŒã泚ææ·±ãèãã人ãã¡ã¯ãç§ãã¡ã¯ä»ã«äœãå¿
èŠãªããšããã«çããŸã:)
T.O. ãã®ã³ãŒãã®åæã®æçµçµæã¯ãã³ã³ããã¹ãïŒPVOå®è¡ã®ã³ã³ããã¹ãã§ã·ã³ããªãã¯å€æ°ã®å€ãå®çŸ©ããïŒã®æªçšã§ãïŒ
Request.Params["name"] = "adm" Request.Params["key1"] = "validkey" Request.Params["parm"] = "'onmouseover='a[alert];a[0].call(a[1],1)"
HTTPïŒHTTPãªã¯ãšã¹ãã®å®éã®ãã©ã¡ãŒã¿ã®èŠä»¶ãå®çŸ©ããïŒãæªçšããããšã¯æ¢ã«å¯èœã§ãïŒ
GET http:
AIã§ã¯ãèå³ãããå Žåã¯æ¬¡ã®ããã«ãªããŸãïŒã¯ãªãã¯å¯èœïŒïŒ
ãã¡ãããå³ããçŸå®ã§ã¯ããã¹ãŠãå°ãè€éã§ãããã£ã«ã¿ãªã³ã°é¢æ°ã«ãã£ãŠä¿®æ£ããããã¯ãã«ã§ãããã·ã¥ãŒããããããšãããããã®ãããªé¢æ°ã®æ£èŠè¡šçŸã®åºçŸãšãšãã«ãå®æ°å€ã®ä»£ããã«ããããèšè¿°ããæéãªãŒãããã³ãæäœããå¿
èŠãçããŸãã ã¯ãšãªã®å
¥åãã©ã¡ãŒã¿ãåºåèšèªã®ä»»æã®ææ³æ§é ã«åºå·ããå¯èœæ§ããããšããäºå®ã¯ãã¢ã€ã©ã³ãèšèªãªã©ã®ããããã£ã®è§£æããã³/ãŸãã¯ãã¥ãŒãªã¹ãã£ãã¯ãªæšè«ã®å¿
èŠæ§ã«ã€ãªãããŸãã ãªã© ãããããããã¯ãã§ã«åã
ã®ïŒãããŠããããããå°ãç§åŠçãªïŒèšäºã®ãããã¯ã§ãã ç§ãã¡ã®ä»äºã®äžç°ãšããŠããããã®åé¡ãæ£åžžã«è§£æ±ºãããããšã«ã®ã¿æ³šæããŠãã ããã
ãšã³ããªãŒãã€ã³ãã¯ã©ã®ããã«ããŠååŸããŸããïŒ
ãã¹ãŠã®äŸã§ã "/ path / to / document.aspx"ïŒã€ãŸããWebã¢ããªã±ãŒã·ã§ã³ãžã®ãšã³ããªãã€ã³ããžã®ã«ãŒãïŒãååŸãããšãã質åãæå³çã«çç¥ããŸããã ãã®ã¿ã¹ã¯ã«ã¯æ®éçãªãœãªã¥ãŒã·ã§ã³ã¯ãªããã¢ãã©ã€ã¶ãŒã®ãã¬ããžããŒã¹ã§ããŸããŸãªãã¬ãŒã ã¯ãŒã¯ã®è©³çŽ°ã説æããå¿
èŠããããŸãã ããšãã°ãASP.NET Webformã®å Žåããšã³ããªãã€ã³ãã¯ãããããã³ãã©ã¡ãœããã§ãã Webãã©ãŒã ã³ã³ãããŒã«ã®ãã¹ãããã¯ïŒ.aspxãã¡ã€ã«ã解æãã察å¿ããåé¢ã³ãŒããã¡ã€ã«ã«ãªã³ã¯ããå¿
èŠããããŸãïŒã ASP.NET MVCã§ã¯ãã«ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã®åæåã³ãŒãã«RouteCollectionãçŽæ¥å
¥åããããšã«ããå®çŸ©ãããŸãã ã»ã¯ã·ã§ã³urlMappingsãurlrewritingnetãªã©ãWebConfigã«è¡šç€ºãããå¯èœæ§ãå¿ããªãã§ãã ãããããã¯ãã¢ããªã±ãŒã·ã§ã³ãžã®HTTPãªã¯ãšã¹ãã®ã«ãŒãã£ã³ã°ã«ã圱é¿ããŸãã ãŸããéçºè
ãã«ã¹ã¿ã ã«ãŒãã£ã³ã°ããžãã¯ãå®è£
ããç¬èªã®HTTPãã³ãã©ãŒãå®çŸ©ããããšã劚ãããã®ã¯ãããŸãããã«ã¹ã¿ã ã«ãŒãã£ã³ã°ããžãã¯ã®éã¯ã¢ã«ãŽãªãºã çã«äžæº¶æ§ã®ã¿ã¹ã¯ã§ãã ãã®å ŽåãJava / CïŒã®å Žåã¯ãã¹ãŠã®publicã¡ãœãããšprotectedã¡ãœããããŸãã¯PHPã®å Žåã¯ãã¹ãŠã®.phpãã¡ã€ã«ããšã³ããªãã€ã³ããšããŠèæ
®ãã以å€ã«éžæè¢ã¯ãããŸãããå€éšããã¯å°éã§ããªãã³ãŒãã§èª€æ€ç¥ããã£ããããå¯èœæ§ãé«ããªããŸãã ããããç§ã¯å人çã«ãã®ãããª.NETã¢ããªã±ãŒã·ã§ã³ããŸã èŠãŠããŸãããPHPãã¬ãŒã ã¯ãŒã¯ã®æ¢åã®åç©åã¯ãåºæ¿çã§ã¯ãããŸããããšã³ããªãŒãã€ã³ããžã®ã«ãŒãã®ååŸã«é¢é£ããéšåãå«ãã¢ãã©ã€ã¶ãŒã®ãã¬ããžããŒã¹ã§éåžžã«åœ¢åŒåãããŠããŸãã æ¢ã«æããã§ããããã«ãããŒã¿ããŒã¹ã®ã«ãŒãã£ã³ã°ã«ãŒã«ãèšè¿°ãããªã©ã®ãšããŸããã¯ãªãæœåšçãªãã¹ãŠã®ãšã³ããªãã€ã³ãã®åè¿°ã®çŽæ¥åæãåŠçããŠããŸãïŒãšããã§ãäžèŠæãããã»ã©æªãçµæã¯åŸãããŸããïŒã
ããã ãã§ã
ç§ã¯ãŸã ãããã®è³ªåã«çããããšãã§ããããšãé¡ã£ãŠããŸãã ããããçªç¶æ°ãããã®ãçºçããå ŽåããŸãã¯ç解ã§ããªãç¬éãæ®ã£ãŠããå Žå-圌ããèšãããã«ããããã:)
- âããã«ããã®äŸã¯ç¢ºãã«åæã§ãããçããŠããã·ã¹ãã ããã®å®éã®äŸã§ã¯ãªããå¹³åçãªãç²æ«ãªã³ãŒããåæããæ¹æ³ã§èµ·ããããåé¡ã瀺ãããšãæå³ããŠããããšãäºçŽããŸãã èªè
ã®1人ãã³ãŒããã©ã°ã¡ã³ãã®ç¬èªã®ããŒãžã§ã³ãæäŸãããå Žåã¯ãåæããã»ã¹ãæ€èšããããšãã§ããããã¯ãŸã£ããåé¡ã§ã¯ãããŸããã
- âãã®ãããªåçŽãªã³ãŒãã§ãã£ãŠããåæããã»ã¹ã®æ®µéçãªå®è¡ã®èª¬æã¯ãåäžãªè«çåŒã®å€æã®ãã«ãããŒãžãã§ãŒã³ããããããããããã§ã¯èšç®ãè¡ããŸããã èå³ã®ããæ¹ã¯ãã¢ãããŒãã®ããªã詳现ãªèª¬æãšãèšäºã®åé ã§è¿°ã¹ãã¬ããŒãã®èšé²ã«ãããåã
ã®æ®µéã«æ
£ããããšãã§ããŸãã