モノノフ日記

普通の日記です

WAS Forum Developer Dayに行ってきました #2

徳丸さんのSQLインジェクションのお話です。
淡々と面白い事言うのが個人的にツボでした。楽天の話は面白すぎです。

SQLインジェクション対策再考

詳しい内容は徳丸さんのブログを読むとよいと思います。http://www.tokumaru.org/d/

正しくない対策の今昔
  • 最近の資料でも間違ってたりする
    • 2007年のIPAセキュア・プログラミング講座Webアプリケーション第6章
    • IBM日経BPに寄稿した記事
なぜ誤った解説がなくならないのか
  • 攻撃方法からの発想
  • 実はアプリケーションなんか書いたことない人が説明?
  • サンプルコード動かしてみた?
  • コピペの悪弊
なぜセミコロンを削除したがるのか
  • 複文の防御
  • インジェクションの文脈で複文が動くのはMS SQLPostgreSQL
  • MS SQLはセミコロン無しでも複文が書ける
そもそも、なぜSQLインジェクションが発生するか
エスケープは檻にしっかり入れるイメージ
対策の考え方
  • 基本はリテラルをしっかりと檻に入れる
  • バインド機構の利用
    • バインド機構の実装にバグがない保証も必要
  • SQLの動的組み立て+エスケープ
SQLの動的組み立て+エスケープ
  • 動的SQL生成の場合は文字列と数値で対応が変わる
  • 文字列
    • 普通にエスケープ
  • 数値
    • 型宣言のある言語、無い言語で対応が変わる
文字列リテラルのエスケープ
MySQLPostgreSQLで「\」のエスケープが必要な理由
  • 「\'」で1文字と見なしてしまうから
文字コードの問題
実際
  • IPAのガイドラインはDBの専用エスケープ処理を行うAPIの利用推奨
  • DBIのquoteがperlでハードコーディングされている箇所がある
  • 具体的にどの関数・メソッドなら安全であるというガイドラインが無い
入力値検証
  • アプリケーションレベルで「'」や「;」を削除、あるいは拒否するわけにはいかない
    • クォートやセミコロンも正しく使うようバインドを使う
  • ミドルウェアレベルでは半端なマルチバイトコードUTF-8の冗長表現をチェックしエラーに
まとめ・提言
  • そろそろ「入力値の未検証」という表現はやめよう
  • バインド機構の利用促進
  • 正しいエスケープ方法の普及
  • 安全なフレームワーク
  • 安全なバインド機構はどれ?
  • 安全なエスケープ関数はどれ?