Home > アーカイブ > 2012-03

2012-03

CakePHP における Mass Assignment 脆弱性対策

この記事の所要時間: 68

Rails 界隈で話題の Mass Assignment 脆弱性を CakePHP で防ぐ方法です。

cakephp_logo

Github に Mass Assignment 脆弱性が発見されて、Rails 界隈で話題になっています。この問題自体は目新しいものではなく、Rails 自体の問題というより、Rails アプリケーションの作り方の問題ということで、以前から作る側が注意を払う必要がありました。

この Mass Assignment 脆弱性は、Rails を手本に発展してきた CakePHP アプリケーションでも同様の問題が発生する可能性があります。知っている人には常識なのですが、まだ知らない人もいるかと思うので、CakePHPにおける対策方法を書いてみます。下記コードはCakePHP2系を想定していますが、考え方はCakePHP1系でも同じです。

Mass Assignment 脆弱性

CakePHP における Mass Assignment 脆弱性は、フォーム(多くはFormHelperで作成)からPOSTで送信された値をモデルに渡す時に発生します。

例えば、以下のようなフォームの場合、一見するとnameだけが送信されるように見えます。このフォームをブラウザで表示して入力内容を送信すれば、もちろんnameだけが送信されます。しかし、フォームというかHTTPリクエストは自在に改変できるので、nameの他にemailでもpasswordでも何でも送ることができます。

app/View/User/edit.ctp

<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('name'); ?>
<?php echo $this->Form->end('submit'); ?>

コントローラで見ると、edit()メソッド内で、$this->request->dataの値をそのままUser#save()に渡しています。サンプルコードなどではよくある書き方ですが、$this->request->dataに本来想定していないパラメータが含まれていても(上記フォームで言うところのname以外)、usersテーブルにカラムが存在すれば、送信された内容がそのままデータベースに保存されてしまいます。

app/Controller/UserController.php

<?php
App::uses('AppController', 'Contoller');

classs UserController extends AppController {
  public $uses = array('User');

  public function edit() {
    if (!empty($this->request->data['User'])) {
      $this->User->save($this->request->data);
    }
  }
}

これを悪用すると、本来入力フォームでは変更して欲しくないカラム(例えば管理者フラグや権限、もしかするとポイント数など)を外部から操作することが可能となります。

さらにModel#save()では、与えられた引数にプライマリーキー(多くはid)が含まれていると、その値にマッチするレコードをupdateしてしまいます。つまり新規追加フォームのつもりが、任意のレコードを変更されてしまう可能性があります。

この問題、実は意識しておかないと結構影響が大きいです。

対策1. SecurityComponent を使う

対策として、SecurityComponent を使う方法があります。SecurityComponentをコントローラの$componentsに記載しておけば、自動的にフォーム改ざんチェックが有効となるので、フォームを改ざんして任意のパラメータを送信してもエラーとなり、アクションメソッドが実行されません。

対策2. save()に渡す値を設定する

対策1でも対策にはなるのですが、本質的な問題は$this->request->dataに意図しないパラメータを含まれているのにそのまま処理してしまうことです。そこで、処理対象のパラメータのみを抽出して、save()には抽出したパラメータを渡すようにします。

下記がサンプルです。$dataに処理対象のパラメータだけをセットして、save()には$dataを渡しています。これにより意図しないパラメータが送られてきても、save()に渡されることはありません。

  public function edit() {
    if (!empty($this->request->data['User'])) {
      $data = array(
        'name' => Set::extract($this->request->data, 'User.name'),
      );
      $this->User->save($data);
    }
  }

不十分な対策 save()の第三引数に更新対象カラムを渡す

save()の第三引数に処理対象カラムを指定することで、意図しないカラムへの更新を防ぐという方法があります。

下記のようにsave()の第三引数にarray(‘name’)を指定して、nameのみを更新対象とします。この方法なら更新されるカラムはnameに限定することができます。しかし、$this->request->data[‘User’]にidが含まれていると、そのidに該当するレコードが更新されるという問題が残ります。つまり更新カラムはnameのみですが、その対象レコードは任意に指定されてしまいます。

  public function edit() {
    if (!empty($this->request->data['User'])) {
      $this->User->save($this->request->data, true, array('name'));
    }
  }

便利機能には注意を

$this->request->dataをそのままModel#save()に渡して処理する。この方法は簡単だし、スマートに見えます。しかし、上で見てきたように意識しておかないと意外な落とし穴にはまります。

このあたりは手を抜かずにきっちりと処理対象パラメータのみを抽出してsave()に渡すという方法が問題も起こりづらいし、挙動も把握しやすいと思います。意識していなかった人はご注意を。

PHPカンファレンス関西2012を開催します

この記事の所要時間: 433

