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

徳丸浩さん,安全なPHPアプリケーションの作り方2016~PHPカンファレンス2016

この記事を読むのに必要な時間:およそ 2 分

正規表現インジェクション

phpMyAdminの正規表現インジェクションの例を紹介しました。

正規表現を外部から指定できる状況は避けるべきで,外部由来の値は正規表現として利用しないようにする原則に則って対策することとしました。

画像

SQLインジェクション

Zend FrameworkのSQLインジェクションの例を紹介しました。

識別子と式を区別するやり方のソースを見てみると,最初はカッコがあれば式とみなすというような記述でした。それが改定され,英数字0文字以上に続けて開きカッコがあり,末尾に閉じカッコがあれば式とみなすようになりました。さらに複雑な形式に対応するために改定されますが,それでもまだ攻撃しようとするとできてしまう状況でした。

画像

徳丸さんは,⁠文字列の内容によって識別しか式かが決まるというものは責任境界があいまいになってしまい,本来はそれぞれのメソッドは名前などで明確に区別されるべき」と指摘しました。そのため,これはZend Frameworkの仕様の問題である,との結論を一旦出していました。

ここで終わりかと思ったところ,さらにZend Frameworkが改定し,カッコのネストを許容するようになりました。改定は続きますが,それでも実際にまだ穴は残っていると説明していました。しかし,Zend Frameworkは2016年9月28日をもってEnd of Lifeとなり,もうZend Frameworkそのものの改定の見込みはありません。Zend Framework側の回答としては「アプリケーション側で対応せよ」とのことで,これに関しては徳丸さんも同意していました。具体的にこれに対する対策としてはZend Framework2または3,あるいは他のフレームワークへの移行を挙げていました。

XSS(JavaScriptリテラルのエスケープ)

script要素内で文字列リテラル動的生成のアプローチとして,次の3つ挙げました。

  • 過剰エスケープ
  • HTMLノードとして文字列生成後JavaScriptから参照
  • Inline JSONP
画像

そもそもなぜJavaScriptの動的生成を避けるべきかというと,コードとデータを分離すべきであり,またJavaScriptのエスケープはとてもややこしいからだと説明しました。HTMLノードを経由するかInline JSONPの採用を勧めていました。

総括 ― 安全なウェブアプリケーションのための原則

安全なウェブアプリケーションのための原則として,次の6点を挙げていました。

  • わかりやすく書こう,うますぎるプログラムはいけない
  • 局所的に脆弱性を解消する
  • 防御的プログラミング(Defensive programming)を実践する
  • 単体テストを徹底する
  • コード,命令に対して,外部からの値を持ち込まない
  • 危険な機能の利用を極力避ける

これだけ読んでも当たり前のことを言っているだけ,という印象になりがちだと前置きをし,それぞれの解説を簡単に行いました。

「わかりやすく書く」という点では,シンプルに実装する,危険な機能を避けるということでした。また,⁠防御的プログラミング」については本から引用して「⁠⁠そうなるはずだ』と決めつけてしまわないことが防御的プログラミング」と話しました。⁠プログラムには必ず問題があり,変更されるものである」ということです。

まとめ

徳丸さんは,いつも通り淡々とした口調で脆弱性の実例の解説とデモとを行いました。さらっとPPAPなど今はやりの話題を混ぜてくるところも徳丸さんらしいと感じました。

内容としてはもしかしたら「ごく当たり前」⁠そうすべきだと皆が分かっていること」かもしれませんが,実例をみると危機意識が高まったり,改めて危険性を再認識できたりします。最新の実例やそれの対策をまとめて見ることができる,非常に内容の濃いセッションでした。

資料も公開されていて,これを見るだけでも実例をかなりのところまで知ることができます。非常にわかりやすいので,ぜひ読者の皆様もご一読ください。

著者プロフィール

石川友梨(いしかわゆり)

ふわりふわりと生きています。
またいつか,どこかで。