PHPカンファレンス2018 レポート

廣川類さん「PHPのこれから2018」、徳丸浩さん「安全なWebアプリケーションの作り方2018」 〜PHPカンファレンス2018

12月15日、東京都大田区産業プラザPiOにてPHPカンファレンス2018が開催されました。本稿ではその模様をお届けしていきます。今回は主に、ゲストスピーカーである廣川類さんと、徳丸浩さんのセッションをレポートします。

オープニング

実行委員長の原田裕介さんがオープニングの挨拶を行いました。今年のテーマが「GROWTH」であることや、スポンサーブースの案内、諸注意などを伝えました。

画像

廣川類さん「PHPのこれから2018」

日本PHPユーザ会 廣川類さんのセッションは、今年のPHPの状況、最近リリースされたPHP7.3、そして今後についての話がありました。廣川さんはphp.netのマニュアルページの翻訳やmbstringのモジュールを開発してきました。PHPのユーザーなら誰もが見たり使ったりしているところです。

画像

PHPの歴史とWebにおけるシェア

PHPはWebで主に使われている言語で1995年に誕生し23年経っています。もともとは開発者のラスマスのホビーツールだったものが、Webの進化とともに進んできました。Webの世界では8割くらいのシェアで、ここ数年はあまり変化がないとのことです。

またCMSのシェアは、PHPで開発されているWordPressが80.8%で圧倒的です。WordPressにはWoredCampというコミュニティがあり、とても活発です。過去にはPHPカンファレンスと同時開催したこともありました。

PHPの開発者と、PHPのこれまで

PHPは言語として、数多くの人に支えられています。PHPの開発アカウント数は1939(うち日本人とみられるアカウントは15)です。そのうちコアコミッターは約150名(うち日本人は5名)で、PHPの全ソース(エクステンションも含む)に触れる権利があります。また、全体の舵取りを担当しているPHP Groupは現在10名で構成されています。PHPをどうしていくかについては広く投票されることもありますが、最終的にはPHP Groupが決めています。

PHP5がリリースされたのが2004年です。5.3、5.4が2009年にリリースされ、一般的な言語として足りないところ、例えば名前空間やクロージャーが追加されました。そして5.5や5.6ではキャッシュやデバッガが強化され、Webサーバーも実装されました。こうして言語単体でおおよそのことができるようになりました。