PHPカンファレンス関西2012を5/12に開催しますよ!

logo2012

すでにご存知の方も多いかと思いますが、昨年盛り上がったPHPカンファレンス関西をまたまた開催します。

イベントの概要と現在募集している内容をご紹介します。

PHPカンファレンス関西2012

今年はゴールデンウィーク明けの5/12(土)に開催します。会場は昨年と同じく大阪産業創造館(産創館)です。

カンファレンス公式サイトを公開しています。今後、参加者申込やセッション発表などイベントに関する情報を公開していきますので、こちらも見てみて下さい。

PHPカンファレンス関西2012

・名称
  PHPカンファレンス関西

・開催日時
  2012年5月12日(土)10:30-16:40(10:00開場)

・開催場所
  大阪産業創造館 4Fイベントホール 6F会議室(A・B)
  http://www.sansokan.jp/

・テーマ
  「好きやねんPHP!」

・参加費用
  無料

・定員(予定)
  250名

PHPカンファレンス関西2012の特徴を3つ。

1. テーマは「好きやねんPHP!」

今回のテーマは「好きやねんPHP!」です。

このイベントが何のイベントなのか、という原点に立ち返って、とにかくPHPが好き!という思いを全面に出していきます。

2. 会場が2会場、マルチトラックに

会場は、昨年開催した「イベントホール」に加えて、「6F会議室」の2会場となります。

会場が増えたということで、マルチトラックが可能となり、セッション数も大幅に増えます!

マルチトラックの利点はセッション数の増加だけではありません。大事ななのは参加するセッションを選択できる、ということです。同じ時間に開催される2セッションのうち、参加したいなあと思う方を自由に選ぶことができます。

どちらも聞きたい!ということになりそうですが、「選べる」というのは嬉しいですね。

3. セッションを公募に

そしてそして最後にここにつながります。

今年は LT だけではなく、本セッションについても公募を行います。

もちろん昨年同様、どなたかにセッションをお願いすることも考えていますが、公募による本セッションを行います。

発表内容はPHPに関するものなら何でも ok です。エンジニア向けだけではなく、デザイナー向け、オペレータ向け、初心者向け、なんでも来いです。

今回のテーマもマルチトラックにしたのも、全てこのセッション公募を実現するためです。ぜひバラエティに富んだセッションを開催したいと思うので、皆さんからの応募をお待ちしています!

募集しています!

現在、PHPカンファレンス関西2012では、以下の内容を募集しています。

セッション発表者募集

上記でも書きましたが、セッションで発表して頂ける方を募集しています。

まさにこれが今回のイベントの肝です。ここ関西で開催されるカンファレンスで発表してみましょう!

発表に興味はあるけど、勇気が出ないという方には、この言葉をオススメします。

「君の当たり前に僕らは感嘆させられるんだ」

勉強会を楽しむなら発表しよう!

セッション発表者募集に関する詳細は下記からどうぞ。

セッション発表者を募集しています。 – PHPカンファレンス関西2012

スポンサー募集

PHPカンファレンス関西2012に協賛頂けるスポンサー企業を募集しています。

関西はもちろんのこと、関西外からもPHPユーザが数多く集まるイベントです。これまでこういったイベントへの協賛をされていない方も大歓迎ですので、お気軽にお問い合わせください。

スポンサー募集に関する詳細は下記からどうぞ。

スポンサーの募集を開始しました – PHPカンファレンス関西2012

スタッフ募集

イベント運営をお手伝いして頂けるスタッフを若干名募集しています。とくに今回は会場が増えたので当日にお手伝い頂ける方をお待ちしています。

イベントは参加するだけでも楽しいですが、運営に関わるとまた違った視点でイベントを見ることができます。個人的にはスタッフをやっていて好きなのは、参加している人たちの笑顔ですね。とくに懇親会の最後に壇上から見ると、ほんとみんな良い表情をしてるんですね。そうした光景を見ると「あーほんとにイベントやって良かったなあ」を感じます。

一緒に参加している人を笑顔にしてみませんか?

スタッフ募集に関する詳細は下記からどうぞ。

スタッフを募集しています – PHPカンファレンス関西2012

5/12は大阪産業創造館へ

5月開催ということで、まだ少し時間がありますが、まずは5/12の予定を確保してお待ち下さい。(遠方の方も今なら飛行機の早割も間に合いますよ:D)

今後、準備が整い次第、参加者募集などを開始していきますので、公式 Twitter(@phpcon_kansai)、Facebook(pcon.kansai)をフォローして下さいね。

では、今年もPHPカンファレンス関西をよろしくお願いします。5/12は大阪産業創造館でお会いしましょう!

Home > アーカイブ > 2012-03

検索
フィード
メタ情報

Return to page top