- TOP
- ã¿ã°äžèЧ
- Drupal
Drupal
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æè¡ããã°
ã¯ããã« ããã«ã¡ã¯ãBASE Departmentã§PHPerãããŠãã @meihei ã§ãã é·ãéçšããŠãããµãŒãã¹ã§ã¯ãæ©èœã®è¿œå ã倿Žãéãããã¡ã«ãããã䜿ã£ãŠããªããããªããŒã¿ããæ®ãããšããããŸãã以åã¯å¿
èŠã ã£ãé
åã®ããŒãæ®ãããã®å€ãååŸããŠåãæž¡ãåŠçãåãç¶ããŠããïŒãã ãæç»ã§ã¯äœ¿ã£ãŠããªãïŒããšãã£ãå
·åã§ãã 䜿ãããŠããããŒã¿ã¯æ®ããäžèŠãªãã®ã ããå®å
šã«åé€ãããããã®ããã«ã¯ããŸãæ¬åœã«äœ¿ãããŠããªãã®ãã確ãããå¿
èŠããããŸãã ãã®èšäºã§ã¯ã ArrayAccess ãš trigger_error() ã䜿ãã廿¢åè£ã®ããŒãèªãŸãããèŠåãåºãä»çµã¿ã玹ä»ããŸãã èæ¯ ããã©ãŒãã³ã¹æ¹åã®ãããç¡é§ãªåŠçããªãããã APMã§åæããŠãããšãããã«ããŽãªæ
å ±ã«å«ããååæ°ãå°çšã®APIãªã¯ãšã¹ãã§ååŸããŠããããšãåãããŸããããã®ååæ°ããã³ãã¬ãŒãåŽã§äœ¿ãããŠããªããã°ãååŸåŠçãåé€ããAPIéä¿¡ã«ãããæéãåæžã§ãããšèããŸããã ã·ã§ããããšã«ç°ãªããã³ãã¬ãŒãããã BASEã§ã¯ãã·ã§ããã®äžç芳ã«åãããŠãã¶ã€ã³ãéžã³ãã«ã¹ã¿ãã€ãºã§ããŸããç¡æã»ææã®ããŸããŸãªãã³ãã¬ãŒãã«å ããŠãHTMLç·šéã«ããã«ã¹ã¿ãã€ãºãæäŸããŠããŸãã thebase.com ãã®ãããPHPããæž¡ããããŒã¿ãåãåãåŽã«ã¯ãæ°å€ãã®ã«ã¹ã¿ã ãã³ãã¬ãŒãããããŸããäŸãã°åãã«ããŽãªæ
å ±ãæž¡ããŠããŠããã«ããŽãªåã ãã衚瀺ãããã³ãã¬ãŒããããã°ãã«ããŽãªã«å±ããååæ°ãŸã§è¡šç€ºãããã³ãã¬ãŒããããåŸãŸãã PHPåŽã®ã³ãŒããèŠãã°ããŒã¿ãæž¡ããŠããããšã¯ç¢ºèªã§ããŠããåã·ã§ããã®ãã³ãã¬ãŒãã§å®éã«åç
§ãããŠããããŸã§ã¯åãããªãããšãã課é¡ããããŸããã 誀ã£ãŠåé€ããŠã衚瀺厩ãã«æ°ã¥ãã«ãã ãã ããå®éã«ã¯è¡šç€ºã«å¿
èŠã ã£ãå Žåãåé€ãããšãã³ãã¬ãŒãã®è¡šç€ºãå£ããŸããTwigã®ããã©ã«ãèšå®ïŒ strict_variables ã false ïŒã§ã¯ãååšããªãããŒã®å€ããã®ãŸãŸè¡šç€ºããããšããŠããšã©ãŒã«ãªããããã®éšåã空ã«ãªããŸãããããããã°ã¯æ°ã¥ãã«ãããåå ã®ç¹å®ãä¿®æ£ã倧å€ã§ãã ã«ããŽãªæ
å ±ã®åãæž¡ããTwigã§æžããšã次ã®ããã«ãªããŸãã echo $twig- > render('category.twig', [ 'category' = > [ 'id' = > 12, 'name' = > 'ãããã¹', 'count' = > $this- > getCountCategory(id: 12), // æ°çŸããªç§ãããã®ã§æ¶ãããåŠç ], ]); <h2>{{ category.name }}</h2> <span>{{ category.count }}ä»¶</span> ãã®ãã³ãã¬ãŒãã䜿ãããŠãããªãã count ã¯ãŸã åé€ã§ããŸããã é
åããDTOãžç§»è¡ããã ãŸããããŒã¿ã®åãæž¡ãããé
åããDTOïŒData Transfer ObjectïŒãžç§»è¡ããããšèããŠããŸãããæçµçã«ã¯ãå¿
èŠãªé
ç®ãšãã®åãæç€ºãããPOPOïŒPlain Old PHP ObjectïŒãªDTOã§ããŒã¿ãæž¡ã圢ãç®æããŠããŸãã Twigã® category.name ãšããæžãæ¹ã¯ãé
åã®ããŒã ãã§ãªãããªããžã§ã¯ãã®publicããããã£ã«ã䜿ããŸãããã®ããããã®åç
§æ¹æ³ãä¿ã£ããŸãŸãPHPåŽã§æž¡ãå€ãé
åããDTOãžçœ®ãæããããŸãã twig.symfony.com ãã ããä»ã®é
åããã®ãŸãŸDTOã«ãããšãäžèŠãªé
ç®ãŸã§åŒãç¶ãã§ããŸããŸããããã§ããŸãã¯æ¢åã®èªã¿æ¹ãä¿ã¡ãªãã廿¢åè£ã®ããŒã®å©çšç¶æ³ã確èªããå®å
šã«åé€ã§ããããšãç®æããŸããã é
åã¢ã¯ã»ã¹ã芳枬ããªããDTOãžç§»è¡ãã ArrayAccessã§èªã¿åãå°çšã®DTOãäœã ãŸãã¯ãé
åãšããŠèªãããèªã¿åãå°çšã®DTOãçšæããŸããPHPã® ArrayAccess ãå®è£
ãããšããªããžã§ã¯ãã«å¯Ÿãã $dto['name'] ã®ãããªã¢ã¯ã»ã¹ãã¡ãœããã§åãåããŸãã 以äžã®ã³ãŒãã¯PHP 8.2以éã察象ã«ããŠããŸããæåã«èªã¿åããšæžã蟌ã¿çŠæ¢ãå®è£
ãããã®åŸã§èŠååŠçã远å ããŸãã abstract readonly class AbstractDeprecatedKeyProbe implements \ ArrayAccess { public function __construct (private array $values) { } final public function offsetExists(mixed $offset): bool { return isset ($this- > values[$offset]); } final public function offsetGet(mixed $offset): mixed { return $this- > values[$offset] ?? null; } final public function offsetSet(mixed $offset, mixed $value): void { throw new \ LogicException (static::class . ' ã¯æžãæããããªã'); } final public function offsetUnset(mixed $offset): void { throw new \ LogicException (static::class . ' ã¯åé€ã§ããªã'); } } readonlyã«ããå¿
èŠããªããã°ã ArrayObject ã䜿ãã®ããããšæããŸããé
åãšããŠæ±ãããã®å®è£
ãçšæãããŠããã®ã§ããã®ãŸãŸå©çšã§ããŸããä»åã¯DTOãreadonlyã«ããé
åã¢ã¯ã»ã¹çµç±ã®æžã蟌ã¿ãæç€ºçã«çŠæ¢ãããã£ãããã ArrayAccess ãçŽæ¥å®è£
ããŠããŸãã æ¬¡ã«ããã®åºåºã¯ã©ã¹ãç¶æ¿ããŠã«ããŽãªã®DTOãäœããŸããreadonlyã¯ã©ã¹ãç¶æ¿ããåã¯ã©ã¹ãreadonlyã«ããŸãã final readonly class CategoryDto extends AbstractDeprecatedKeyProbe { public function __construct ( public int $id, public string $name, public int $count, ) { parent:: __construct ([ 'id' = > $id, 'name' = > $name, 'count' = > $count, ]); } } ã³ã³ã¹ãã©ã¯ã¿ã§ã¯ãéåžžã®DTOãšåãããã«ãé
ç®ããšã«åãæå®ããŠåãåããŸããåŒæ°ãpublicããããã£ãšããŠå®£èšããŠããã®ã§ã $dto->name ãšèªããŸãããã®ããã§ãåãå€ã parent::__construct() ã«é
åãšããŠæž¡ããæ¢åã® $dto['name'] ãšããèªã¿æ¹ã«ã察å¿ãããŠããŸãã $dto = new CategoryDto( id: 12, name: 'ãããã¹', count: 34, ); echo $dto- > name; // ãããã¹ echo $dto['name']; // ãããã¹ Twigãžæž¡ãå Žåã¯ã category ã®å€ããã®DTOã«çœ®ãæããŸãã echo $twig- > render('category.twig', [ 'category' = > new CategoryDto( id: 12, name: 'ãããã¹', count: $this- > getCountCategory(id: 12), ), ]); TwigåŽã® category.name ãšããæžãæ¹ã¯ãã®ãŸãŸã§ããå©çšç¶æ³ã調ã¹ã段éãªã®ã§ã count ãååŸããAPIãªã¯ãšã¹ãããŸã æ®ããŠããŸãã 廿¢åè£ã®ããŒãžã®ã¢ã¯ã»ã¹ãæ€ç¥ãã ç¶ããŠãå®å
šã«ããŒãåé€ããããã«ã廿¢åè£ã®ããŒãèªãŸãããèŠåãåºãããã«ããŸãã察象ã®ããŒã¯DTOããšã«ç°ãªãã®ã§ãåºåºã¯ã©ã¹ã«æ¬¡ã®æœè±¡ã¡ãœããã远å ããŸãã abstract protected function deprecatedKeys(): array; CategoryDto ã§ã¯ããã®ã¡ãœãããå®è£
ããŠå»æ¢åè£ãåæããŸãã protected function deprecatedKeys(): array { return ['count']; } 次ã«ãåºåºã¯ã©ã¹ã® offsetGet() ãš offsetExists() ã倿Žããå
±éã®èŠååŠçãåŒã³ãŸãã final public function offsetExists(mixed $offset): bool { $this- > warnIfDeprecated($offset); return isset ($this- > values[$offset]); } final public function offsetGet(mixed $offset): mixed { $this- > warnIfDeprecated($offset); return $this- > values[$offset] ?? null; } ãããã®ã¡ãœããã final ã«ããŠããã®ã¯ãåã¯ã©ã¹ã§äžæžãããéã«èŠååŠçãæãèœã¡ãã®ãé²ãããã§ãã廿¢åè£ã¯åDTOã§å®£èšããèŠ³æž¬æ¹æ³ã¯å
±éã«ä¿ã¡ãŸãã åºåºã¯ã©ã¹ã«è¿œå ãã warnIfDeprecated() ã¯ã次ã®ããã«ãªããŸãã private function warnIfDeprecated(mixed $offset): void { static $warnedKeys = []; static $deprecatedKeyMaps = []; $deprecatedKeys = $deprecatedKeyMaps[static::class] ??= \array_fill_keys($this- > deprecatedKeys(), true); if (! isset ($deprecatedKeys[$offset])) { return; } $warnedKey = static::class . '::' . $offset; if ( isset ($warnedKeys[$warnedKey])) { return; } $warnedKeys[$warnedKey] = true; \ trigger_error ( \sprintf( '%s: 廿¢æ€èšäžã®ã㌠"%s" ãåç
§ãããããŸã å©çšè
ãããããåé€ã§ããªãã', static::class, $offset, ), E_USER_WARNING, ); } E_USER_WARNING ã¯ãPHPã®ã³ãŒãããçºçãããéèŽåœçãªèŠåã§ããæšæºã®åäœã§ã¯åŠçã忢ããªãã®ã§ãèŠåãåºããåŸãå
ã®å€ãè¿ããŸãã trigger_error() ã§ãã®èŠåãåºããæ¢åã®ãšã©ãŒãã³ãã©ãéããŠå€éšã®ç£èŠããŒã«ãžéãããšã§ãããã®ããŒã«ã¯ãŸã å©çšè
ãããã®ã§ãåé€ãä¿çããå¿
èŠãããããšå€æããææã«ããŸãã *1 ãã ããèŠåãäŸå€ã«å€æãããšã©ãŒãã³ãã©ã§ã¯åŠçãæ¢ãŸããŸããå°å
¥æã«ã¯ã衚瀺ãç¶æã§ããããšãšãèŠåãç£èŠããŒã«ãžå±ãããšã確èªããŸãã ã«ããŽãªäžèЧãã«ãŒããããšãåãããŒãžã®ã¢ã¯ã»ã¹ãäœåºŠãçºçããŸããç¥ãããã®ã¯å©çšã®æç¡ãªã®ã§ãèŠåã¯ãã¯ã©ã¹åãšããŒåãã®çµã¿åããããšã«äžåºŠã ãã«ããŠããŸãã æå¶ç¶æ
ã¯ã€ã³ã¹ã¿ã³ã¹éã§å
±æããéåžžã¯ãªã¯ãšã¹ãããšã«ãªã»ãããããŸãïŒåžžé§ã¯ãŒã«ãŒã§ã¯æç¶ïŒã廿¢åè£ã®äžèЧãã¯ã©ã¹ããšã«ãã£ãã·ã¥ããããã deprecatedKeys() ã¯åãã¯ã©ã¹ã®ã©ã®ã€ã³ã¹ã¿ã³ã¹ã§ãåãé
åãè¿ãããã«ããŸãã readonlyã¯ã©ã¹ã§ã¯staticããããã£ã宣èšã§ããªããããèŠåæžã¿ã®æ
å ±ã¯ã¡ãœããå
ã®static倿°ã«ä¿æããŸããããã«ãããDTOã®ããŒã¿ã倿Žããã«ãåŒã³åºãããŸããã§èŠåã®éè€ãæå¶ã§ããŸãã ãªãããã¬ãŒã ã¯ãŒã¯ãªã©ãçšæãããã«ããŒé¢æ°ã§é
åãæ±ã£ãŠããå Žåã¯ã眮ãæããéã«ç¢ºèªãå¿
èŠã§ããåŒæ°ã array åãªãDTOã¯æž¡ããŸããããå
éšã§é
åãžãã£ã¹ãããå Žåã¯ããã®ã¢ã¯ã»ã¹ã®èŠ³æž¬ãéããŸããã Twigã¯publicããããã£ããå
ã« ArrayAccess çµç±ã§å€ãèªãããããã®DTOã® category.count ã offsetExists() ãš offsetGet() ãéããŸããããã§ããã³ãã¬ãŒãã® category.count ãåç
§ããããèŠåãåºãããã«ãªããŸãã *2 廿¢ã§ãããšåãã£ãããæ®éã®DTOãžæ»ã å¿
èŠãªå©çšçµè·¯ã確èªãã count ã廿¢ã§ãããšå€æããããããããã£ãšå¯Ÿå¿ããé
åããŒããã®å€ãååŸããAPIãªã¯ãšã¹ããåé€ããŸããã³ã³ã¹ãã©ã¯ã¿ã®åŒã³åºãããã count ã®åŒæ°ãå€ããŸãã PHPã® $dto['name'] ãTwigã® category['name'] ãæ®ã£ãŠããå Žåã¯ãPHPã® $dto->name ãTwigã® category.name ã«å€æŽããŸããèªã¿æ¹ãæãããã AbstractDeprecatedKeyProbe ã®ç¶æ¿ãš parent::__construct() ãå€ããŸããæåŸã«æ®ãã®ã¯ã次ã®ãããªæ®éã®DTOã§ãã final readonly class CategoryDto { public function __construct ( public int $id, public string $name, ) { } } Twigãžã¯åŒãç¶ã category ãšããŠæž¡ããã®ã§ã {{ category.name }} ã¯ãã®ãŸãŸäœ¿ããŸãã芳枬ã®ããã«çšæããDTOãæšãŠãå¿
èŠã¯ãªããå¿
èŠãªé
ç®ã ããæã€POPOãªDTOãšããŠäœ¿ãç¶ããããŸãã ãããã« ä»åã¯ã ArrayAccess ãš trigger_error() ã䜿ããæ¢åã®åäœãä¿ã¡ãªãã廿¢åè£ã®ããŒãžã®ã¢ã¯ã»ã¹ã芳枬ããæ¹æ³ã玹ä»ããŸããã 芳枬ã®ä»çµã¿ãå€ããããšã«ã¯ãå¿
èŠãªé
ç®ã ããæã€POPOãªDTOãæ®ããŸããäžèŠãªåŠçãæžãããŠãããŒã¿ã®åãæž¡ããåä»ãã®DTOã«ç§»è¡ã§ããããã®äž¡æ¹ãé²ããããã®ããä»åã®ä»çµã¿ã®ãããããšããã§ãã çªç¶ã§ããç§ã¯ããããã³ãŒããåé€ããããç¡é§ãªåŠçãæ¶ããŠããã©ãŒãã³ã¹ãæ¹åãããããã®ã倧奜ç©ã§ããAIã«ãã£ãŠã³ãŒããã©ãã©ãå¢ãããããã«ãªã£ãä»ã ãããããå®å
šã«ã³ãŒããæ¶ããä»çµã¿ãçšæããŠãç©æ¥µçã«äžèŠãªã³ãŒããæ¶ããŠããããšã倧äºã ãšæã£ãŠããŸãïŒ ããããæ¥ã
ã®æ¹åãéããŠããµãŒãã¹ãæ¯ããã³ãŒããäžç·ã«è²ãŠãŠããããæ¹ã¯ããã²æ¡çšæ
å ±ãã芧ãã ããïŒ binc.jp *1 : ãã®æ¹æ³ã¯ã NewRelicと戦うレガシーPHP ãåèã«ããŸããã *2 : ãã®å®è£
ã§ã¯ãDrupalã® DeprecatedArray ãåèã«ããŸãããArrayObjectãç¶æ¿ããã¢ã¯ã»ã¹æã«E_USER_DEPRECATEDãåºããªããå
ã®åŠçãç¶ãããè¿ãçºæ³ã®å®è£
ã§ããDrupalã§ã¯é
åå
šäœãéæšå¥šãšããŠæ±ããŸãããä»åã¯å»æ¢åè£ã®ããŒã«çµã£ãŠèŠ³æž¬ããŠããŸãã
ããã«ã¡ã¯ãNTTãã³ã¢ããžãã¹æ
å ±ã»ãã¥ãªãã£éšã§ãã NTTãã³ã¢ããžãã¹ãå«ãããã³ã¢ã°ã«ãŒãã§ã¯ä»å¹ŽãçŸå Žåãå
¥ãåã€ã³ã¿ãŒã³ã·ãããéå¬ããããŸããã æ
å ±ã»ãã¥ãªãã£éšã§ã5ã€ã®ãã¹ãã«å¯ŸããŠ8人ã®ã€ã³ã¿ãŒã³ã·ããçã«æ¥ãŠããã ãã2é±éã«ãããããã°ã©ã ã«åãçµãã§ããã ããŸããïŒ ã€ã³ã¿ãŒã³ã·ããçã®ç®ç·ã§ããã¹ã玹ä»ãäœéšããæ¥åå
å®¹ãæ¯ãè¿ãããŸãšããŠããããŸããã ãã®èšäºã§ã¯ããããããã¹ãããšã«ã玹ä»ããŸãã ã€ã³ã¿ãŒã³ã·ããçç®ç·ã®ãããªã¢ã«ãªäœéšèšãéããŠã次å以éã«å¿åãæ€èšãããæ¹ã®äžå©ãšãªãã°å¹žãã§ãã ãD1ãCSIRTã§ã®ãµã€ããŒæ»æãžã®å¯Ÿå¿å®è·µãšé«åºŠåæ ãã¹ã玹ä»â äœéšããæ¥åå
å®¹â æŒç¿1æ¥ç® æŒç¿2æ¥ç® æ¯ãè¿ãâ ãã¹ã玹ä»â¡ äœéšããæ¥åå
容⡠Linuxã®ãã©ã¬ã³ãžãã¯æŒç¿ Windowsã®ãã©ã¬ã³ãžãã¯æŒç¿ æ¯ãè¿ãâ¡ ãD10ãCSIRTéçšæ¥åã®å¹çåã«åããDXå ãã¹ãçŽ¹ä» äœéšããæ¥åå
容 æ¯ãè¿ã ãD11ãCSIRTã§è
åšã€ã³ããªãžã§ã³ã¹ããã³ããªã³ã°ããã»ãã¥ãªãã£ãšã³ãžã㢠ãã¹ãçŽ¹ä» äœéšããæ¥åå
容 æ¯ãè¿ã ãD12ããããã¯ãŒã¯ã»ãã¥ãªãã£è£œåãæŽ»çšããããŒã¿/è
åšåæãå®è£
ããã³éçšé«åºŠå ãã¹ãçŽ¹ä» äœéšããæ¥åå
容 NDR補åãçšããæš¡æ¬æ»æã®è©³çŽ°èª¿æ» NDR補åã«ãããäžæ¬¡èª¿æ»ã®æé æžäœæ æ¯ãè¿ã ãD13ãæ»æè
èŠç¹ã§ç€Ÿå
é²åŸ¡åãé«ããã»ãã¥ãªãã£ãšã³ãžã㢠ãã¹ãçŽ¹ä» äœéšããæ¥åå
容 ãããã¬ãŒã·ã§ã³ãã¹ãã®å®æœãšWriteupäœæ æ¹åææ¡è¡šã®äœæ MITRE ATT&CKãããã³ã° æ¯ãè¿ã ãããã« ãD1ãCSIRTã§ã®ãµã€ããŒæ»æãžã®å¯Ÿå¿å®è·µãšé«åºŠåæ D1ãã¹ãã¯ã2ã€ã®ããŒã ã®ååãã¹ãã§ããããããã®ããŒã ã®æ¥åãäœéšããŠããã ããŸããïŒ ãã¹ã玹ä»â EDRïŒEndpoint Detection and ResponseïŒ 1 ãSIEMïŒSecurity Information and Event ManagementïŒ 2 ããã®ã¢ã©ãŒã察å¿ãããã³ç€Ÿå
å€ããå ±åãããã€ã³ã·ãã³ããžã®å¯Ÿå¿ãäœéšã§ãããã¹ãã§ããã€ã³ã¿ãŒã³ã·ããã§ã¯ãéé¢ãããæ€èšŒç°å¢ã«ãããŠæš¡æ¬æ»æã宿œããEDRã®ã¢ã©ãŒãç²ŸåºŠãæ€èšŒããŸããã äœéšããæ¥åå
容â MITRE瀟ãéçºããçŸåšã¯Apache Software Foundationã«ãããŠéçºãé²ããããŠããæ»æã·ãã¥ã¬ãŒã·ã§ã³ããŒã«ã Apache Caldera ããçšããããŸããŸãªæ»æææ³ãåçŸããŸããããã®ããã§ããã©ã®ãããªæäœãã³ãã³ããEDRã«æ€ç¥ãããã®ãããéã«ãã©ã®ãããªæåãæ€ç¥ããã«ããã®ãããšãã芳ç¹ããåæãããŸããã æŒç¿ç°å¢ã¯ãæ»æããããã®VM1å°ãšãæ»æå¯Ÿè±¡ãšãªãVM2å°ã§æ§æãããŠããŸããã æŒç¿1æ¥ç® 1æ¥ç®ã¯ãæš¡æ¬æ»æã«ãã£ãŠçºçããEDRã®ã¢ã©ãŒããåæããã€ã³ã·ãã³ã察å¿ãäœéšããŸããã å
·äœçã«ã¯ãæç€ºããã4ä»¶ã®ã¢ã©ãŒãã«ã€ããŠã以äžã®èгç¹ãã調æ»ã»æ€èšããŸããã ãªãã¢ã©ãŒããçºçããã®ã EDRã¯ã©ã®ãããªæåãæ€ç¥ããã®ã ã©ã®ãããªè
åšãèããããã®ã å®éã®éçšã§ã¯ã©ã®ãããªå¯Ÿå¿ãå¿
èŠã«ãªãã®ã åã«ã¢ã©ãŒãã®å
容ã確èªããã ãã§ãªããæ³å®ãããè
åšãå¿
èŠãšãªã察åŠãèããããšã§ãã€ã³ã·ãã³ãå¯Ÿå¿æ
åœè
ã«æ±ããããèãæ¹ãåŠã¶ããšãã§ããŸããã æŒç¿2æ¥ç® 2æ¥ç®ã¯ãApache CalderaãçšããŠãªãªãžãã«ã®æ»æã·ããªãªãäœæãããã®æåãEDRã«ã©ã®ããã«æ€ç¥ãããã®ããæ€èšŒããŸããã æ»æã·ããªãªãèªãèšèšããããšã§ãæ»æåŽã®èŠç¹ãšé²åŸ¡åŽã®èŠç¹ã®äž¡æ¹ããã»ãã¥ãªãã£å¯Ÿçãèããããšãã§ããŸããã ãŸããå®éã«ã·ããªãªãå®è¡ããŠæ€ç¥çµæãåæããããšã§ãEDRãã©ã®ãããªæ¯ãèããéèŠããŠç£èŠããŠããã®ããçè§£ãæ·±ããããšãã§ããŸããã ä»å远å ããæ»æã·ããªãªã®äŸã¯ä»¥äžã®ãšããã§ãã ãããã¯ãŒã¯ãã¹ãã£ã³ããŠã飿¥IPãèª¿æ» èŠã€ããIPã«å¯ŸããŠããŒãã¹ãã£ã³ cuppãcloneããŠããã¹ã¯ãŒããªã¹ããäœæ äœæãããªã¹ãã䜿ã£ãŠHydraã§ãã°ã€ã³è©Šè¡ ç¹å®ãããã¹ã¯ãŒãã§ãã°ã€ã³ æ¯ãè¿ãâ ä»åã®æŒç¿ãéããŠãã¢ã©ãŒãå¯Ÿå¿æ¥åãžã®çè§£ãæ·±ããããšãã§ããŸãããå®éã®éçšã§ã¯é倧ãªã€ã³ã·ãã³ããçºçããããšã¯å€ããªããæ¥ã
çºçããã¢ã©ãŒãã®äžã«ã¯èª€æ€ç¥ãå€ãããšãåŠã³ãŸããããã®ããšããã倿°ã®ã¢ã©ãŒãã®äžãã誀æ€ç¥ãé©åã«å€æããè¿
éã«å¯Ÿå¿ããããšã®éèŠæ§ãçè§£ããŸããããŸããIoCïŒIndicators of CompromiseïŒ 3 ã ãã§ãªãIoAïŒIndicators of AttackïŒ 4 ã«çç®ããæ€ç¥ã®èãæ¹ã«ãè§Šããã©ã®ãããªæ¯ãèããã«ãŒã«åããã°å¹æçãªæ€ç¥ã«ã€ãªããã®ããèããè¯ãæ©äŒãšãªããŸããã ä»åã®æŒç¿ãããå®éã®ç°å¢ã«ãããEDRã®å
·äœçãªäœ¿ãæ¹ãéçšæ¹æ³ãåŠã¶ããšãã§ããŸããããŸããèªãæ»æã·ããªãªãäœæããçºçããã¢ã©ãŒãã調æ»ãããšããäžé£ã®æµããçµéšããŸããããã®éçšã§ãæ»æåŽãšé²åŸ¡åŽãçžäºã«æè¡ãé«ãåãããšã®éèŠæ§ã確èªã§ããŸãããä»åŸã¯ãæ»æåŽãšé²åŸ¡åŽãåæ¹ã®èŠç¹ããæããŠæè¡ãé«ããŠãããããšæããŸãã EDRãå®éã«äœ¿çšããããšã§ããããŸã§äžæçã§ãã£ãCSIRTã®å
·äœçãªæ¥åããã»ã¹ã«ã€ããŠçè§£ãæ·±ããããŸããããŸããå®éã®å¯Ÿå¿ã«ãããŠã¯ãRed Teamã®èŠç¹ãæã€ããšã®éèŠæ§ãšãããŒã å
ã§ã®é£æºãã³ãã¥ãã±ãŒã·ã§ã³ãäžå¯æ¬ ã§ããããšãåŠã³ãŸãããä»åã®çµéšãèžãŸããä»åŸã®åŠç¿ã«ãããŠãApache Calderaãæ¥åžžçã«æŽ»çšããŠãããããšèããŠããŸãã ãã¹ã玹ä»â¡ Blue Teamã®äžå¡ãšããŠãããžã¿ã«ãã©ã¬ã³ãžãã¯èª¿æ»ãè匱æ§ç®¡çãªã©ã宿œããæ¥åã§ããã€ã³ã¿ãŒã³ã§ã¯ããã©ã¬ã³ãžãã¯æŒç¿ã«åãçµã¿ãŸããã äœéšããæ¥åå
容⡠æ¬ãã¹ãã®æ¥åã§ã¯ãLinuxãšWindowsã察象ãšãããã©ã¬ã³ãžãã¯æŒç¿ã«åãçµã¿ãŸããã Linuxã®ãã©ã¬ã³ãžãã¯æŒç¿ Linuxã®ãã©ã¬ã³ãžãã¯æŒç¿ã§ã¯ãDrupalã®RCEïŒRemote Code ExecutionïŒèåŒ±æ§ ãæªçšããæ»æã顿ãšããŠæ±ããŸãããRCEã¯ãæ»æè
ããããã¯ãŒã¯è¶ãã«å¯Ÿè±¡ãµãŒããã¢ããªã±ãŒã·ã§ã³äžã§ä»»æã®ã³ãŒããå®è¡ã§ããŠããŸãè匱æ§ã§ãã æŒç¿ã§ã¯ãApacheã®ã¢ã¯ã»ã¹ãã°ãèªèšŒãã°ãã³ãã³ãå®è¡ãã°ãªã©ã調æ»ããæ»æã®çè·¡ã䟵å
¥åŸã®æŽ»åãåæããŸããã éããæ»æã®èšŒæ ãæç³»åã§ç¢ºèªããããšã§ãæ»æè
ã«ããã³ãã³ãå®è¡ãæš©éææ Œãããã¯ãã¢çšã®ãŠãŒã¶äœæã«ããæ°žç¶åãWebã·ã§ã«ã®èšçœ®ãŸã§ãæ»æã®æµãã远跡ããŸããã Windowsã®ãã©ã¬ã³ãžãã¯æŒç¿ Windowsã®ãã©ã¬ã³ãžãã¯æŒç¿ã§ã¯ã被ç端æ«ããååŸããåçš®ã¢ãŒãã£ãã¡ã¯ãïŒã·ã¹ãã ãå©çšè
ã®æŽ»åå±¥æŽã瀺ãããŒã¿ïŒã調æ»ããŸããã å
·äœçã«ã¯ããã¡ã€ã«æäœã®å±¥æŽã確èªã§ãããMFTïŒMaster File TableïŒããWindowsã®ã€ãã³ããèšé²ãããã€ãã³ããã°ããå®è¡ãããããã°ã©ã ã®æ
å ±ãæ®ããPrefetchãããAmcacheãããŠãŒã¶æäœã®çè·¡ã確èªã§ãããUserAssistãããããã¯ãŒã¯éä¿¡ãåæãããPCAPïŒPacket CaptureïŒããªã©ãçšããŠãäžå¯©ãªæŽ»åã®æç¡ãåæããŸããã ãã®çµæããŠãŒã¶ç«¯æ«äžã§ã³ãŒããšãã£ã¿è£œåã®æ£èŠããŒã«ãè£
ã£ããã«ãŠã§ã¢ãå®è¡ããã端æ«ã®ãŠãŒã¶æ
å ±ãIPã¢ãã¬ã¹ãªã©ã®æ
å ±ãæ»æè
åŽãžéä¿¡ãããŠããããšã確èªããŸããã æ¯ãè¿ãâ¡ Linuxããã³Windowsç°å¢ã®ãã©ã¬ã³ãžãã¯æŒç¿ãéããŠãã€ã³ã·ãã³ãçºçæã«ã©ã®ãã°ãåªå
çã«ç¢ºèªãã¹ããããŸãã©ã®ãããªèгç¹ã§èª¿æ»ãé²ããã¹ãããå確èªã§ããŸãããæç³»åã§äºè±¡ãæŽçããéèŠæ§ã¯çè§£ããŠããŸãããããã°ããçè·¡ãå¹ççã«èŠã€ãåºãèŠç¹ãéèŠã§ãããšåŠã³ãŸãããç¹ã«Windowsã§ã¯ãUserAssistã ãã§ãªãPrefetchãAmcacheãªã©è€æ°ã®ã¢ãŒãã£ãã¡ã¯ããçµã¿åãããŠåæããããšã§ãããã°ã©ã ã®å®è¡æå»ãå®è¡åæ°ãããæ£ç¢ºã«ææ¡ã§ããããšãå°è±¡çã§ãããçãåãããä»ã®åå è
ãšã®è°è«ãéããŠãç¥ããªãã£ãã¢ãŒãã£ãã¡ã¯ããèª¿æ»ææ³ã«ã€ããŠãåŠã¶ããšãã§ãã倧倿æçŸ©ãªçµéšãšãªããŸããã æŒç¿ãéããŠããã©ã¬ã³ãžãã¯èª¿æ»ã«å¿
èŠãšãªãåçš®ããŒã«ã®çšéãäœ¿çšæ¹æ³ãåŠã¶ãšãšãã«ãå®éã®è§£æã«è³ããŸã§ã®å
·äœçãªæ¥åãããŒãææ¡ã§ããŸããããŸãã瀟å¡ã®æ¹ããã®è§£èª¬ãèãäžã§ããã°ããæœåºã»æšæž¬ã§ããæ
å ±ãèª¿æ»ææ³ã«ã€ããŠãèªåã®ãã©ã¬ã³ãžãã¯ã«é¢ããç¥èã¯ååã§ãªããšçæããŸãããä»åã®çµéšãèžãŸããä»åŸã¯ãã°åæããã©ã¬ã³ãžãã¯ã«é¢ããç¥èŠãããã«åºããç¶ç¶ããŠåŠç¿ã«åãçµã¿ãããšèããŠããŸãã ãã©ã¬ã³ãžãã¯æŒç¿ãéããŠããã©ã¬ã³ãžãã¯ã®å®åã«ã€ããŠããå
·äœçãªçè§£ãåŸãããšãã§ããŸãããç¹ã«ãåå è
3åãããããç°ãªãææ³ãçšããŠèª¿æ»ãé²ããŠããç¹ã確èªã§ãã調æ»ã«ãããå€è§çãªèŠç¹ã®éèŠæ§ãèªèããŸããããŸããå®éã®éçšãéããŠãOSã®ä»çµã¿ãã¯ãããšãããèªèº«ã«äžè¶³ããŠããç¥èãæç¢ºã«ãªããŸãããä»åŸã¯ãããã®é åã«ã€ããŠãç¶ç¶çã«åŠç¿ãé²ããæè¡çãªçè§£ãæ·±ããŠãããããšèããŠããŸãã ãD10ãCSIRTéçšæ¥åã®å¹çåã«åããDXå ãã¹ãçŽ¹ä» ã»ãã¥ãªãã£ãªãã¬ãŒã·ã§ã³ã®å¹çåãšé«åºŠåãç®çãšããéçºæ¥åãäœéšããŸããã å
·äœçã«ã¯ãâ ã¢ã©ãŒãã¡ãŒã«ã®èªåãã±ããåãšãâ¡åãåããæã®éç¥æ©èœã®èªååã«åãçµã¿ãŸããã äœéšããæ¥åå
容 ãŸããâ ã¢ã©ãŒãã¡ãŒã«ã®èªåãã±ããåã«ã€ããŠèª¬æããŸãã ã¡ãŒã«åä¿¡ããã¯ã¹ã«ã»ãã¥ãªãã£ã¢ã©ãŒãã¡ãŒã«ãå±ããéã«ãã¡ãŒã«ã®å
å®¹ãæœåºããŠãã±ãã管çã·ã¹ãã ã«èªå起祚ããæ·»ä»ãã¡ã€ã«ãä¿ç®¡é åã«ä¿åããããã§ãã³ãã¥ãã±ãŒã·ã§ã³ããŒã«ã«ã¢ã©ãŒãã®çºçãç¥ãããéç¥ã·ã¹ãã ãéçºããŸããã ä»åã¯ãã€ã³ã·ãã³ãã¬ã¹ãã³ã¹ã«å¿
èŠãªæ
å ±ãã©ãããšãã芳ç¹ããã以äžã®3çš®é¡ã®ã¡ãŒã«ããšã«å®è£
ãåããŸããã åå ±ã¡ãŒã«ã®å Žåãæ°ãã«ãã±ãããäœæããéç¥ãã æŽæ°ã¡ãŒã«ã®å Žåãæ¢åã®ãã±ãããæŽæ°ããéç¥ãã é±éã¬ããŒãã¡ãŒã«ã®å Žåãäœãããã«åŠçãçµäºãã æ¬æ Œçãªã·ã¹ãã ã®äœæåã«ããŸã2人ã§èŠä»¶å®çŸ©ã®æŽãåºããè¡ããŸããã ãããŸã§èŠä»¶å®çŸ©ã®çµéšããªãã£ããããå®éã«äœæããªããåŠã¶ããšãå€ããããŸããã ç¹ã«ããšã©ãŒãªã©ã®ç°åžžç³»ãã©ããŸã§æ³å®ããŠèšèŒãã¹ããã«ã€ããŠã¯ã2äººã§æ©ã¿ãªããæ€èšãéãã詊è¡é¯èª€ããªãã宿ãããŸããã èŠä»¶å®çŸ©ãäœæããããšã§ãä»åŸäœãäœæããªããã°ãªããªãã®ããæç¢ºã«ãªããŸããã ãã®åŸã¯ãèŠä»¶å®çŸ©ã®å
容ãåºã«åèªã§ãããŒãã£ãŒããäœæããåŠçã®æµããå®è£
å
容ãžã®çè§£ãæ·±ããããšãã§ããŸããã æè¡çã«äžæã§èª¿æ»ãå¿
èŠãªç®æã«ã¯å¹ãåºãã§ã¡ã¢ãæ®ããéçºåã«ã¢ãã¯ã¢ãããäœæããŠæè¡èª¿æ»ãããŸããã æ¬å®è£
ã§ã¯ããããŸã§æŽçããŠããèŠä»¶ã調æ»çµæãåºã«ãèªååããŒã«ãçšããŠã¯ãŒã¯ãããŒãäœæããŸããã ã¢ã©ãŒãã¡ãŒã«ã«å«ãŸããæ
å ±ãæœåºãããã±ãã管çã·ã¹ãã ãžå¿
èŠãªæ
å ±ãèªåã§èµ·ç¥šãããšãšãã«ãã³ãã¥ãã±ãŒã·ã§ã³ããŒã«ãžã®éç¥ãèªååããä»çµã¿ãæ§ç¯ã§ããŸããã å®è£
ã®éçšã§ã¯ãåããŠã®èªååéçºãšããããšãããããšã©ãŒå¯Ÿå¿ãåŠçã®å®è£
æ¹æ³ã«æ©ãå Žé¢ãå€ããããŸããã ãããããã®éœåºŠåå ã調æ»ããèšå®ãåŠçå
容ãèŠçŽããªãã詊è¡é¯èª€ãéããããšã§ãã²ãšã€ã²ãšã€èª²é¡ã解決ã§ããŸãããæçµçã«ã¯èŠä»¶ãæºããã¯ãŒã¯ãããŒã宿ãããããšãã§ããæè¡çãªæé·ã宿ãããšãšãã«ã倧ããªéææãåŸãããšãã§ããŸããã æ¬¡ã«ãâ¡åãåããæã®éç¥æ©èœã®èªååã«ã€ããŠèª¬æããŸãã â ã§èªååããŒã«ãçšããéçºãžã®çè§£ãæ·±ããåŸã¯ããããŸã§ã«åŠãã ç¥èãçµéšã掻ããããã±ããã·ã¹ãã ã®å©çšè
ããéä¿¡ãããåãåããããã©ãŒã ãšãªã¹ãã§ç®¡çããæ°ããªåãåãããå±ããéã«ãã±ããã·ã¹ãã ã®éçšæ
åœè
ãžéç¥ããã·ã¹ãã ãéçºããŸããã ååã®éçºã§åŸãç¥èŠã掻çšããªããèšèšã»å®è£
ãé²ããããšã§ããµãŒãã¹éã®é£æºãèªååã«ã€ããŠãããã«çè§£ãæ·±ããããšãã§ããŸããã ãŸããåãåãããã©ãŒã ãéä¿¡ããããšããã®å
容ã管çãªã¹ãã«æçš¿ãããŸãã ãã®ãšããã³ãã¥ãã±ãŒã·ã§ã³ããŒã«ãžã®éç¥ã ãã§ãªããç¶æ
ã¹ããŒã¿ã¹ã倿Žãã仿§ãå®è£
ããŸããã æ°èŠã®åãåãããç»é²ããããšãåãåããå
容ãå«ãéç¥ãé¢ä¿è
ãžèªåéä¿¡ãããä»çµã¿ãå®è£
ããŸããã ãŸããéç¥å
ã®ã¢ã¯ã·ã§ã³ãã¿ã³ãæäœããããšã§ããªã¹ãã§ç®¡çããŠããåãåããã®ç¶æ
ããåä»ãããã察å¿äžããžãã察å¿äžããããå®äºããžæŽæ°ã§ããããã«ããŸããã ããã«ãããåãåãã察å¿ç¶æ³ã®ç®¡çãå¹çåããéçšæ
åœè
ãè¿
éã«å¯Ÿå¿ã§ããä»çµã¿ãå®çŸã§ããŸããã æ¯ãè¿ã ä»åã®ã€ã³ã¿ãŒã³ã·ããã§ãäŒç€Ÿã§ã®éçºã¯ãä»ã®ããŒã ã®æ¹ã
ãéçºããããŒã«ã䜿çšããå©çšè
ãä»åŸæ°ãã«æ©èœãæ¡åŒµããä»ã®éçºè
ã®ããšãŸã§èããªããé²ãããã®ã§ãããšã身ããã£ãŠå®æããŸãããç¹ã«ãå®è£
æ¹æ³ãè€æ°èããããå Žåã«ãã©ã®ãã¿ãŒã³ãéžã¶ãã®å€æåºæºãå©çšè
ãä»ã®éçºè
ã«ããããšãç¥ãããšãã§ããã€ã³ã¿ãŒã³ã·ããã«åå ããŠããã£ããšæããŸããã 2é±éã®ã€ã³ã¿ãŒã³ã·ãããéããŠãæéå
ã«ææç©ã宿ãããããã®æéã»ã¹ã±ãžã¥ãŒã«ç®¡çã®å¿
èŠæ§ããæ¥åãé²ããããã§ã®æ
å ±å
±æã»ã³ãã¥ãã±ãŒã·ã§ã³ã®éèŠæ§ããã©ã€ã¢ã³ããšã©ãŒãç¹°ãè¿ããŠåé¡ã解決ããåãçè§£ãã身ã«ã€ããŸããããã®çµéšã掻ããããããªãèªå·±ç éœãé²ããå¿çšãæ¡åŒµã«ãé©å¿ã§ãã人éã«æé·ããããšèããŠããŸãã ãD11ãCSIRTã§è
åšã€ã³ããªãžã§ã³ã¹ããã³ããªã³ã°ããã»ãã¥ãªãã£ãšã³ãžã㢠ãã¹ãçŽ¹ä» ãµã€ããŒæ»æã«ãã瀟å
ã·ã¹ãã ãžã®ã€ã³ã·ãã³ãè¢«å®³ã®æå°åãšæªç¶é²æ¢ãããã·ã§ã³ãšããŠãããã»ãã¥ãªãã£ãšã³ãžãã¢ã®ãã¹ãã§ãïŒ ããŒã å
ã§è¡ã£ãŠããæ¥åã¯ããŸããŸã§ããã代衚äŸãšããŠãå
¬éæ
å ±ããè
åšã¢ã¯ã¿ãŒã®åãã芳枬ããŠããŸãã ãŸããæ¥ã
æŽæ°ãããèåŒ±æ§æ
å ±ã®äžãããªã¹ã¯ã®é«ããã®ãã¬ããŒãã£ã³ã°ããé¢é£éšçœ²ãžã·ã¹ãã ã®ããŒãžã§ã³ç®¡çãã¢ããããŒããä¿ããŠããŸãã äœéšããæ¥åå
容 瀟å
ã·ã¹ãã ã«é¢é£ããè匱æ§ãå
¬éãããéã«ãä»éšçœ²ãžæ³šæåèµ·ããããã®ã€ã³ããªãžã§ã³ã¹ã¬ããŒãããClaudeã®SkillãçšããŠèªåçã«äœæã§ããããå®è£
ããŸããã ããã³ãã£ã¢AIã®ç»å Žã«ããè匱æ§ã®å ±åæ°ãå¢å ãã察å¿ã«è¿œãããŠããçµç¹ãå€ããç§ãåå ããããŒã ã§ãåæ§ã®èª²é¡ãæ±ããŠããŸããã ãã®èª²é¡ã解決ããããã«ãåãäžããã«å€ããè匱æ§ã®ã¹ã³ãŒãããšã«SkillããªãŒã±ã¹ãã¬ãŒã·ã§ã³ããããšã§ãç¶²çŸ
æ§ã確ä¿ãã€ã€å©çšè
ã®èª¿æ»æ¥åã®æéççž®ã«ã€ãªããããã«èšèšããç¹ããã€ã³ãã§ãã å®éã«ãã®Skillã䜿çšããããšã«ãã£ãŠãæ¥åäžã§æ¹åãããç¹ã¯3ã€ãããŸãã 1ã€ãã¯ãã€ã³ããªãžã§ã³ã¹ã¬ããŒãã®åè³ªã®æ
ä¿ã§ãããããŸã§ã¯åã¡ã³ããŒãããããLLMãçšããŠã¬ããŒãã®èæ¡ãäœæããŠããŸããããããã³ããã®äžãæ¹ãåç
§ãœãŒã¹ã®éžã³æ¹ãã¡ã³ããŒããšã«ç°ãªããããåãCVEãæ±ã£ãŠãåºæ¥äžããèæ¡ã®ç²åºŠã芳ç¹ã«ã°ãã€ããçããŠããŸããã ä»åäœæããSkillã§ã¯ãåéãã¹ãæ
å ±æºã»èšäºã®æ§æã»æäœæéããããããå®ååããããšã§ã誰ãå®è¡ããŠãäžå®ã®æ°Žæºãæ
ä¿ã§ããç¶æ
ã«ããŸããã 2ã€ãã¯ãã¬ãã¥ãŒå·¥æ°ã®åæžã§ããåŸæ¥ã¯ã¬ãã¥ã¢ãŒãèæ¡ãåãåã£ãŠããè€æ°åã®ææã»ä¿®æ£ã®ããåããçºçããŠããŸããããSkillåŽã§æäœãã§ãã¯ãåç
§ãªã³ã¯ã®çå確èªãæªç¢ºèªé
ç®ã®å¯èŠåãŸã§ãèªåã§è¡ãããã«ãããããã¬ãã¥ãŒå·¥æ°ãå®è³ª1åã§æžãããã«ãªããã¬ããŒãäœæå
šäœã«èŠããæéã倧å¹
ã«ççž®ãããŸããã æåŸã«ãäœæã³ã¹ãã®å®ãã§ãã1æ¬ã®ã€ã³ããªãžã§ã³ã¹ã¬ããŒããçæããã®ã«ãããè²»çšã¯Opus 4.7ã§500ã600åçšåºŠã«åãŸã£ãŠãããé »ç¹ã«éçšããŠãè² æ
ã«ãªããªãæ°Žæºãå®çŸã§ããŸããã æ¯ãè¿ã æ¬èª²é¡ãå§ããåã«ãè
åšã€ã³ããªãžã§ã³ã¹ãšã¯äœããç¥ãããã5ã€ã®STEPãããªãç·åæŒç¿ã§æ§æãããã³ãŒã¹ã¯ãŒã¯ã«åãçµã¿ãŸããã ãã®éãã€ã³ããªãžã§ã³ã¹ãšããæœè±¡çã§èª¬æããããæŠå¿µãçè§£ãããããã¢ã¡ãªã«çµ±ååè¬æ¬éšãå
¬éããŠãããJP 2-0 5 ããèªã¿ãŸãããããã€ã³ããªãžã§ã³ã¹ãšã¯äœããããŸããŸãçè§£ã§ããªããªãå°ããŸããã çè§£ãåã°ãªãéšåã«ã€ããŠã¯ãæœè±¡çãªæŠå¿µãã€ããããã«è
åšã€ã³ããªãžã§ã³ã¹ã®æç§æžãèªã¿èŸŒã¿ãŸãããã€ã³ã¿ãŒã³ã·ããæéäžã¯åèŠå
«èŠããŸããããåºç€çãã€éèŠãªäºé
ããèŠãã¿ãªãããèªåã®èšèã§è¡šçŸã§ãããšãã¯ãšãŠãå¬ããã£ãã§ãã æ¬èª²é¡ã§ã¯ãããŒã ã®æ¥åžžæ¥åã®å¹çåãšãªã¹ã¯ã®æç¢ºåãç®æšã«ãClaudeã®Skillã§ã€ã³ããªãžã§ã³ã¹ã¬ããŒãã®èªåçæã«åãçµã¿ãŸããã æç« ã ãã§èŠããšãããŸãããããå®è£
ã§ã¯ãªãã®ã§ã¯âŠâŠïŒããšæããããããããŸããããããä»åã®å®è£
ã¯ãçŸå Žã§ããäœã課é¡ãªã®ããäœãã§ãããšå¬ããã®ãããèŠä»¶å®çŸ©ããããŠããªãæé»ç¥ãæ±ããã®ã§ãããç§å人ã§å®çµã§ããå
容ã§ã¯ãããŸããã§ããã ãã®ãããã¡ã³ã¿ãŒã®æ¹ã
ãäžé·ãå«ãããŒã ã¡ã³ããŒãšè°è«ãéããªããé²ããå¿
èŠããããçžå¿ã®æéãèŠããé£æåºŠã®é«ãåãçµã¿ãšãªããŸããã èŠä»¶ãå®çŸ©ãã¥ãã課é¡ã«ããŒã ã¡ã³ããŒãšååããªããåãçµãã çµéšã¯ããããŸã§ã®å人éçºã§ã¯æ±ºããŠåŸãããªããã®ã§ãããæ¬èª²é¡ãéããŠèª²é¡èšå®åãšãçãæéã®ãªãã§å·éã«åªå
é äœã倿ãç©äºãæšé²ããåã身ã«ã€ãããšæããŠããŸãã æåŸã«ãæ¬ã€ã³ã¿ãŒã³ã·ããå
šäœã®åŠã³ãæžããŠçµãããããšæããŸããè
åšã€ã³ããªãžã§ã³ã¹ã¯ãç§åŠçãªæ€èšŒã«ãã£ãŠç¢ºå®æ§ãä¿èšŒãããé åã§ã¯ãããŸããã仮説ããææã§ããè
åšã¯ãšããžã±ãŒã¹ãããããŸããããéã«äœãããããªããŠãããããçŸæç¹ã§ã®ãã¹ããšãã©ãŒããããããŸããã ã ãããããçŽæçãªæŽå¯ãšè«ççãªåæã®åæ¹ããè§£éããæ
å ±ãæææ±ºå®ã«æŽ»ããããšãã¢ããªã¹ãã®è²¬åã§ã¯ãããŸããããããæãåŸãã«ã¯èç¶æ§ãæ£ããå€å®ããããã®ããã»ã¹ãèžã¿ç¶ããå¿
èŠãããããã®å¶ã¿ãç¶ç¶ããããšã®é£ãããåŠã³ãŸããã ãD12ããããã¯ãŒã¯ã»ãã¥ãªãã£è£œåãæŽ»çšããããŒã¿/è
åšåæãå®è£
ããã³éçšé«åºŠå ãã¹ãçŽ¹ä» æ¬ãã¹ãã§ã¯ãæ°ãã«å°å
¥ããã»ãã¥ãªãã£è£œåã®è©äŸ¡ããçµç¹ã§æŽ»çšããŠããããã®éçšæ¯æŽæ¥åãè¡ã£ãŠããŸãã ãã®äžã§ç§ã¯ããããã¯ãŒã¯äžã®äžå¯©ãªéä¿¡ãæ€ç¥ã»åæããNDRïŒNetwork Detection and ResponseïŒã«ãããŠãæš¡æ¬æ»æã詳现ã«èª¿æ»ãããã®ç¥èŠã誰ããæŽ»çšã§ããããæé æžã®äœæã«åãçµã¿ãŸããã äœéšããæ¥åå
容 NDR補åãçšããæš¡æ¬æ»æã®è©³çŽ°èª¿æ» NDRã§æ€ç¥ãããã¢ã©ãŒãã®è©³çŽ°èª¿æ»ã宿œããŸãããã¢ã©ãŒãã«é¢é£ããéä¿¡ãæ¡ä»¶ã§çµã蟌ã¿ãªãã確èªããå®éã«ã©ã®ãããªæ»æè¡åãè¡ãããŠããã®ããåæããŸããã 調æ»ãéããŠãåŸãããæ
å ±ãããšã«æ»æè
ã®è¡åãæšæž¬ããæ»æã®ã·ããªãªãçµã¿ç«ãŠãªããéä¿¡å
容ãåæããããšã®éèŠæ§ãåŠã³ãŸããã äžèšã®å³ã¯ãã¢ã©ãŒãã«é¢é£ããéä¿¡ãSQLæãçšããŠãã£ã«ã¿ãªã³ã°ããçµæã§ãã NDR補åã«ãããäžæ¬¡èª¿æ»ã®æé æžäœæ NDRã§ã¢ã©ãŒããçºçããéã«ãäžæ¬¡èª¿æ»ã§äœ¿çšããæé æžãäœæããŸãããæé æžã®äœæã«ããã£ãŠã¯ã補åã®æ©èœãæäœæ¹æ³ãæŽçããã ãã§ãªããå®éã«ã¢ã©ãŒããçºçããéã®èª¿æ»ã®æµããæ³å®ããªããå
å®¹ãæ€èšããŸããã ãŸããå©çšè
ãå¿
èŠãªæ
å ±ã«è¿·ãããã©ãçãããããå®éã®éçšã§æ±ãããã確èªäºé
ã倿ææãæèããŠææžåãè¡ããŸããã äžèšã®å³ã¯ãå®éã«äœæããæé æžã®äžéšã§ããæé æžã®äœæã«ããã£ãŠã¯ãå®éã®NDRã®æäœç»é¢ã®ã¹ã¯ãªãŒã³ã·ã§ããã䜿çšããå³äžã®ç¢ºèªç®æããã³ããªã³ã°ããŠæ¬æãšã®å¯Ÿå¿é¢ä¿ãæç¢ºã«ããŸããã ãŸããæš¡æ¬æ»æã®è©³çŽ°èª¿æ»ã宿œããéã«çè§£ã倿ã«è¿·ã£ãç®æã«ã€ããŠã¯ãèª¿æ»æã®èгç¹ã確èªãã€ã³ããè£è¶³ãããªã©ãå©çšè
ãè¿·ãã調æ»ãé²ãããããã工倫ããŸããã æ¯ãè¿ã ä»åã®ã€ã³ã¿ãŒã³ã·ããã§ã¯ãã»ãã¥ãªãã£è£œåãã®ãã®ã ãã§ãªããçµç¹ã«ãããéçšã«ã€ããŠãåŠã¶ããšãã§ããŸãããç¹ã«æé æžã®äœæã§ã¯ãæäœæ¹æ³ããŸãšããã ãã§ãªãããã®æ
å ±ãã©ã®ããã«æŽ»çšãããã®ããæèããå¿
èŠããããŸããã ãŸããå®éã®éçšã§ã¯ä»çµç¹ãšã®é£æºãæ±ãããããããå©çšè
ã®èŠç¹ã§å¿
èŠãªæ
å ±ãæŽçããåãããããäŒããããšã®éèŠæ§ãåŠã³ãŸããã ä»åŸã¯ãæ¬ã€ã³ã¿ãŒã³ã·ããã§åŸãã»ãã¥ãªãã£è£œåã®ç¥èãéçšèšèšã®èãæ¹ãæŽ»ãããå®éã®éçšãèŠæ®ããã·ã¹ãã èšèšãä»çµã¿ã¥ãããã§ãããšã³ãžãã¢ãç®æããããšèããŠããŸãã ãD13ãæ»æè
èŠç¹ã§ç€Ÿå
é²åŸ¡åãé«ããã»ãã¥ãªãã£ãšã³ãžã㢠ãã¹ãçŽ¹ä» NTTãã³ã¢ããžãã¹ç€Ÿå
ã®çµç¹ããµãŒãã¹ã«å¯ŸããŠè
åšããŒã¹ã®ãããã¬ãŒã·ã§ã³ãã¹ãã宿œããã»ãã¥ãªãã£å¯Ÿçã®ç¶æ³ãRed Teamã®ç«å Žã§ç¶ç¶çã«ãã§ãã¯ããæ¥åãè¡ã£ãŠããããŒã ã«æå±ãããŠããã ããŸããã å
·äœçã«ã¯ãæ»æããŒã«ã®æ€èšŒãç°å¢æ§ç¯ãæ»æã·ããªãªã®æŽåãæ¹åææ¡ãªã©ã«åŸäºããŸããã äœéšããæ¥åå
容 ãããã¬ãŒã·ã§ã³ãã¹ãã®å®æœãšWriteupäœæ VulnHubããå
¥æããè匱ãªLinuxãã·ã³2å°ã«å¯ŸããŠãããã¬ãŒã·ã§ã³ãã¹ãã宿œããWriteupãäœæããŸããã ãããã¬ãŒã·ã§ã³ãã¹ãã¯ãæ
å ±åéãè匱æ§èª¿æ»ãåæäŸµå
¥ãæš©éææ Œã®é ã§è¡ããŸããã 1å°ç®ã¯ãDrupalãšããCMSïŒContent Management SystemïŒ 6 ã®RCEè匱æ§ãæªçšããŠåæäŸµå
¥ã宿œããSUIDã®èšå®äžåãæªçšããŠæš©éææ ŒãããŸããã 2å°ç®ã¯ã2å°ç®ã¯ãWordPressã®ãã©ã°ã€ã³ã®è匱æ§ãæªçšããŠãµãŒãäžã®ãã¡ã€ã«ãèªã¿åãLFIïŒLocal File InclusionïŒ ã«ãããã¹ã¯ãŒãæ
å ±ãååŸã§ããŸãããLFIã¯ãæ¬æ¥ã¢ã¯ã»ã¹ã§ããªããµãŒãå
ã®ãã¡ã€ã«ãèªã¿åããŠããŸãè匱æ§ã§ãã ãã®åŸãä¿åãããŠãããã¹ã¯ãŒãããªããŒã¹ãã«ãŒããã©ãŒã¹ããããšã§äŸµå
¥ã§ããŸããã ãŸãã宿œããæ»æææ³ã®ãã¡ãããŒã ã®ãã¬ããžéã«ãªãã£ããã®ã远å ãããŠããã ããŸããã æ¹åææ¡è¡šã®äœæ çºèŠããè匱æ§ã«ã€ããŠãä»®æ³ã®äŒç€Ÿã§è匱æ§ãæªçšãããéã«æ³å®ããããªã¹ã¯ãæ¹åæ¡ãªã©ããŸãšããæ¹åææ¡è¡šãäœæããŸããã ã¡ã³ã¿ãŒç€Ÿå¡ã®æ¹ããã¢ããã€ã¹ãããã ããªãããå®éã®æ¥åã«è¿ãæ¹åææ¡ãã§ããŸããã MITRE ATT&CKãããã³ã° MITRE ATT&CKïŒAdversarial Tactics, Techniques, and Common KnowledgeïŒ ã¯ããµã€ããŒæ»æè
ãçšããæŠè¡ãæ»æææ³ãæŽçãããã¬ããžããŒã¹ã§ãã æ¬æŒç¿ã§ã¯ã宿œããæ»æãMITRE ATT&CK Navigatoräžã§ãããã³ã°ããã©ã®ãããªæ»æææ³ãçšããããããå¯èŠåããŸããã æ¿ãèµ€ã¯2å°ã«å
±éããŠããæ»æææ³ãèãèµ€ã¯çæ¹ã®ãã·ã³ã§ã®ã¿äœ¿çšããæ»æææ³ã§ãã æ¯ãè¿ã ä»åã®ã€ã³ã¿ãŒã³ã·ãããéããŠãæ¬ãã¹ãã§ã¯æ»æãæåãããããã®æè¡åã ãã§ãªããéçšåŽã«ã©ã®ãããªæ¹åãä¿ãããèããææ¡åãéèŠã§ãããšåŠã³ãŸãããç¹ã«æ¹åææ¡è¡šã®äœæã§ã¯ãå Žåœããçãªå¯Ÿçãæç€ºããã ãã§ãªããè匱æ§ãçãŸãªãããã«æ¥åããã»ã¹ãã©ã®ããã«æ¹åããŠããã¹ãããŸã§èžã¿èŸŒãã§èããããšãã§ããŸããã ãŸããWriteupã®äœæã§ã¯ãçžæã«äŒãããããã¬ããŒãã®äœææ¹æ³ã«ã€ããŠãåŠã¶ããšãã§ããŸããã ãããã« æ¬èšäºã§ã¯ã2é±éã®ããã°ã©ã ã«åãçµãã§ããã ããã€ã³ã¿ãŒã³ã·ããçã®çããŸã«ãããããã®ãã¹ãã§ã®æ¥åãšãããã§åŸãåŠã³ãç¶Žã£ãŠããã ããŸããããå€å¿ã®ãªãå¿«ããååããã ããããããšãããããŸããã æ¬èšäºãèªãã§å°ãã§ãèå³ãæããã29å以éã®æ¹ã¯ããã²æ¥å¹ŽåºŠã®ã€ã³ã¿ãŒã³ã·ããããã°ã©ã ãžãå¿åãã ãããçããŸãšãäŒãã§ããããšã楜ãã¿ã«ããŠããŸãïŒ Endpoint Detection and ResponseãPCããµãŒããªã©ã®ç«¯æ«äžã®åäœãç¶ç¶çã«èšé²ã»ç£èŠããäžå¯©ãªæåã®æ€ç¥ãšããã®åŸã®èª¿æ»ã»å¯Ÿå¿ãæ¯æŽããä»çµã¿ã§ãã ↩ Security Information and Event Managementãåçš®æ©åšããœãããŠã§ã¢ãåºåãããã°ãäžå
çã«éçŽããçžé¢åæã«ãã£ãŠè
åšã®å
åãæ€ç¥ããä»çµã¿ã§ãã ↩ Indicator of CompromiseïŒäŸµå®³ææšïŒããã«ãŠã§ã¢ã®ããã·ã¥å€ãéä¿¡å
ã®IPã¢ãã¬ã¹ã»ãã¡ã€ã³ãªã©ã䟵害ãçºçããããšã瀺ãåå¥ã®çè·¡ãæããŸãã ↩ Indicator of AttackïŒæ»æææšïŒãåã
ã®çè·¡ã§ã¯ãªããæ»æè
ãç®çãéæãããŸã§ã«ãšãäžé£ã®æ¯ãèãã«çç®ããææšã§ãé²è¡äžã®æ»æã®å
åãæããããšãçããšããŸãã ↩ Joint Publication 2-0ãJoint Intelligenceããã¢ã¡ãªã«çµ±ååè¬æ¬éšè°é·ã®ææ®ã®ããšã§æŽåãããçµ±åãã¯ããªã³ã®ãã¡ãæ
å ±ïŒã€ã³ããªãžã§ã³ã¹ïŒåéã®åºå¹¹ææžã«ããããŸããçµ±åäœæŠã«ãããæ
å ±ã®åœ¹å²ãåºæ¬ååãæ
å ±ãçã¿åºããããŸã§ã®äžé£ã®ããã»ã¹ããŸãšããããŠããŸããææžã¯ çµ±ååè¬æ¬éšã®ãµã€ã ã§å
¬éãããŠããŸãã ↩ Contents Management SystemãWebãµã€ãã®ããã¹ããç»åãªã©ã®ã³ã³ãã³ãããHTMLãçŽæ¥ç·šéããããšãªãäœæã»ç®¡çã»å
¬éã§ããããã«ããã·ã¹ãã ã§ããæ¬èšäºã«ç»å ŽããDrupalãWordPressãããã«ããããŸãã ↩
åŒç€Ÿã§æ¯æéå¬ãã PHP ãšã³ãžãã¢ã®éã§ã奜è©ãããã ããŠãã PHP TechCafeã 2022幎11æã®ã€ãã³ãã§ã¯ã PHP ãã¬ãŒã ã¯ãŒã¯ ãã«ã€ããŠèªãåããŸããã åŒç€Ÿã¡ã³ããŒãããã¯ã¢ãããã PHP ã®ä»£è¡šç㪠ãã¬ãŒã ã¯ãŒã¯ ïŒçš®ã«ã€ããŠã以äžã®ShowNoteãããŒã¹ã«ãåå è
ã®çæ§ã®ãæèŠã䌺ããªããåŠãã§ãããŸãããä»åã¯ãã®å
容ã«ã€ããŠã¬ããŒãããŸãã rakus.connpass.com hackmd.io ãã¬ãŒã ã¯ãŒã¯ãšã¯ 代衚çãªPHPãã¬ãŒã ã¯ãŒã¯ Laravel Symfony CakePHP Slim æ©èœæ¯èŒ ã«ãŒãã£ã³ã° Laravel Symfony CakePHP Slim ãŸãšã ã»ãã·ã§ã³ç®¡ç Laravel Symfony CakePHP Slim ãŸãšã ãªã¯ãšã¹ã管ç Laravel Symfony CakePHP Slim ãŸãšã ãšã©ãŒãã³ããªã³ã° Laravel Symfony CakePHP Slim DBãµããŒã Laravel Symfony CakePHP Slim æåŸã« ãã¬ãŒã ã¯ãŒã¯ ãšã¯ ãŸãåãã«ã ãã¬ãŒã ã¯ãŒã¯ ãšã¯ã ã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠããå©çšãããæ©èœããããããåããæ çµã¿ ã®ããšã§ãã ããå°ãå
·äœçã«èª¬æãããšã以äžã®éãã§ãã Webã¢ããªã±ãŒã·ã§ã³ ãã¬ãŒã ã¯ãŒã¯ åç㪠ãŠã§ããµã€ããWebã¢ããªã±ãŒã·ã§ã³ã WebãµãŒãã¹ ã®éçºããµããŒãããããã«èšèšãããã¢ããªã±ãŒã·ã§ã³ ãã¬ãŒã ã¯ãŒã¯ Webéçºã§çšããããå
±éããäœæ¥ã«äŒŽãåŽåã軜æžãã ããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ ãã³ãã¬ãŒããšã³ãžã³ ã»ãã·ã§ã³ç®¡ç äœæ
ãã¬ãŒã ã¯ãŒã¯ ãå¿
èŠãªã®ãïŒ éçºé床åäž Webã¢ããªã±ãŒã·ã§ã³éçºã§ããå©çšããåŠçïŒã»ãã·ã§ã³ç®¡çãDBã¢ã¯ã»ã¹ã Cookie ãªã©ïŒãæ¢ã«çšæãããŠãããããããããåå©çšããã ãã§éçºãé²ãããã ã»ãã¥ãªãã£å¯Ÿå¿ èåŒ±æ§ ãèŠã€ãã£ãå Žåã«ä¿®æ£çããªãªãŒã¹ããã éçºã«ãŒã«ã®é å® ãã¬ãŒã ã¯ãŒã¯ ã®ã«ãŒã«ã«åŸã£ãŠäœæããããšã匷ããããåé¢ãéçºããŒã å
šäœã§å
±éã®ã«ãŒã«ã§éçºã§ãããããã«ãŒã«ã«éžè±ãããããªã³ãŒããçãŸãã«ãã ããã§ã¯ããã»ãã¥ãªãã£ã«é¢ããå®è£
ãèªåã§çµãã¡ãªããã¯å°ãªããããå®çžŸã®ãã ãã¬ãŒã ã¯ãŒã¯ ãå©çšããããšãäžçªã®æ£æ»æ³ã§ã¯ãªããããšãã£ãæèŠãæãã£ãŠããŸããã 代衚ç㪠PHP ãã¬ãŒã ã¯ãŒã¯ 次ã«ãäºåã«åŒç€Ÿã¡ã³ããŒãæç²ããã代衚ç㪠PHP ãã¬ãŒã ã¯ãŒã¯ ããããã®èšèšææ³ã«ã€ããŠèªãåããŸããã ïŒæœåºå¯Ÿè±¡ã䞊ã³é ã«æå³ã¯ããããŸããïŒ Laravel laravel.com ããã°ã¬ ãã·ã ãã¬ãŒã ã¯ãŒã¯ ã©ã®ãããªèŠæš¡ã段éã® Web ã¢ããªã±ãŒã·ã§ã³ã«ã察å¿ã§ãã ãã¬ãŒã ã¯ãŒã¯ ã®æŠå¿µ äŸåæ§æ³šå
¥ã åäœãã¹ã ããã¥ãŒããªã¢ã«ã¿ã€ã ã€ãã³ã ãªã©ã®ããã®å
ç¢ãªããŒã«ãæäŸ ã¹ã±ãŒã©ãã«ãª ãã¬ãŒã ã¯ãŒã¯ ã·ã¹ãã èŠæš¡ãå©çšè² è·ãªã©ã®å¢å€§ã«å¯Ÿå¿ã§ãã Laravel ã¢ããªã±ãŒã·ã§ã³ã¯ã1 ãæãããæ°åã®ãªã¯ ãšã¹ ããåŠçããããã«ç°¡åã«ã¹ã±ãŒãªã³ã°ãããŠãã ã³ãã¥ãã㣠ãã¬ãŒã ã¯ãŒã¯ ã³ãã¥ããã£ã®æŽ»åãæŽ»çºã§ãããæèŠäº€æãé »ç¹ã«è¡ãããŠãã åå è
ããã¯ã確ãã«ã€ãŒ ãžãŒ ãªã€ã¡ãŒãžããããäœã§ãã§ããŠç°¡åãããšãã£ãæèŠãããäŸåæ§æ³šå
¥ã åäœãã¹ã ã®ããã«ç¬èªã«æ¡å
ãããæ©èœãæäŸãããŠãããè²ã
åºæ¥ãŠäŸ¿å©ããšãã£ãæèŠãæãããŸãããLaravleã«ã¯ãµãŒ ãã¹ã³ ã³ãããšåŒã°ããæ©èœãåãã£ãŠãããããäŸåæ§æ³šå
¥ãç°¡åã«è¡ãããšãã§ãããã ãŠããããã¹ã ãèæ
®ããŠæ§ç¯ãããŠããããšããã®çç±ãšãªããŸãã Symfony symfony.com äœæããã ã³ã³ããŒãã³ã ãçµã¿åãããŠã ãã«ã¹ã¿ãã¯ãã¬ãŒã ã¯ãŒã¯ ãäœæããããšããã€ã¯ããµãŒãã¹ãäœæããããšãå¯èœ éçºè
ã®ç®çã«å¿ããŠèŠæš¡ãå€ããããšãã§ããããšãç¹åŸŽ ã³ã³ããŒãã³ã ãæšæºåãããŠãããã¢ããªã±ãŒã·ã§ã³ãæçããŠã䜿çšããã ã³ã³ããŒãã³ã ãèªç±ã«å°å
¥ããããšãã§ãã Java ã® Spring Framework ã Ruby ã® Ruby on Rails ã®åœ±é¿ãåããŠãã Symfony ã³ã³ããŒãã³ã 㯠Drupal , Prestashop , Laravel ãã§å©çšãããŠãã ããã§ã¯ã Symfony èªäœãLaravelã®äžã§äœ¿ãããŠãããšããç¹ã«ã€ããŠæŽ»çºã«ã³ã¡ã³ããé£ã³äº€ããŸããã ã Symfony ã®ãªãªãŒã¹ãé
ããããšã«ãã£ãŠLaravelã«ã圱é¿ãåºãã±ãŒã¹ããã£ãããšãã声ãããLaravelã®ãªãªãŒã¹é »åºŠã Symfony ã®ããŒãžã§ã³ã¢ããã«äŸåãããããªåœ¢ã«ãªã£ããšããããšãéå»ã«èšäºã§èŠãããšãã声ã§ãã çŸæç¹ã®ææ°ããŒãžã§ã³ã§ããLaravel9ã«ã€ããŠãã Symfony ã® ã³ã³ããŒãã³ã ã«äŸåããŠããããšãèŠå ãšãªãLTSïŒâ»LTSã¯Long Term Supportã®ç¥ã§é·æãµããŒããæå³ïŒããªããªã£ãããšãå®éã«æ§ã
ãªåœ±é¿ãåãŒããŠããããšããããã®ãããªå£°ãå€ãæãã£ãŠããããã§ãã CakePHP cakephp.org ãã±ãŒããçŒããããç°¡åã«éçºã§ããããšããã³ã³ã»ããã§èšèšãããŠãããåå¿è
åãã§ãããšããã Ruby on Rails ã®æŠå¿µã®å€ããåãå
¥ããããŠãã æ¯èŒçå°èŠæš¡ãªWeb ã¢ããªéçº åãã§ãã ã MVC ã¢ãã«ããæ¡çšãããŠããã圹å²åæ
ããããŠé«éã«éçºãé²ãããã ããã§ã¯ãã MVC ã«æºæ ããŠããã åœå ãããã峿 Œã ãšããå°è±¡ãããããšããæèŠãæãããŸããã Slim www.slimframework.com www.slimframework.com ã·ã³ãã«ãã€åŒ·å㪠Web ã¢ããªã±ãŒã·ã§ã³ãš API ããã°ããäœæããã®ã«åœ¹ç«ã€ PHP ãã€ã¯ã ãã¬ãŒã ã¯ãŒã¯ å¿
èŠãªããšã ããè¡ãæå°éã®ããŒã« ã»ããã®ã¿ãæäŸ æå°éã®æ©èœã®ã¿ãæã€ãããã«ãŒã«ãã·ã³ãã«ã§ãéçºã®èªç±åºŠãé«ããåŠç¿ã³ã¹ããäœã ããã§ã¯ããã€ã¯ã ãã¬ãŒã ã¯ãŒã¯ ã謡ã£ãŠãããšããç¹ã«ã€ããŠããã³ãã¬ãŒããšã³ãžã³ãæšæºã§æäŸãããŠãããã现ã㪠Bot äœæãå°ããªæ©èœéçºãè¡ãéã«å©çšããããããšãã£ãæèŠãããèªç±ã«æ¡åŒµã§ãããšããç¹ããããããããšãã£ãæèŠãæãããŸããã æ©èœæ¯èŒ ç¶ããŠãå ãã¬ãŒã ã¯ãŒã¯ ã®åºæ¬çãªå©ç𿹿³ã«æ³šç®ããããããã®ç¹åŸŽã«ã€ããŠæ¯èŒããªãããã£ã¹ã«ãã·ã§ã³ãè¡ããŸããã ã«ãŒãã£ã³ã° Laravel laravel.com ã«ãŒããã¡ã€ã« ããã©ã«ãã§ã¯äžèšïŒã€ãã¡ã€ã«ã«ã«ãŒãã£ã³ã°ãå®çŸ©ãã routes/web. php routes/ api . php å®çŸ©æ¹æ³ UserControllerã«indexã¡ãœãããå®çŸ©ããŠããå Žåãäžèšã®ããã«å®çŸ©ãããš /user ã®ãã¹ã«å¯ŸããŠãUserControllerã®indexã¡ãœããã察å¿ããã <?php use App\Http\Controllers\UserController; Route :: get ( '/user' , [ UserController :: class , 'index' ]) ; å©çšå¯èœãª ã«ãŒã¿ãŒ ã¡ãœãã <?php Route :: get ( $ uri , $ callback ) ; Route :: post ( $ uri , $ callback ) ; Route :: put ( $ uri , $ callback ) ; Route :: patch ( $ uri , $ callback ) ; Route :: delete ( $ uri , $ callback ) ; Route :: options ( $ uri , $ callback ) ; ãã©ã¡ãŒã¿ <?php Route :: get ( '/posts/{post}/comments/{comment}' , [ CommentController :: class , 'show' ]) ; ããã§ã¯ã Route::get ã Route::post ã®ããã«ãè€æ°ã®HTTPåè©ã«å¯Ÿå¿ããã«ãŒããç»é²ã§ããããšãç¹åŸŽçã§ããããšããæèŠãæãããŸããã Symfony routes.yaml ã«èšèŒãããã¿ãŒã³ /lucky/number ã«ã¢ã¯ã»ã¹ããããšã§ LuckyController ã® number ã¡ãœããã«ã«ãŒãã£ã³ã°ããã app_lucky_number : path : /lucky/number controller : App\Controller\LuckyController::number ã¢ãããŒã·ã§ã³ ãŸã㯠ã¢ããªãã¥ãŒã ãå©çšãããã¿ãŒã³(ãã¡ããæšå¥š) ã³ã³ãããŒã©ã以äžã®éã倿Žããããšã§ routes.yaml ãäœæããªããšãã«ãŒãã£ã³ã°ãè¡ããã <?php // src/Controller/LuckyController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class LuckyController { #[Route('/lucky/number')] public function number () : Response { $ number = random_int ( 0 , 100 ) ; return new Response ( '<html><body>Lucky number: ' .$ number . '</body></html>' ) ; } } ããã§ã¯ãã«ãŒãã£ã³ã°ã®æ¹æ³ãè€æ°ããããšããç¹ã«æ³šç®ãéãŸããŸããã ãããã©ã«ã㯠routes.yaml ã ãæšå¥šãã¿ãŒã³ã¯ ã¢ããªãã¥ãŒã ã䜿ããã¿ãŒã³ã®ããã ããšãã£ã声ããããµã³ãã«ã³ãŒãã®ãã㪠ã¢ããªãã¥ãŒã ã䜿ããã¿ãŒã³ãåãããããããšãã£ã声ãæãããŸããã CakePHP book.cakephp.org routes.php ã«èšèŒ ãäŸïŒ / ã«ã¢ã¯ã»ã¹ãããš ArticlesController ã® index() ã¡ãœãããå®è¡ãã <?php use Cake\Routing\Router; // ã¹ã³ãŒãä»ãã«ãŒããã«ããŒã䜿çšã Router :: scope ( '/' , function ( $ routes ) { $ routes -> connect ( '/' , [ 'controller' => 'Articles' , 'action' => 'index' ]) ; }) ; // static ã¡ãœããã䜿çšã Router :: connect ( '/' , [ 'controller' => 'Articles' , 'action' => 'index' ]) ; ã /articles/15 ã«ã¢ã¯ã»ã¹ãããš ArticlesController ã® view(15) ã¡ãœãããå®è¡ãã <?php $ routes -> connect ( '/articles/:id' , [ 'controller' => 'Articles' , 'action' => 'view' ] ) -> setPatterns ([ 'id' => '\d+' ]) -> setPass ([ 'id' ]) ; ãHTTPã¡ãœããã«ãã£ãŠåããããšãã¯ä»¥äžã®ãããªèšè¿°ãè¡ã <?php // GET ãªã¯ãšã¹ããžã®ã¿å¿çããã«ãŒãã®äœæ $ routes -> get ( '/cooks/:id' , [ 'controller' => 'Users' , 'action' => 'view' ] , 'users:view' ) ; // PUT ãªã¯ãšã¹ããžã®ã¿å¿çããã«ãŒãã®äœæ $ routes -> put ( '/cooks/:id' , [ 'controller' => 'Users' , 'action' => 'update' ] , 'users:update' ) ; ããã§ã¯ãå¿
ãããã«ãŒãã£ã³ã°ã¯å¿
èŠã§ãªããURLããåæã«ã¯ã©ã¹ãæšæž¬ããŠãããããšããç¹ã«æ³šç®ãéãŸããŸããã ãããããç¥ããªããšè¿·ããããªã®ã§æèšããŠæ¬²ããããšãã£ã声ãããããã¯ãæç€ºçã«å®çŸ©ããã®ããã¹ãã ãããšããèãã«èœã¡çããŸããã Slim www.slimframework.com get() ïŒ post() ã¡ãœãããäœ¿çš <?php $ app -> get ( '/books/{id}' , function ( $ request , $ response , array $ args ) { // Show book identified by $args['id'] }) ; <?php $ app -> post ( '/books' , function ( $ request , $ response , array $ args ) { // Create new book }) ; ããã§ã¯ã«ãŒã¿ã¡ãœããã get() ïŒ post() ã§ããããšãããLaravelãšäŒŒãŠããããšããæèŠãæãããŸããã ãŸãšã ã«ãŒãã£ã³ã°ã®å©ç𿹿³ã«é¢ããŠå
šäœãèŠæž¡ããåŸã«ã¯ã以äžã®ãããªæèŠãæãããŸããã Symfony ïŒ ã¢ããªãã¥ãŒã ã«ããã«ãŒãã£ã³ã°ãç¹åŸŽç CakePHP ïŒã«ãŒãã£ã³ã°ãèšèŒãããšã ãã¬ãŒã ã¯ãŒã¯ ã§åæã«åŒã³åºãã¯ã©ã¹ãæšæž¬ããŠãããç¹ãç¹åŸŽç LaravelïŒ Routes ãèŠã«è¡ãå¿
èŠãããããšãé¢åã§ããã C# ã®ã«ãŒãã£ã³ã°å®çŸ©ã«äŒŒãŠãã å
šè¬ïŒã©ãã§äœããã£ãŠããã®ããåããã«ãŒãã£ã³ã°ã®æ¹æ³ã§ããããšãæãŸãã composerã®ã€ã³ã¹ããŒã«ïŒã¢ããããŒãã®ããã«ã1ã€ã®æäœãè€æ°ã®åœ¹å²ãæã€ãããªä»çµã¿ã¯åããã¥ãã ã»ãã·ã§ã³ç®¡ç ç¶ããŠãã»ãã·ã§ã³ç®¡çã®æ¹æ³ã«ã€ããŠèŠãŠãããŸãã Laravel laravel.com èšå®ãã¡ã€ã« config/session. php ã»ãã·ã§ã³ã®æäœæ¹æ³ ã°ããŒãã«ã»ãã·ã§ã³ãã«ã㌠㚠Requestã€ã³ã¹ã¿ã³ã¹çµç± ã®2ã€ã®æ¹æ³ããã ãã ãã»ã°ããŒãã«ã»ãã·ã§ã³ãã«ã㌠<?php $ value = session ( 'key' ) ; ãã ãã»Request ã€ã³ã¹ã¿ã³ã¹ çµç± <?php public function show ( Request $ request , $ id ) { $ value = $ request -> session () -> get ( 'key' ) ; // } Symfony ã»ãã·ã§ã³ã®æäœæ¹æ³ RequestStack ãš RSessionInterface ããååŸãã2ã€ã®æ¹æ³ããã RequestStack ããååŸãããã¿ãŒã³ ã»ãã·ã§ã³ã®èšå®ã¯ config/packages/framework.yaml ã«èšèŒ HttpFoundation component ã远å ããããšã§å©çšå¯èœ ãã®ä»ã®è©³çް åºæ¬çãªäœ¿ãæ¹ <?php use Symfony\Component\HttpFoundation\RequestStack; class SomeService { private $ requestStack ; public function __construct ( RequestStack $ requestStack ) { $ this -> requestStack = $ requestStack ; // Accessing the session in the constructor is *NOT* recommended, since // it might not be accessible yet or lead to unwanted side-effects // $this->session = $requestStack->getSession(); } public function someMethod () { $ session = $ this -> requestStack -> getSession () ; // stores an attribute in the session for later reuse $ session -> set ( 'attribute-name' , 'attribute-value' ) ; // gets an attribute by name $ foo = $ session -> get ( 'foo' ) ; // the second argument is the value returned when the attribute doesn't exist $ filters = $ session -> get ( 'filters' , []) ; // ... } } SessionInterface ããååŸãããã¿ãŒã³ SessionInterface ã§ã¿ã€ããã³ãããŠã³ã³ãããŒã©åŒæ°ã«æž¡ãã ã åºæ¬çãªäœ¿ãæ¹ <?php use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Session\SessionInterface; // ... public function index ( SessionInterface $ session ) : Response { // stores an attribute for reuse during a later user request $ session -> set ( 'foo' , 'bar' ) ; // gets the attribute set by another controller in another request $ foobar = $ session -> get ( 'foobar' ) ; // uses a default value if the attribute doesn't exist $ filters = $ session -> get ( 'filters' , []) ; // ... } CakePHP book.cakephp.org PHP ã®ãã€ãã£ã session æ¡åŒµäžã«ããŠãŒãã£ãªãã£æ©èœã®ã¹ã€ãŒããšã©ãããŒãæäŸ èšå® ãã»ããŒã¿ããŒã¹ã»ãã·ã§ã³ ããã»ã»ãã·ã§ã³ãããŒã¿ããŒã¹ã«ä¿æããããšãæå® ããã»ã»ãã·ã§ã³ä¿æããããã®ã«ã¹ã¿ã ã¢ãã«ãå®çŸ©ããããšãã§ãã(model => 'CustomSessions') <?php 'Session' => [ 'defaults' => 'database' , 'handler' => [ 'engine' => 'DatabaseSession' , 'model' => 'CustomSessions' ] ] ããã»ãã£ãã·ã¥ã»ãã·ã§ã³ ãããã»CacheSession ã¯ã©ã¹ãã»ãã·ã§ã³ä¿åå
ãšã㊠æå® <?php Configure :: write ( 'Session' , [ 'defaults' => 'cache' , 'handler' => [ 'config' => 'session' ] ]) ; ã»ãã·ã§ã³ã®å©çš ãªã¯ ãšã¹ ããªããžã§ã¯ããåŒã³åºããå Žæãªãã©ãã§ãåŒã³åºãã Controllers Views Helpers Cells Components <?php $ name = $ this -> getRequest () -> getSession () -> read ( 'User.name' ) ; // è€æ°åã»ãã·ã§ã³ã«ã¢ã¯ã»ã¹ããå Žåã // ããŒã«ã«å€æ°ã«ããããªãã§ãããã $ session = $ this -> getRequest () -> getSession () ; $ name = $ session -> read ( 'User.name' ) ; å©çšããã¡ãœãã Session::read($key) Session::write($key) Session::check($key) Session::destroy() Slim ãªã ãŸãšã ã»ãã·ã§ã³ã«ã€ããŠã¯ãããããã® ãã¬ãŒã ã¯ãŒã¯ ã§å©ç𿹿³ãå€å²ã«æž¡ããŸããã ããã§ã¯ã CakePHP ã«ã€ããŠããã»ãã·ã§ã³ã®åç
§ã« Get ã§ã¯ãªã Read ã«ãªã£ãŠããã®ã¯äœæ
ãªã®ãïŒããšãã£ãã³ã¡ã³ãããSlimã«ã¯ããããå®è£
ãããŠããªãç¹ã«ã€ããŠãããããSlimã®è¯ããšããã§ãããå¿
èŠã§ããã°composerã§å°å
¥ããã°ããããšãã£ãã³ã¡ã³ããæãã£ãŠããŸããã ãªã¯ ãšã¹ ã管ç Laravel laravel.com <?php $ name = $ request -> input ( 'name' ) ; $ name = $ request -> query ( 'name' ) ; Laravelã§ã¯ Request ã¯ã©ã¹ã® ã€ã³ã¹ã¿ã³ã¹ ããååŸããŸãã Symfony symfony.com <?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; public function index ( Request $ request ) : Response { $ request -> isXmlHttpRequest () ; // is it an Ajax request? $ request -> getPreferredLanguage ([ 'en' , 'fr' ]) ; // retrieves GET and POST variables respectively $ request -> query -> get ( 'page' ) ; $ request -> request -> get ( 'page' ) ; // retrieves SERVER variables $ request -> server -> get ( 'HTTP_HOST' ) ; // retrieves an instance of UploadedFile identified by foo $ request -> files -> get ( 'foo' ) ; // retrieves a COOKIE value $ request -> cookies -> get ( 'PHPSESSID' ) ; // retrieves an HTTP request header, with normalized, lowercase keys $ request -> headers -> get ( 'host' ) ; $ request -> headers -> get ( 'content-type' ) ; } Symfony ãLaravelãšåãæ§ã« Request ã¯ã©ã¹ã® ã€ã³ã¹ã¿ã³ã¹ ããååŸããŸãã CakePHP <?php $ controllerName = $ this -> request -> getParam ( 'controller' ) ; // URL 㯠/posts/index?page=1&sort=title ã®å Žåã« page ãååŸãããšã $ page = $ this -> request -> getQuery ( 'page' ) ; //ãPOSTããŒã¿ã«ã¢ã¯ã»ã¹ãããšã $ title = $ this -> request -> getData ( 'MyModel.title' ) ; CakePHP ãLaravelã Symfony ãšäŒŒãã€ã¡ãŒãžã§ãã Slim www.slimframework.com <?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php' ; $ app = AppFactory :: create () ; $ app -> get ( '/hello' , function ( Request $ request , Response $ response ) { $ response -> getBody () -> write ( 'Hello World' ) ; return $ response ; }) ; $ app -> run () ; ã»ãã·ã§ã³ç®¡çã¯å®è£
ãããŠããŸããã§ãããããªã¯ ãšã¹ ã管çã¯Slimã«ãã¡ãããšå®è£
ãããŠããŸãã ãŸãšã ããã§ã¯ããããããRequestã¯ã©ã¹ã® ã€ã³ã¹ã¿ã³ã¹ ããååŸãããšããç¹ã«ãããŠãã ãããã©ãã䌌ããããªåœ¢ã§ããããšãã£ãæèŠãããããã ãã¬ãŒã ã¯ãŒã¯ ã®å€§æ¬ã¿ãããªæããããããšãã£ãæèŠãæãããŸããã Webã¢ããªã±ãŒã·ã§ã³ã®åºæ¬ãšãªãéšåã§ããããšããããããããã® ãã¬ãŒã ã¯ãŒã¯ ã«å€§ããªå·®ã¯ãªãããã§ããã ãšã©ãŒãã³ããªã³ã° Laravel readouble.com App\Exceptions\Handler ã¯ã©ã¹ã«ãã£ãŠãã¢ããªã±ãŒã·ã§ã³ãæãããã¹ãŠã®äŸå€ããã°ã«èšé²ããããŠãŒã¶ãŒãžã¬ã³ããŒããã ãšã©ãŒãã³ããªã³ã°ã®ã«ã¹ã¿ãã€ãº Handler ã¯ã©ã¹ã¯ãã«ã¹ã¿ã äŸå€ã¬ããŒããš ã¬ã³ããªã³ã° ã³ãŒã«ããã¯ãç»é²ã§ãã register ã¡ãœãããæã£ãŠããã reportable ã¡ãœããã§ãäŸå€ãããŸããŸãªæ¹æ³ã§å ±åã§ãããïŒãšã©ãŒç£èŠããŒã«ã«ç»é²ãããªã©ãããã©ã«ãã§ã¯ãã°ã«èšé²ããããïŒ renderable ã¡ãœããã§ãç¹å®ã®äŸå€ã«å¯ŸããŠãåå¥ã« ã¬ã³ããªã³ã° æ¹æ³ãæå®ããããšãã§ããã(ããã©ã«ãã§ã¯äŸå€ã¯HTTPã¬ã¹ãã³ã¹ã«å€æããã) HTTPãšã©ãŒãè¿ãããå Žåã resources/views/errors äžã® HTTPã¹ããŒã¿ã¹ã³ãŒã åã®bladeãã¡ã€ã«ã ã¬ã³ããªã³ã° ãããïŒ 404.blade.php ãªã©ïŒ <?php use App\Exceptions\InvalidOrderException; /** * ã¢ããªã±ãŒã·ã§ã³ã®äŸå€åŠçã³ãŒã«ããã¯ãç»é² * * @return void */ public function register () { $ this -> reportable ( function ( InvalidOrderException $ e ) { // äŸå€ãå ±å }) ; $ this -> renderable ( function ( InvalidOrderException $ e , $ request ) { return response () -> view ( 'errors.invalid-order' , [] , 500 ) ; }) ; } Laravelã®å ŽåãäŸå€ãæããéã«ããã©ã«ãã®ãã®ã䜿ããå¥ã®ã«ã¹ã¿ãã€ãºããããã®ã䜿ããæ¯ãåããããšãã§ããŸãã äŸãã°ã404ãšã©ãŒã®å Žå㯠404.blade ã®ããã«å®çŸ©ããŠããã°ãèªåã§èªã¿èŸŒãã§ç»é¢ã«è¡šç€ºããŠãããŸãã Symfony symfony.com github.com ãšã©ãŒã 404 Not Found ãšã©ãŒã§ããããšãã³ãŒãã§äœããã®äŸå€ãã¹ããŒããããšã«ãã£ãŠããªã¬ãŒãããèŽåœçãªãšã©ãŒã§ããããšããã¹ãŠã®ãšã©ãŒãäŸå€ãšããŠæ±ãã çµã¿èŸŒã¿ã® Twig ãšã©ãŒã¬ã³ãã©ãŒã䜿çšããŠãããã©ã«ãã®ãšã©ãŒãã³ãã¬ãŒãããªãŒããŒã©ã€ãå¯èœã composer require symfony/twig-pack ãããã®ãã³ãã¬ãŒãããªãŒããŒã©ã€ãããã«ã¯ãæšæºã® Symfony ã¡ãœããã䜿çšã ãŠããã³ãã«å
ã«ãããã³ãã¬ãŒãããªãŒããŒã©ã€ããããããã templates/bundles/TwigBundle/Exception/ ãã£ã¬ã¯ã ãªã«é
眮ãã Copy templates/ ââ bundles/ ââ TwigBundle/ ââ Exception/ ââ error404.html.twig ââ error403.html.twig ââ error.html.twig # All other HTML errors (including 500) ããã§ã¯ Twig ã«é¢ããŠãããã©ã«ãã®ãšã©ãŒãã³ãã¬ãŒãããªãŒããŒã©ã€ãããéã®å©ç𿹿³ãåããæããšãã£ãã³ã¡ã³ããæãããŸããã CakePHP book.cakephp.org <?php * ErrorController ã«ãŠãšã©ãŒããŒãžãæç» namespace App\Controller\Admin; use App\Controller\AppController; use Cake\Event\EventInterface; class ErrorController extends AppController { /** * Initialization hook method. * * @return void */ public function initialize () : void { $ this -> loadComponent ( 'RequestHandler' ) ; } /** * beforeRender callback. * * @param \Cake\Event\EventInterface $event Event. * @return void */ public function beforeRender ( EventInterface $ event ) { $ this -> viewBuilder () -> setTemplatePath ( 'Error' ) ; } } ããã§ã¯ããCakeã®å Žåã¯ããã©ã«ãã®ãšã©ãŒãã³ãã¬ãŒãããªãŒããŒã©ã€ããããšãããã Controller ãããããäœãã€ã¡ãŒãžã ããšã®ã³ã¡ã³ãããããŸããã Slim www.slimframework.com slimãçšæãããšã©ãŒç»é¢ãåºããã©ãããéžæã§ããããã«ã¹ã¿ã ãšã©ãŒç»é¢ã衚瀺ãããªã©æè»ãªèšå®ãå¯èœ <?php use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php' ; $ app = AppFactory :: create () ; /** * The routing middleware should be added earlier than the ErrorMiddleware * Otherwise exceptions thrown from it will not be handled by the middleware */ $ app -> addRoutingMiddleware () ; /** * Add Error Middleware * * @param bool $displayErrorDetails -> Should be set to false in production * @param bool $logErrors -> Parameter is passed to the default ErrorHandler * @param bool $logErrorDetails -> Display error details in error log * @param LoggerInterface|null $logger -> Optional PSR-3 Logger * * Note: This middleware should be added last. It will not handle any exceptions/errors * for middleware added after it. */ $ errorMiddleware = $ app -> addErrorMiddleware ( true , true , true ) ; // ... $ app -> run () ; ããã§ã¯ãSlimã«ã¯ãã³ãã¬ãŒããšã³ãžã³ããªãããšããããçšæãããšã©ãŒç»é¢ãåºããã«ã¹ã¿ã ãšã©ãŒãåºãããã§ããããªã¯ ãšã¹ ãæã« Add Error Middleware ã®èšå®ãè¡ãããšã§ãšã©ãŒãã³ããªã³ã°ãæå¹ïŒç¡å¹åãå¶åŸ¡ã§ãããšãã説æããããŸããã DBãµããŒã Laravel readouble.com ãµããŒããããŠããDB MariaDB MySQL PostgreSQL SQLite SQL Server DBãžã®ã¢ã¯ã»ã¹æ¹æ³ ãã»DB ãã¡ãµãŒã $users = DB::select('select * from users where active = ?', [1]); ãã»ã¯ãšãªãã«ã $users = DB::table('users')->where('active', $isActive)->get(); ãã»Eloquent $users = User::where('active', $isActive)->get(); ããã§ã¯ããLaravelã§ã¯Eloquentãå©çšããã®è¯ãã ããããšããæèŠãæãããŸããã ãæ§ã
ãªããã°ã§ã玹ä»ãããŠããããšãç¹ããã SQL ãç¥ã£ãŠãããšçŽæçã§åããæãããšãã£ãã³ã¡ã³ããæãã£ãŠããŸããã Symfony symfony.com Doctrine(ORM)ãäœ¿çš composer require doctrine maker ã€ã³ã¹ããŒã«ãå®äºãããš .env ãã¡ã€ã«ã«ããŒã¿ããŒã¹ãžã®æ¥ç¶èšå®ã«é¢ããé
ç®ãæžãè¶³ããã DATABASE_URL ã®ç®æãæ¥ç¶ããããŒã¿ããŒã¹ã«åãããŠæžãæãã DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name php bin/console doctrine:database:create ãšã³ãã£ãã£ã¯ã©ã¹ãäœæãã symfony console make:entity hoge CakePHP SELECTæã®å®è¡ <?php use Cake\Datasource\ConnectionManager; $ connection = ConnectionManager :: get ( 'default' ) ; $ results = $ connection -> execute ( 'SELECT * FROM articles' ) -> fetchAll ( 'assoc' ) ; INSERTæã®å®è¡ <?php use Cake\Datasource\ConnectionManager; use DateTime; $ connection = ConnectionManager :: get ( 'default' ) ; $ connection -> insert ( 'articles' , [ 'title' => 'A New Article' , 'created' => new DateTime ( 'now' ) ] , UPDATEæã®å®è¡ <?php use Cake\Datasource\ConnectionManager; $ connection = ConnectionManager :: get ( 'default' ) ; $ connection -> update ( 'articles' , [ 'title' => 'New title' ] , [ 'id' => 10 ]) ; DELETEæã®å®è¡ <?php use Cake\Datasource\ConnectionManager; $ connection = ConnectionManager :: get ( 'default' ) ; $ connection -> delete ( 'articles' , [ 'id' => 10 ]) ; Slim ãªã æåŸã« ä»å㯠PHP ã®äž»èŠãª ãã¬ãŒã ã¯ãŒã¯ ã«ã€ããŠãæ§ã
ãªèгç¹ããèŠæ¯ã¹ãŠã¿ãŸããããããã§ããã§ããããïŒ ã©ã® ãã¬ãŒã ã¯ãŒã¯ ã«ãæ§ã
ãªç¹åŸŽããããŸãããããŒã ç¹æ§ãäœæããã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠãæ¡çšãã ãã¬ãŒã ã¯ãŒã¯ ã¯å€ãã£ãŠãããšæããŸãã åºæ¬çãªéšåã«ã€ããŠã¯ã©ããäœ¿ãæ¹ã¯åãã§ãæèŠçã«äœ¿ããããã«ãªã£ãŠãããããå®éã«è§Šããªããè²ã
ãšæ¯ã¹ãŠèŠããšé¢çœããã§ããã ShowNoteã®æ¹ã«ã¯ãããªããŒã·ã§ã³ããã ãã€ã°ã¬ãŒã·ã§ã³ ãã«ã€ããŠã®æ¯èŒãè¡ã£ãŠããŸãã®ã§æ¯éã芧ã«ãªã£ãŠãã ããã hackmd.io ã PHP TechCafeãã§ã¯ä»åŸã PHP ã«é¢ããæ§ã
ãªããŒãã®ã€ãã³ããäŒç»ããŠãããŸããçããŸã®ãåå ããåŸ
ã¡ããŠãããŸãã connpass.com ãšã³ãžã㢠äžéæ¡çš ãµã€ã ã©ã¯ ã¹ã§ã¯ããšã³ãžãã¢ã»ãã¶ã€ããŒã® äžéæ¡çš ãç©æ¥µçã«è¡ã£ãŠãããŸãïŒ ãèå³ãããŸãããæ¯éã確èªããé¡ãããŸãã https://career-recruit.rakus.co.jp/career_engineer/ ã«ãžã¥ã¢ã«é¢è«ãç³èŸŒã¿ãã©ãŒã ã©ã®è·çš®ã«å¿åããã°è¯ããããããªããšããæ¹ã¯ãã«ãžã¥ã¢ã«é¢è«ãéæè¡ã£ãŠãããŸãã 以äžãã©ãŒã ãããç³èŸŒã¿ãã ããã rakus.hubspotpagebuilder.com ã©ã¯ ã¹Developersç»é²ãã©ãŒã https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ ã€ãã³ãæ
å ± äŒç€Ÿã®é°å²æ°ãç¥ãããæ¹ã¯ãäž»å¬ã€ãã³ãã«ãåå ãã ããïŒ âTECH PLAY techplay.jp âconnpass rakus.connpass.com
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æžç±
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã









