10月3日に、PHPカンファレンス2015に行ってきた!話の続き
「脆弱性があったとき、その責任は発注者?開発者-判決では開発者」という話を聞いてきた!
http://blog.goo.ne.jp/xmldtp/e/3a0b8abaacb7feab2a9d1646735d8f44
の中に、「どうすればよいかは、午後へ」とあるけど、その午後の話
「徳丸先生に怒られない動的SQLの安全な組み立て方」
をメモメモ
・発表の背景:裁判と損害賠償
SQLインジェクションの裁判
甚大な被害額
4800万~1億円
・目的
SQLインジェクションが起こる新の原因と起こさない方法
→プレースホルダを使えより
・なぜSQLインジェクションが発生するか
エスケープしろ!
プレースホルダーを使え!
プレースホルダーを使ってもSQLインジェクション
→文字列連結でSQLを組み立てるから
これこそが真の原因
変数の埋め込みも同じ
・なぜ文字列連結でSQLをつくるのか?
プレースホルダーではできないことがあるから
要素数が同的に変わる
SQLを文字列で指定できてしまうから
・SQLインジェクションを防ぐには
・文字列連結を使わない方法で動的SQLを組み立てる
・SQLもじれるではない方法でSQLを指定できるようにする
・SQLインジェクションが発生する本当の原因は
ライブラリやSPIのインターフェースに
欠陥があるからである
間違いを誘発するものを使い続ける限りなくならない
・SQLテンプレート
SQLを生成するためのテンプレート
SQLインジェクションが発生しない(原理上は)
・SQLTempl8
コンセプト実装
・なぜSQLテンプレートだと発生しない
文字列連結が書けない
・is not distinct from <=>
・やっぱり埋め込み使いたい
テーブル名かカラム名
・SQL構文木
木構造で表現したデータ
通常は専用の専用のライブラリ
O/Rマッパーを使う
値に応じて自動的に変換できる
→悪意ある文字列をうけとっても。
意図しない変更はできない
まとめ
・動的SQLを作るのに文字列結合を避ける
・本質的にはAPIやインターフェースの欠陥
「脆弱性があったとき、その責任は発注者?開発者-判決では開発者」という話を聞いてきた!
http://blog.goo.ne.jp/xmldtp/e/3a0b8abaacb7feab2a9d1646735d8f44
の中に、「どうすればよいかは、午後へ」とあるけど、その午後の話
「徳丸先生に怒られない動的SQLの安全な組み立て方」
をメモメモ
・発表の背景:裁判と損害賠償
SQLインジェクションの裁判
甚大な被害額
4800万~1億円
・目的
SQLインジェクションが起こる新の原因と起こさない方法
→プレースホルダを使えより
・なぜSQLインジェクションが発生するか
エスケープしろ!
プレースホルダーを使え!
プレースホルダーを使ってもSQLインジェクション
→文字列連結でSQLを組み立てるから
これこそが真の原因
変数の埋め込みも同じ
・なぜ文字列連結でSQLをつくるのか?
プレースホルダーではできないことがあるから
要素数が同的に変わる
SQLを文字列で指定できてしまうから
・SQLインジェクションを防ぐには
・文字列連結を使わない方法で動的SQLを組み立てる
・SQLもじれるではない方法でSQLを指定できるようにする
・SQLインジェクションが発生する本当の原因は
ライブラリやSPIのインターフェースに
欠陥があるからである
間違いを誘発するものを使い続ける限りなくならない
・SQLテンプレート
SQLを生成するためのテンプレート
SQLインジェクションが発生しない(原理上は)
・SQLTempl8
コンセプト実装
・なぜSQLテンプレートだと発生しない
文字列連結が書けない
・is not distinct from <=>
・やっぱり埋め込み使いたい
テーブル名かカラム名
・SQL構文木
木構造で表現したデータ
通常は専用の専用のライブラリ
O/Rマッパーを使う
値に応じて自動的に変換できる
→悪意ある文字列をうけとっても。
意図しない変更はできない
まとめ
・動的SQLを作るのに文字列結合を避ける
・本質的にはAPIやインターフェースの欠陥