PHPカンファレンス2018に行ってきた

2018年12月15日(土)、蒲田駅近くにある大田区産業プラザ PiOにて開催された、PHPカンファレンス2018に行ってきました。半年も経ちましたが、レポートとしてブログに残しておきたいと思います。

PHPカンファレンス2018

参加したセッション

1. PHPのいまとこれから 2018(Track 1 1F大展示ホール 10:10 〜 10:50 )

スピーカー:廣川 類 / 日本PHPユーザ会

www.youtube.com

2018年末でPHP5系とPHP7.0のサポートは終了。なお、会場の挙手アンケートでは、まだ3割くらいが、PHP5系を利用しているとの回答でした。私の界隈ですと、業務系WebアプリにおいてRHELを採用している事例も多いことから、まだまだ使い続けるケースもありそう。(開発者側としては、あまりモチベーションが上がりませんが。。)

PHP7系は、PHP5系よりも、速く快適に動作します。業務では、まだPHP5系からPHP7系に移行した案件は携わっていないのですが、これはメリットの1つですね。

f:id:YusukeOno:20190515085033j:plain

PHP言語としては、成熟期に入ってきたとのこと。今後は、機能拡充よりもセキュリティ面の強化が重点となるようです。

f:id:YusukeOno:20190515123619j:plain

PHPの派生言語として、HHVMやHackと言うものがあることを初めて知りました。これらの派生言語ですが、今後は互換性を持たない言語として進化していくようです。業務系システムでお目にかかることはあまりなさそうですかね。。

f:id:YusukeOno:20190515223144j:plain

次バージョン PHP 7.4について。スライドでは、プリロードの話と、プロパティにおける型指定の話が出ていました。後者のType Properties 2.0の「2.0」は、過去として提起されたけど、コミッタ間でリジェクトされた経緯があるためとのことでした。


2. LaravelでTDDを体験しよう(Track 3 4Fコンベンションホール梅(手前) 11:00 〜 12:00 )

スピーカー:大村創太郎

LaravelでTDDを体験しよう speakerdeck.com

PhpStormで爆速なテスト駆動開発を実演が非常に印象的でした。

スピーカーの大村さんもオススメしていた、t_wadaさんの50分でわかるテスト駆動開発もリンク貼っておきます。 channel9.msdn.com

まずテストを書く

テストが失敗することを確認する。(まだ実装していないから)

とにかく素早く実装

テストに成功することを確認する

開発者が気持ちよくコードを書くこのリズムが大切とのこと。それがコードの品質を担保と言う話は共感です。

開発環境としては、Vagrantベース(Homestead)で構築されているようでした。OSはもちろんMacで、PhpStorm推し。Command+rでテスト実行。おすすめプラグインは、Laravel-ide-helperとのこと。コード補完やphpdocs補完もやってくれるようです。

Laravelは標準でテストコードがあるので、これを参考にすると良さそう。

テストメソッドは日本語でもいい。後からみてわかりやすいのが重要。


3. 2018年のPHP環境を考える(Track 1 1F大展示ホール 13:00 〜 14:00 )

スピーカー:うさみけんた / pixiv, inc.

www.youtube.com

PHPの環境としては、主に3つ。 1. リリース環境 2. 開発環境(テスト環境) 3. コーディング環境

リリース環境は、CentOSDebian、最近はDockerありきの構成も出てきた。テスト環境はリリース環境と同じがいい。CI環境はOSSを使って自前で構築するか、SaaSを利用する。コーディング環境は、慣れているOSでいい。実行環境とのギャップを埋めるために仮想環境でLinuxを利用することもあるが、IDEや仮想環境を組み合わせると、それなりのスペックが求められる。

結局どうすべき? 依存ミドルウェアが多いプロジェクトほど、Dockerでの開発環境構築の共通化が聞いていくる。

pixivではどうしているか? 共用の開発サーバを用意し、DNSApache(VirtualDocumentRoot)+ワイルドカード証明書で、増殖可能な環境としている。

