libro
www.tuyano.com
初心者のためのCakePHP2 プログラミング入門

フォーム送信とForm Helper (2/5)

作成:2011-11-07 08:17
更新:2011-11-07 08:17

■サニタイズについて

テキストを入力した値をそのまま画面に表示する場合、注意しないといけないのが「サニタイズ」です。悪質なスクリプトなどがテキストとして送信された時のために、問題あるタグなどを無効化しておきます。

このサニタイズは、CakePHP2.0にライブラリとして用意されています。「Sanitize」という名前のクラスです。これを利用する場合、以下のようにして読み込みをしておきます。
App::uses('Sanitize', 'Utility');
サニタイズの方法は、クラスにいくつものメソッドとして用意されていますが、とりあえずは「怪しいものは全部無効化する」のがよいでしょう。下に、先ほどのサンプルの修正をあげておきました。サニタイズを行なっているのがこの部分です。
$this -> set("text1", Sanitize::stripAll($text1));
Sanitize::stripAllは、引数に渡したテキストからホワイトスペース、スクリプト、イメージ、スタイルシートなどの情報を全て取り除いて無効化します。とりあえず、これだけ覚えておけば、送信されたテキストを安全に扱えるでしょう。

●サニタイズのタイミング
ここでは、サニタイズは<input type="text">の値のみ行なっていますが、ユーザーから送信されたナマのテキストをそのまま画面に表示するような場合は、常にサニタイズすると考えたほうが良いでしょう。

またサニタイズのタイミングは、値を取り出した時ではなく、「出力する直前」に行う、と考えるとよいでしょう。受け取ってすぐに加工してしまうと、その後の扱いで問題を起こす可能性もあります。なるべくデータはナマのまま保持し、それを利用する際に最適な形に加工する、と考えてください。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※SampleController.php 修正

<?php
App::uses('AppController', 'Controller');
App::uses('Sanitize', 'Utility');

class SampleController extends AppController {

  public function index() {}

  public function form() {
    $text1 = $this -> data["text1"];
    $check1 = isset($this -> data["check1"]) ? 
      "On" : "Off";
    $radio1 = $this -> data["radio1"];
    $this -> set("text1", Sanitize::stripAll($text1)); //★
    $this -> set("check1", $check1);
    $this -> set("radio1", $radio1);
  }

}
※関連コンテンツ

「初心者のためのCakePHP2 プログラミング入門」に戻る