CakePHP での安全なサイトの作り方1 ~ SQL インジェクション~ 第 10 回 高蔵寺 SE 勉強会  2008/7/6 (日)
SQL インジェクションとは
「インジェクション」は「注入」という意味。 つまり SQL インジェクションは, Web サーバーの背後で動くデータベースに SQL コマンドを送り込み,そのコマンドを実行させる攻撃方法を意味している。  IT Pro より
SQL インジェクションの脆弱性があると どうなるのか?
・情報の漏えい ・データの改ざん ・不正ログイン ・システムの乗っ取り
CakePHP ではどのように対応するか?
例1 $data = $this->Sample->findAll('id=' . $value); コントローラーにこんな感じで書くと、 $value (入力値)に「 1 or 1=1 」というデータが渡されると、 SQL の条件が「 WHE...
例2 ( CakePHP1.1 の場合) $conds = array('id' => '= ' . $value); $data = $this->Sample->findAll($conds); コントローラーにこんな感じで書くと、 $va...
例3( CakePHP1.2 RC2 の場合) $conds = array('id' => $value); $data = $this->Sample->findAll($conds); コントローラーにこんな感じで書くと、 $value ...
+ α $conds = array('id' => '> ' . $value); 比較演算子を使う方法 CakePHP1.1 の場合、先ほどの例の通り $conds = array('id >' => $value); CakePHP1.2...
例4 $data = $this->Sample->findAllById($value); コントローラーにこんな感じで書くと、 $value (入力値)に「 1 or 1=1 」というデータが渡されると、 SQL の条件が「 WHERE `...
+ α function conditionKeysToString (~)  { quote  処理をやってくれている場所は、 cake/libs/model/datasources/dbo_source.php ここで条件の部分の  SQL...
保険的対策も必要 ・エラーメッセージの表示をしない ・データベースアカウントの権限設定 ・ DB の格納情報を必要最低限にする ・パスワードは暗号化して保存
終わり
Upcoming SlideShare
Loading in …5
×

Cake Phpでの安全なサイトの作り方1(Sqlインジェクション)

6,266 views

Published on

Published in: Technology
  • Be the first to comment

Cake Phpでの安全なサイトの作り方1(Sqlインジェクション)

  1. 1. CakePHP での安全なサイトの作り方1 ~ SQL インジェクション~ 第 10 回 高蔵寺 SE 勉強会  2008/7/6 (日)
  2. 2. SQL インジェクションとは
  3. 3. 「インジェクション」は「注入」という意味。 つまり SQL インジェクションは, Web サーバーの背後で動くデータベースに SQL コマンドを送り込み,そのコマンドを実行させる攻撃方法を意味している。 IT Pro より
  4. 4. SQL インジェクションの脆弱性があると どうなるのか?
  5. 5. ・情報の漏えい ・データの改ざん ・不正ログイン ・システムの乗っ取り
  6. 6. CakePHP ではどのように対応するか?
  7. 7. 例1 $data = $this->Sample->findAll('id=' . $value); コントローラーにこんな感じで書くと、 $value (入力値)に「 1 or 1=1 」というデータが渡されると、 SQL の条件が「 WHERE id=1 or 1=1 」となり、 全てのデータが取得できてしまいます。
  8. 8. 例2 ( CakePHP1.1 の場合) $conds = array('id' => '= ' . $value); $data = $this->Sample->findAll($conds); コントローラーにこんな感じで書くと、 $value (入力値)に「 1 or 1=1 」というデータが渡されると、 SQL 文は「 WHERE `id` = '1 or 1=1' 」という感じになり、 例1の様な全件取得はなくなります。 ※ 「 '= ' 」の用にイコールの後のスペースが必要
  9. 9. 例3( CakePHP1.2 RC2 の場合) $conds = array('id' => $value); $data = $this->Sample->findAll($conds); コントローラーにこんな感じで書くと、 $value (入力値)に「 1 or 1=1 」というデータが渡されると、 SQL 文は「 WHERE `id` = '1 or 1=1' 」という感じになり、 例1の様な全件取得はなくなります。 ※ 例2の様にイコールは必要なし
  10. 10. + α $conds = array('id' => '> ' . $value); 比較演算子を使う方法 CakePHP1.1 の場合、先ほどの例の通り $conds = array('id >' => $value); CakePHP1.2 RC2 の場合は前に付けます
  11. 11. 例4 $data = $this->Sample->findAllById($value); コントローラーにこんな感じで書くと、 $value (入力値)に「 1 or 1=1 」というデータが渡されると、 SQL の条件が「 WHERE `Sample`.`id` = '1 or 1=1' 」となり、 全件取得を回避できます。
  12. 12. + α function conditionKeysToString (~) { quote 処理をやってくれている場所は、 cake/libs/model/datasources/dbo_source.php ここで条件の部分の SQL を作っているので、 WHERE 句でどうやったら良いか迷った場合はここを見てみると 良いかもしれません。
  13. 13. 保険的対策も必要 ・エラーメッセージの表示をしない ・データベースアカウントの権限設定 ・ DB の格納情報を必要最低限にする ・パスワードは暗号化して保存
  14. 14. 終わり

×