資料過濾

第一節

程式中使用Sanitize

Cake內建的Sanitize類別是用來防止使用者傳送惡意攻擊資料或其他不想要的資料。 Sanitize是核心函式庫的一部分,所以可以在程式中任何一個地方使用,但最好是在controller或model裡使用。

// 首先,把核心函式庫包含進來:
uses('sanitize');
// 接下來,建立Sanitize物件:
$mrClean = new Sanitize();
// 從這裡開始就可以使用Sanitize清除資料
// (下節會介紹Sanitize類別中可以使用的方法)

第二節

讓資料安全地在SQL和HTML裡使用

這一節會說明如何使用Sanitize類別所提供的一些函式。

  • paranoid
  • string $string
  • array $allowedChars

此函式會將$string裡非文字的資料去除。 然而,你也可以把想要保留的字元放在$allowedChars陣列裡。

$badString = ";:<script><html><   // >@@#";
echo $mrClean->paranoid($badString);
// 輸出: scripthtml
echo $mrClean->paranoid($badString, array(' ', '@'));
// 輸出: scripthtml    @@
  • html
  • string $string
  • boolean $remove = false

這函式幫你將使用者提交的HTML資料以純文字的模式直接顯示在既存的HTML layout上。 當不想讓使用者破壞你的layout或在blog的文章內插入影像或script時特別有用。 如果$remove設成true,所有的HTML標籤都會被刪除,而不是直接把HTML檔字串看列印。

$badString = '<font color="#FF0000">HEY</font>';
echo $badString;
//輸出:HEY
echo $mrClean->html($badString);
// 輸出: <font color="#FF0000">HEY</font>
echo $mrClean->html($badString, true);
// 輸出: font color=#FF0000 HEY font
  • sql
  • string $string

將SQL指令脫逸(加上斜線),讓SQL指令被指為一般文字處理。 處理方法依系統magic_quotes_gpc 變數的設定值決定。

  • cleanArray
  • array @$dirtyArray

這個函式的功能十分強大,是個多功能的清理器,可以用於整個陣列上(如$this->params['form'])。 這函式傳入一個陣列,然後將它清理一翻:沒有傳回值,因為直接傳入參照。 下面的清理動作會作用在陣列內每個元素上(遞迴):

  1. 奇怪的空格(包含0xCA)會被用一般的空格取代

  2. HTML字串會被用正確的HTML標籤取代(如\n 換成 <br>).

  3. 再次檢查特殊字元,移除換行字元,增進SQL的安全性。

  4. 為SQL指令加上斜線(和上頭的sql函式一樣)。

  5. 把使用者輸入的反斜線換成可信任的反斜線。


附錄:讀者筆記