他の選択肢としては、、

  • レンタルサーバを借りる(ただしroot権が無い)
  • オンプレ。(管理が面倒。サーバ調達やネットワーク設定など)
  • VPS(自己責任)
  • PaaS(Herokuなどは、細かい設定は変えられないが、オートスケールは勝手にやってくれる)
  • IaaS(AWSなどのパブリッククラウド

どのバージョンのPHPを選べばいい? 「最新」がおすすめ。制約がない限り新しいバージョンがいい。古いバージョンは脆弱性のリスクもある。

どうやって動かすの? PHPCGI(Common Gateway Interface)の影響を受けているので、大規模開発になると保守が辛くなる。PHPも他の言語と同じように、コマンドラインで動くスクリプトを書くことができるので、ユニットテストは基本CLIで動くので、PHPのWebアプリをテストするには工夫が必要。

ライブラリ管理は? composerが主流。PEARは下火。Composerの特徴としては、プロジェクト単位で依存関係を管理できる。公開プロジェクトなどからインストール可能。Include_pathにインストール、require_onceでロード。ローカルに独立してインストールすることも可能。

composerでもできないことがある。例えば、C拡張モジュールのコンパイル・動的ロードはできない。代わりにcomposer install時に、要求する拡張モジュールのチェックができる。

HTTPSにしないとだめ? 「YES」HTTPS推奨。ブラウザの先端機能を有効化するため。ブラウザ側がHTTPでの通信を制限しつつある。HTTPとHTTPSを行ったり来たりとかは、脆弱性を生むキッカケにもなり得る。

PHPのコーディングスタイルについて エディタでも開発できるけどIDEにはかなわない。PSR-1 基本コーディング規約、PSR-2 コーディングガイドあたりは確認しておく。

結論: PHPの環境は様々。


4. 安全なWebアプリケーションの作り方2018/徳丸 浩(Track 1 1F大展示ホール 14:10 〜 15:10 )

スピーカー:徳丸 浩 / EGセキュアソリューションズ株式会社

www.slideshare.net

Japan PHP Conference 2018 Track1 (4) 安全なWebアプリケーションの作り方2018 - YouTube

昨年(2017年)出てきた新しい脆弱性について2点ご紹介。

1.XML外部エンティティ参照(XXE)

XMLの中から、外部参照で指定した情報を参照できる。 これにより、直接アクセス不可である情報を参照できる攻撃が成立可能。これをSSRF(Server side request forgery)攻撃という。

f:id:YusukeOno:20190602114227j:plain
SSRF

XMLから外部ファイルを参照できるのはXMLが持つ機能。プログラムの不備ではない。対策として、XMLの代わりにJSONを用いる。JSONであれば、外部ファイルを参照する機能を持たない。だが、XMLを前提とするSOAPでは、単純にJSONに置き換えられない。

f:id:YusukeOno:20190602114417j:plain

この脆弱性はlibxml2に起因している。なので、libxml2のバージョン2.9以降を用いる。CentOS6系でも、最新のパッチを適用すれば、libxml2のバージョンは新しくなる。また、AWSなどのインスタンスでも、libxml2のバージョンは新しいものになっている。(だが、PHP側で明示的に外部実体参照を許可している場合は例外)

2.安全でないデシリアライゼーション

次は、安全でないデシリアライゼーション(CWE-502)オブジェクトインジェクション脆弱性。クッキーをシリアライズして文字列に変換した後、逆にデシリアライゼーションしてオブジェクトに戻すケース。この時に、任意のクッキーを潜り込ませておき、オブジェクトのデストラクタから任意のコードを実行させる攻撃。

f:id:YusukeOno:20190602114953j:plain

Wordpressプラグイン(Welcart 1.9.3)がこの脆弱性を含んでいた。脆弱性修正差分を見ると、selializeメソッドをjson_encodeメソッドに変更されている。また、unserializeメソッドが、json_decodeメソッドになっている。要は、シリアライズ・デシリアライズをやめている。

f:id:YusukeOno:20190602115625p:plain

対策としては、JSON形式でデータの受け渡しを行う。

f:id:YusukeOno:20190602115818j:plain

次に、ECサイトでよくあるクレカ番号の取り扱い。基本は構築するサイトにクレカは保持しない非保持が推奨されるが、果たしてこの保持しない方式でも「安全」だろうか?結論から言うと、非保持方式であっても、脆弱性があればクレカ番号は盗まれる。(伊織漏洩事件)具体的には、ページが改ざんされ、偽のカード入力画面が差し込まれた。利用者としては、複数回カード情報を入力することになる。だが、その後で正しいカード入力画面でカード番号を入力すれば、利用者は注文した品は手元に届く。場合によっては、利用者が気がつかない。

最後に、PDFのFormCalcによるコンテンツハイジャックの紹介。FormCalcとは、PDFにフォームを埋め込むことができるスクリプト言語。これでHTTPリクエストを呼び出し、レスポンスを受け取ることができる。IE限定で成立する攻撃。

f:id:YusukeOno:20190602120431j:plain

対策としては、IE上でPDFを閲覧させなければ良い(ダウンロードを強制させる)のだが。

そして、Webセキュリティに関する新試験(通称:徳丸試験)が2019年末より実施される。(マニアックな問題は出題されないらしいですw)

f:id:YusukeOno:20190602120751j:plain


5. エンジニア経験5ヶ月の新人がDDDやTDD、Vueコンポーネントを駆使してクソコードを改革してきた話 (Track 2 2F小展示場ホール 15:20 〜 15:55 )

スピーカー:香月 宜浩 / GVA TECH株式会社

speakerdeck.com

Japan PHP Conference 2018 Track2 (7) - エンジニア経験5ヶ月の新人がDDDやTDD、コンポーネントを駆使してクソコードを改革してきた話 - YouTube

「AI-CON」と言う契約書をアップロードすることで、オンラインでレビューして、リスクを判定してくれるWebサービスを開発されているとのこと。

アジェンダ、やってみたことは3点。

  1. 画面リニューアルでDDD(ドメイン駆動設計)をやってみた
  2. 1000行あったテンプレートをVue.jsで書き換えた
  3. API作成をTDD(テスト駆動開発)をやってみた

既存のコードは、カオスとのことで、全てpublicメソッドで書き換え放題に加え、ネストが凄まじい状況。保守性が悪く、変更すべき箇所を特定しづらかった。

なので、DDD(ドメイン駆動設計)のドメインモデルを用いて、ソースを見通しをよくしようとした。「値オブジェクト」「エンティティ」「集約」といった戦術的設計を用いて改善しようとアプローチした。画面上から要素を抜き出し、用語の定義、そして構造を整理した。 結果として、構造がスッキリし、変更箇所が特定しやすくなった。保守性アップ。

次に、画面部分。 既存はCakePHPのテンプレートは1000行あってツライ。。なので、Vue.js前提とした設計に変更。

API部分は、地道にテストコードを書く、処理を書く、テスト失敗する。テストが通る処理を書く、テストが通る。この繰り返し。テスト対象を細分化して、TDD実施。


参加しての感想

初のPHPカンファレンスでしたが、参加費用無料にも関わらず、色々なグッズをいただきましたw

f:id:YusukeOno:20190602124800j:plain

中でもこのトートは、ちょうど12インチのMacBookが入るので愛用していますw