waste of time

主にPHP

PHPカンファレンス2015参加してきた

f:id:tmysz:20151003122317j:plain

PHPカンファレンスに参加してきました。

年々参加者も増えており(参加費無料がでかい)、なんと今年は全館貸切だそうです。勢いを感じますね。
以下、聞いた発表について適当にまとめた感想入り混じりメモ。

PHPの今とこれから2015

みんなの使ってるバージョン

使用しているPHPバージョンごとに会場で挙手を求められる場面があった。自分も含め未だにPHP5.3以下を使っているユーザが多い。(弊社の新しいプロジェクトでは5.6使ってます)
世界的にみてもサポート切れバージョンの使用率が高いらしく、PHP界隈は闇が深い。

PHP7.0について

正式リリースは2015/11/12。(ついに来月!)
以下、主な注目点。

  • メインはやはり高速化
  • Null合体演算子
  • スカラー型宣言、戻り型宣言
  • 致命的エラーが例外補足可能に

eregやmysql等一部エクステンションの削除など上記以外にもいろいろ変わっている。
高速化については、前々からPHP7.0RCとHack/HHVMのベンチ比較が各方面でアツく語られていたのでかなり期待できるレベルなのではと感じていました。Hack/HHVMとの高速化競争でお互い影響を与え合っていて素晴らしいと思います。
Null合体演算子はたぶんみんなが待ち望んでいたものだと思います。PHP7を使える環境なら積極的に使っていこう。

今どきのSQLインジェクションの話総まとめ

徳丸さんによるありがたいお話。
日本のSQLインジェクション判例として紹介されたのが、「SQLインジェクションの対策漏れによる責任は開発会社にある」というものです。
CMSのECcubeをカスタマイズした箇所に脆弱性があったようですが、ECcubeのコア部分に脆弱性があって問題が起きた時の責任の所在はどうも曖昧なようです。 自分(会社)の身を守るためには、CMSフレームワークのパッチが出てきたらすぐに適用しなければなりません。

SQLインジェクション、どう対策すれば良いのか?という話ですが、PDOでプレースホルダを使えばほぼ大丈夫とのことです。 普段フレームワークのORMを使ってSQLを組み立てていれば、内部でプレースホルダを使っているはずです。
order byにも式を指定できるので、素のPHPで書く場合は注意しよう。

デモで、脆弱性のあったDrupal1.xの管理者権限を実際に奪取するなど、今以上にセキュリティを意識するきっかけになりました。

Electronからクロスプラットフォームアプリケーションの歴史を考える

Electronに至るまでのクロスプラットフォームアプリの歴史↓

OSがまだ無い時代
ハードが変わればソフトも全部書き直し

救世主Java
ハードやOSに依存しないバイトコードを作成。仮想マシン上で動作。
しかしJava…もっとライトに書きたい…

Web技術の採用
RIA流行り始める。Adobe AirとかMicrosoftSilverlight
ランタイムのインストールが必要だし、Flashジョブズが嫌ったし、Silverlightに至ってはMicrosoftすら使ってない…

ブラウザアプリ
Chromeアプリなど。ウェブアプリケーションがオフラインでも利用できる。
Chromeインストールしないといけない…

Electron
UIはHTML/CSSで、動きはJSで書ける。
クロスプラットフォームのWebブラウザをランタイムとして同梱 Node.jsの機能を利用できる。npmパッケージは19万以上!なので、たいていの機能は誰かが既に書いたものを流用して実現できる。
PHPのエキスパートはつまりJSのエキスパートなので(?)今すぐElectronでデスクトップアプリを開発できる!

と良いことだらけのElectronだが、欠点もある。
chromium同梱になるのでバイナリサイズが大きめだったり、動作が重めだったり。

大掛かりなものももちろん作れるが、俺々ツールやちょっとした社内ツールに最適なので試す価値は大いにあると感じた。

徳丸先生に怒られない、動的SQLの安全な組み立て方

文字列連結でSQL組み立て駄目 → SQLを文字列で指定できてしまうのが駄目という話。
「本質的には、ライブラリやAPIのインターフェースに欠陥があるのであり、間違いを誘発するものを使い続ける限り、SQLインジェクションはなくならない」という主張。
では具体的にどうするのかということについては、以下の2点をあげていた。

SQLテンプレートもSQL構文木も初めて知りました。

SQLテンプレートは、HTMLテンプレートのSQL版みたいなもののようです。SQLテンプレートを使うことによって、文字列連結不可&エスケープとプレースホルダ強制という恩恵に預かれます。
※発表者によるコンセプト実装 SQLTempl8

SQL構文木は、しっかりとは理解できませんでしたが、木構造に当てはめてからSQLを生成する(=文字列連結したSQLを直接パースしない)のでSQLインジェクションが防げる…ということかなと。 悪意ある文字列が与えられても、SQL木構造に影響はないため安全。

DMMのハイパー メディアオタサーの姫 arimoが語る Phalcon

C言語エクステンションで動いてるフルスタックフレームワークのPhalconをプロジェクトで採用した話。
エクステンションについては、バージョン1.xのときは生Clangで書かれていたが、2.xではPHPライクに書けるZephirで書いてClangにビルドしているので、PHPerにも優しい。
特筆すべきはやはりかなり速いということ。phalcon+enginxで運用している。 DIコンテナが便利。アプリ全体から使う機能をDIコンテナに入れておく。

Phalconの闇

  • 情報が少ない。何かあったときの調査に時間かかる。
  • ドキュメント英語ばっかり。公式も中途半端に日本語化
  • ORM。簡単なのはできるけど、サブクエリは生成できない。必要ならPDOで組み立てる。
  • メール。メール送信用のパッケージがない。結局mb_send_mailで送った。
  • configのマージ。環境ごとにconfig切り替える機能がない。ENVで手動で切り替えた。

なお、テンプレートエンジンにはVoltを使用。API開発のためViewは作らない予定だったが、メールのためだけにViewディレクトリ作らざるを得なかったとのこと。

脆弱性もバグ、だからテストしよう!

セキュリティテストツールの紹介・宣伝。

セキュリティテストの分類

CIにセキュリティテストを組み込む。
コーディング→単体テスト結合テスト→セキュリティテスト→リリース

セキュリティテストツールとしてはOWASP ZAP、VAddyがある。(VAddyは自社サービス宣伝)

VAddyデモ。 ブラウザに専用プロキシを刺して、検査対象のアプリをシナリオに沿って操作すると、情報を自動でクロールする。クロールした情報をもとにセキュリティテストを自動で行う。

VAddyはJenkinsプラグインがあるようなので、手軽に連携できそう。ちなみに無料(フリーミアム)

LT

ランダムデータをPHPで作る

開発時、DBにいれるダミーデータの生成。
generatedata.comが便利。ライブラリだとfakerが有名らしい。
fakerインスパイアのfabricate作ってるからみんなPR送ってという話。

PHPRubyのゲームを攻略する PHPWarrior

熟練のPHPerはRubyで作られたゲームをPHPで全部再実装してPHPで攻略する。
いつだったかの東京PHP勉強会と同じ内容かと思いきや、最終面が進化していた。

良心的にまじめに開発するための心構え

クラスに名前と役割以上のものをもたせない。太らせない、分割しよう。

PHPでDIをする

依存クラスについて中からアクセスするのではなく、コンストラクタで渡してやる(呼び出すときに引数で渡す)?

phpと夫婦生活

パーフェクトPHP改訂版2016年内発売予定 テスト、エクステンションの章追加!