より実践的な CakePHP の使い方

CakePHP プログラマーズ リファレンスガイドや当サイトのCakePHP ガイド 入門編には CakePHP を理解する上で重要な解説が多くあります。ここではその中でも重要と思われる機能を紹介します。

コンポーネントを使う

コンポーネントを参照してください。

ヘルパーを使う

ヘルパーを参照してください。

登録・編集ページで確認画面を挟む

確認画面を挟むを参照してください。

保存しようとしているデータは一意か?を検証する

モデルクラス内にあるデータを保存するための save() メソッドは内部的に validates() メソッドを呼んでいます。

validates() メソッドはデータの入力をチェックするメソッドですが、モデルクラスには beforeValidate() という検証前に自動的に呼ばれるメソッドがあります。

このメソッドをオーバーライドして返り値を false にするとデータの保存が中止されるという性質を利用して、値の一意チェックが可能になります。

<?php
class SampleModel extends AppModel
{

  // …中略…

  function beforeValidate()
  {
    // $this->data には入力した値が入ってくる
    $data = $this->data;

    if ($this->findBySampleID($data["SampleID"])) {
      // 重複した sample_id があったため false を返して失敗にする
      return false;
    }

    return true;
  }
}
?>

不正なページからの送信を遮断する

HTML の form タグを偽装して悪意のあるデータを Web システムに post する攻撃があります。このような攻撃に対して CakePHP ではページが遷移するたびに「トークン」と呼ばれる文字列を生成し、トークンを含まない悪意のある post データを検知してブロックする機能があります。

使用するためには、まずコントローラで次のように書きます。

<?php
class SampleController extends AppController
{
  // …前略…

  // この配列に Security を追加します。
  var $components = array("Security");

  // …攻略…
}
?>

次に form タグを出力しているテンプレート部分を書き換えます。

<!-- "/sample/controller/action" はサンプルです -->
<form action="/sample/controller/action" method="post">

…と書いてある部分を…

<?php echo $html->formTag("/sample/controller/action, "post") ?>

…とします。

これにより、正しい post データは以前と変わらず処理しますが、トークンを含まない、あるいはトークンの内容が不正な post はブロックされます。

ブロックされた際に空白のページが出力される点に注意してください。これは不正な post に対して正常なページを返す必要はないというポリシーからの仕様だそうです。

HTTP リクエストは POST のみ受け付ける

CakePHP では GET 通信 POST 通信にかかわらず URL から HTTP リクエストを受け取るコントローラとアクションを決定します。

もし POST 通信のみ受け取りたい場合はコントローラ内に次のように書きます。

<?php
// /samples/action を post 専用にしたい場合

class SamplesController extends AppController
{
  // …前略…

  // Security コンポーネントを配列に追加します
  var $components = array("Security");

  // …中略…

  function beforeFilter()
  {
    $this->Security->requirePost('action');
  }

  function action()
  {
    // ここが post 専用になります
  }

  // …後略…
}
?>

不正なページからの送信を遮断する

HTML の form タグを偽装して悪意のあるデータを Web システムに post する攻撃があります。このような攻撃に対して CakePHP ではページが遷移するたびに「トークン」と呼ばれる文字列を生成し、トークンを含まない悪意のある post データを検知してブロックする機能があります。

使用するためには、まずコントローラで次のように書きます。

<?php
// /samples/action にトークンによる認証をかけたい場合

class SamplesController extends AppController
{
  // …前略…

  // Security コンポーネントを配列に追加します
  var $components = array("Security");

  // …中略…

  function beforeFilter()
  {
    $this->Security->requireAuth('action');
  }

  function action()
  {
    // ここがトークンによる認証で守られます
  }

  // …後略…
}
?>

次に form タグを出力しているテンプレート部分を書き換えます。

<!-- 前略 -->

<form action="/samples/action" method="post">
<?php "/samples/action" はサンプルです ?>

<!-- 後略 -->

…と書いてある部分を…

<!-- 前略 -->

$html->formTag("/samples/action", "post");

<!-- 後略 -->

…とします。

これにより、正しい post データは以前と変わらず処理しますが、トークンを含まない、あるいはトークンの内容が不正な post はブロックされます。

ブロックされた際に空白のページが出力される点に注意してください。これは不正な post に対して正常なページを返す必要はないというポリシーからの仕様だそうです。

« 「チュートリアル - scaffolding からソースコードへ」へ  |  トップへ  |  上の階層へ  |  「HTTP リクエストに対する CakePHP の動作フロー」へ »

トップページへ戻る / 前のページへ戻る

back to top