そして2015年にPHP7がリリースされました(ちなみにバージョン6は5.3よりも前に作られましたが、Unicode化に失敗してコードがメンテナンスできなくなり、6自体は開発が断念されました⁠⁠。7以降は大きな変更はなくなってきていますが、高速化を進めています。7.3は今年12月6日にリリースされたばかりです。

PHPのバージョンのシェア

会場の参加者が使用しているPHPのバージョンを聞いてみたところ、5系が3割程度、7系が7割程度でした(PHPを使ったことない人もごく少数いました⁠⁠。W3Techsのバージョン調査によれば、PHPを使っているユーザーのうち24%が7系、それ以外がほぼ5系(5系の3割くらいが5.6)を使っていることが示されています。

画像

このように5系を使っているユーザーが多いのですが、5系の最後である5.6は今年12月31日でサポートが切れます。7.0もサポート先日12月3日に切れています。7.0までのシェアは全体の80%ほどあり、これほどの人が切り落とされてしまう、信じられない数字だと話しました。

PHPのライフサイクルは3年です。そのうちアクティブサポートは2年で、セキュリティ修正のみが1年です。しかし5.6はユーザー数がとても多かったため、これまでもサポートが延長されてきました(もともとは2017年末に終了予定でした⁠⁠。

廣川さんは「パッケージによっては古いバージョンをサポートしてくれる可能性はありますが、セキュリティ関連の問題が修正がされませんので、ぜひアップデートしてください」と述べていました。また、今年は大きなセキュリティ上の問題はあまり発生しませんでしたが、セキュリティの問題がなかったわけではないため、各バージョンの最新版を使ってほしいとのことです。

5系と7系のベンチマーク

5.6と7.0の差はとても大きく2倍くらいあります。PHPが利用されるのはWebアプリケーションなので、単純に言語のレスポンスが良ければ早く表示されるとかではありません。しかし、言語として高速であることは良いことです。

メモリの消費量については5と7の差はとても大きく、WordPressのベンチマークだと1:8くらいの差を、ZendBenchのベンチマークだと1:3くらいの差を確認できました。

画像

なお、7系の7.0から7.3まではおよそ5%ずつの改善を続けています。

PHP7.3における変更点

PHP7.3では構文や関数、機能にいくつか変更がありました。廣川さんは興味深い変更点を紹介していきました。

heardoc/nowdoc(ヒアドキュメント)の書き方

ヒアドキュメントの終端マーカがインデントできるようになり、その位置でインデントを制御できるようになりました。注意すべきはタブとインデントを混ぜるとエラーになることです。

if(true){
    print <<EOS
    Hello
    EOS;
}

Mbstringでの完全な大文字小文字変換のサポート

英語のアルファベットの大文字小文字変換は、単純に小文字大文字を置き換えるだけで簡単です。しかしフランス語には大文字になると、字数が変わる単語があります。例えばsTraße(シュトラセとよみ、英語ではstreet)はSTRASSEとなります。このような大文字小文字変換に対応しました。

mb_eregのアップデート

mb_eregではOnigurumaの最新版に対応しました。正規表現の名前付きキャプチャは配列の数字添字で取れていましたが、今後は"word"という名前で検索したら、"word"という配列の文字列添字で取れるようになります。

CookieのSameSite属性への対応

W3Cの提案段階ですが、ほとんどのブラウザでサポートされているCookieのSameSite属性。この属性を付けておくと、クロスサイトのリクエストに対して、Cookieを付けなくてすむ機能に対応するそうです。これまではフレームワーク側で対応していましたが、今後はPHP側で対応できるようになります。それにはsetcookie()などの引数にsamesiteオプションを加えてStrictを指定します。

関数の追加

is_countable関数が追加されました。今後は(配列 OR instanceof)で調べる必要がなくなります。また、array_key_firstとarray_key_last関数が追加されました。配列の最初と最後が簡単に取れるようになります。

リファレンス代入

あるリストを一部リファレンスにする場合、これまでは1行1行記述するしかありませんでしたが、今後は次のようにシンプルに記述できるようになります。

$m = [1,2,3];
list($a, &$b, &$c) = $m;

関数の引数の最後にカンマをつけられるように

関数の引数の最後に、配列と同じくカンマをつけられるようになりました。パーサーなどを作るときに便利になります。

その他

  • PCREがPCRE2に更新されました。
  • htrime()ナノ秒単位で計測できるようになりました。
  • 廃止された機能として大文字小文字に依存しない定数が廃止されました。
  • defineの第3引数にTrueを指定できましたが、今後はdeprication警告を発生します。
  • mbereg_*()は廃止。PHP3時代のエイリアスがなくなります。

今後のHack言語とHHVM

Facebookが開発しているHHVMは進化はしていますが、PHP7は完全サポートされないことを言及しました。そして、今年12月にリリースされたHHVM 3.30でPHPのサポートは終了となります。そして次のリリースであるv4.0.0以降ではPHP非互換となるとのことです。3.30も2019年11月にはサポートが終了します。

Hackの未来としては2、3年はユーザー数の増加を目指さず、4週毎にリリースを繰り返しながら言語としてのHack自体を進化させていくようです。なお、今まであったLTS版は非互換、非推奨となります。

PHP7.4からどうなるのか

PHP7.4の開発も始まっています。来年の今頃にリリースされる予定です。

7.4ではプリロード機能が実装されます。コンパイル時によく使うスクリプトがキャッシュしますが、プリロードは起動時にすべて読み込む機能になります。これにより、ZF2Testで50%ほど改善されるようです。

言語に関わるところではTyped Properties2.0が実装され、次のように書けるようなります。

class User {
    public int $id;
}

ちなみに2.0の前に否決されたものは下位互換性がなかったとのことです。

“PHPは歯ブラシのみたいなもの”

廣川さんは最後に、ラスマスの⁠PHPは歯ブラシのみたいなもの⁠という言葉を引用して、次のように話しました。

「いつも使う歯ブラシのことはあまり気にしません。⁠問題を解くためのシンプルなツール⁠であることが大事なのです。Webの世界は進化が激しく、なくなったものも非常に多いです。そのようななかPHPが生き残ったのは、このポリシーがあるからです。PHPの学習が容易です。また今回のカンファレンスなどのような地道な活動を行っていくことも大事です」⁠廣川さん)

このカンファレンスを主催している日本PHPユーザー会は、2000年に発足してから18年になります。カンファレンスやPHP勉強会を行っていますが、会則もなければ会長もいない、ゆるい組織だと紹介しました。

そして廣川さんは、本日のカンファレンスでは様々なセッションが行われることを挙げ、今年のテーマ⁠GROWTH⁠のように成長していく場としてほしいこと、また開催中は会場内にいるので気軽に声をかけてくださいと話し、発表を締めくくりりました。

徳丸浩さん「安全なWebアプリケーションの作り方2018」

EGセキュアソリューションズ株式会社 代表取締役の徳丸浩さんの発表「安全なWebアプリケーションの作り方2018」では、最近のWebセキュリティを取り巻く話題を取り上げました。

画像

「OWASP TOP 10 ー 2017」を巡る話題

セキュリティ情報を扱っているOWASPが毎年発行している「もっとも重大なウェブアプリケーションリスクトップ10⁠⁠。徳丸さんはセッションの初めに、昨年年末に発行された2017年版のトップ10を紹介しました。

画像

そして新たにランクインした、⁠XML外部エンティティ参照(XXE⁠⁠安全でないデシリアライゼーション」を取り上げていきました。

XXE

XXEとはXMLの外部実体参照を指します。そして外部のファイルを参照して置き換えることだそうです。

そして徳丸さんは、ファイアーウォールに守られたファイルを参照するSSRF攻撃(Server Side Request Foregery)のデモを行いました。ブラウザからXMLファイルを読み込んで表示するというシンプルなアプリケーションに対して、XMLは外部参照としてURLを指定できることを利用し、Webサーバから参照可能な、外部に公開されていないサーバへアクセスできることを示しました。

この外部参照はXMLの機能なので、プログラムのコーディング上のバグがあるというものではありませんが、セキュリティ上の問題になります。libxml2のバージョン2.9以降であればデフォルトで外部実体参照を停止する設定になっているため、XXEに対して脆弱ではないとのことです。もちろん新しいlibxmlでも、機能を有効にすれば脆弱になってしまうので注意が必要と付け加えました。

libxml_disable_entity_loader(true)を呼ぶと外部実体参照を禁止できますが、副作用としてファイルとしてXMLを読めなくなるため、メモリ上でXMLを受け渡す必要が出てきます。多少コードを書かなければなりませんが、XMLを扱うのであれば仕方がないかもしれません。

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

PHPはオブジェクト指向のプログラミング言語なので、データはオブジェクトになっていることが多いです。DBやファイル、通信で送りたい場合、バイト列のようなシリアライズする際に用いられるのがserializeです。そしてunserializeを使えば復元されます。

このunserializeに問題があり、攻撃者が仕込んだプログラムを実行できる場合があるとのことです。ただ、これはデータのはずなので、本来は実行されないのですが、ソフトウェアの仕様によっては発生することになります。

画像

Welcartオブジェクトの脆弱性

unserializeをjson_decodeに書き換えて対応しているようです。実際にWelcartに攻撃するデモを行いました。ブラウザからシェルを操作、ログを探し、クレジットカード番号の参照ができることを示しました。

対策は割と簡単でJSON形式を使えば良いとのことでした。CookieやHiddenパラメータではなく、セッション変数など外部から参照できない形で実行しても良いとのことです。

改正割賦販売法について

クレジットカード番号等取扱業者は経済産業省令で定める基準に従い、適切な管理をしなければいけません。情報の取り扱いの中でも、クレジットカード番号の保護だけは技術的に要求されています。

簡単にまとめまると、クレジットカード番号の非保持化を求めています。文面で問題になるのは「PCIDSS準拠とイコールではないものの、カード情報保護という観点では同等の効果があるものと認められる」ことです。決済代行業者が取る選択肢としては、JavaScript型とリダイレクト型を勧めています。JavaScript型は、サーバを通さずに直接決済代行事業者に入力データを飛ばす方法です。リダイレクト型は、画面遷移する方法です。徳丸さんは「とはいえ、これで完全に安全と言えるか?」と話を続けます。

今治タオルの伊織ショッピングサイトの例

今治タオルの伊織ショッピングサイトで起きた事件を取り上げ、この事件の流れを説明するデモを行いました。この事件では購入時に、クレジットカード番号を盗むページに画面遷移していました。不自然な画面遷移にも関わらず気にする人がいなかったのは、購入したタオルが届いてしまっていたからのようです。また、クレジットカード番号の入力が間違った場合、もとのサイトの不正確認画面に移り「カード番号が不正でした」というメッセージが表示されるようになっていました。

画像

この事件に見られるように、カード情報を保存していないからと言って、脆弱性がなくなるわけではないことがわかるとのことです。総合的な対策が必要ということですね。

徳丸本の第2版は内容増

徳丸さんが執筆した体系的に学ぶ 安全なWebアプリケーションの作り方の第2版を刊行したことを紹介しました。⁠CORS」⁠クリックジャッキング」⁠ファイルアップロードのFORMCalc」⁠構造化データの読み込みにまつわる問題」などの項目を増やしたとのことです。

ページ数は680ページもあり読むの大変です。徳丸さんは「4章、5章は長いのだが、逆引きのような形で使える」⁠4.3、4.4、4.5だけは読んでおいたほうが良い」とアドバイスしていました。

書籍で取り上げている、PDFのFormCalcによるハイジャックについて説明しました。PDFにはスクリプトを仕込め、HTTPリクエストを呼び出すことができます。IEユーザーが対象ですが、Acrobat Readerの仕様として相手のCookieのセッションIDが見えてしまうという問題があります。これをアプリ側で対処するには、POSTリクエストオンリーにする手があるが、いろいろ気になるところが多いとのことです。

なお、画像によるXSSに関する記述は削除したそうです。IE8以降は不要だからとのことです。

徳丸試験がリリース

最後に、ウェブ・セキュリティ試験通称、徳丸試験について紹介しました。BOSS-CON JAPANが運営する試験で、来年12月から開始予定とのことです。試験問題は、徳丸さんが代表を務めるEGセキュアソリューションズ株式会社によって作られるそうです。40問の基本問題に絞るそうです。注目しておきましょう!

おすすめ記事

記事・ニュース一覧