より実践的な CakePHP の使い方
CakePHP プログラマーズ リファレンスガイドや当サイトのCakePHP ガイド 入門編には CakePHP を理解する上で重要な解説が多くあります。ここではその中でも重要と思われる機能を紹介します。
コンポーネントを使う
コンポーネントを参照してください。
ヘルパーを使う
ヘルパーを参照してください。
登録・編集ページで確認画面を挟む
確認画面を挟むを参照してください。
保存しようとしているデータは一意か?を検証する
モデルクラス内にあるデータを保存するための save() メソッドは内部的に validates() メソッドを呼んでいます。
validates() メソッドはデータの入力をチェックするメソッドですが、モデルクラスには beforeValidate() という検証前に自動的に呼ばれるメソッドがあります。
このメソッドをオーバーライドして返り値を false にするとデータの保存が中止されるという性質を利用して、値の一意チェックが可能になります。
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 データを検知してブロックする機能があります。
使用するためには、まずコントローラで次のように書きます。
class SampleController extends AppController { // …前略… // この配列に Security を追加します。 var $components = array("Security"); // …攻略… }
次に form タグを出力しているテンプレート部分を書き換えます。
<!-- "/sample/controller/action" はサンプルです -->
<form action="/sample/controller/action" method="post">…と書いてある部分を…
echo $html->formTag("/sample/controller/action, "post") ?>
…とします。
これにより、正しい post データは以前と変わらず処理しますが、トークンを含まない、あるいはトークンの内容が不正な post はブロックされます。
ブロックされた際に空白のページが出力される点に注意してください。これは不正な post に対して正常なページを返す必要はないというポリシーからの仕様だそうです。
HTTP リクエストは POST のみ受け付ける
CakePHP では GET 通信 POST 通信にかかわらず URL から HTTP リクエストを受け取るコントローラとアクションを決定します。
もし POST 通信のみ受け取りたい場合はコントローラ内に次のように書きます。
// /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 データを検知してブロックする機能があります。
使用するためには、まずコントローラで次のように書きます。
// /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"> "/samples/action" はサンプルです <!-- 後略 -->
…と書いてある部分を…
<!-- 前略 -->
$html->formTag("/samples/action", "post");
<!-- 後略 -->…とします。
これにより、正しい post データは以前と変わらず処理しますが、トークンを含まない、あるいはトークンの内容が不正な post はブロックされます。
ブロックされた際に空白のページが出力される点に注意してください。これは不正な post に対して正常なページを返す必要はないというポリシーからの仕様だそうです。
« 「チュートリアル - scaffolding からソースコードへ」へ | トップへ | 上の階層へ | 「HTTP リクエストに対する CakePHP の動作フロー」へ »
