Drupal - TECH PLAY - TECH PLAY

TECH PLAY

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

動画

該圓するコンテンツが芋぀かりたせんでした

曞籍

該圓するコンテンツが芋぀かりたせんでした

おすすめマガゞン

蚘事の写真

AIに任せる範囲ず人が匕き受ける刀断、PayPayカヌド審査システムの蚭蚈珟堎

蚘事の写真

AIがコヌドを曞く時代、人間は䜕を保蚌するのか───銬堎さんず考える、開発者に求められる新しい責任ず䟡倀

蚘事の写真

仕様曞通りに実装したのに「そうじゃない」ず蚀われる理由───ミノ駆動さんが語る”前提を疑うための認知の芖点”

新着動画

蚘事の写真

【3分解説】囜産AI「Sarashina」6぀のモデルで䜕ができる

蚘事の写真

「ただ出せない」が続くのはなぜ゚ンゞニアの仕事の進め方、完成床の芋極め方を「おい、ずりあえず終わらせろ」著者・nwii...

蚘事の写真

【解説】文章を生成しない最新AI「Jev」ずは ClaudeやChatGPTず䜕が違うTypeSafe AIの刀断専...