PHPセキュリティ対策:正規化した数値を取り出す

(1/1)
HTML FORM でユーザーが入力した値を GET や POST 変数で取り出すことは、よく行われる。
だが、インターネットの向こう側にいる人物はどんな値を入力してくるか分からない。中には悪意をもってとんでもない値を入力する者もいる。
こうしたイレギュラーな入力からプログラムを守るため、入力された値にバリデーションチェックを行い、正規化した値を取り出す必要がある。
そこで今回は、入力された値が数値(整数または浮動小数)である場合に有効な正規化関数を作ってみることにした。

サンプル・プログラム

テキストボックスに値を入力し、[送信] ボタンを押下する。
値は GET で渡され、-10 以上100 以下の整数に正規化され、表示される。

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説:GETまたはPOSTから値を取り出す

0012: /**
0013:  * $_GET または $_POST から値を取り出す
0014:  * @param string $key キー
0015:  * @return mixed 取得値/NULL:エラー
0016: */
0017: function getParam($key) {
0018:     $res = NULL;
0019:     if (isset($_GET[$key]))         $res = $_GET[$key];
0020:     else if (isset($_POST[$key]))   $res = $_POST[$key];
0021:     return $res;
0022: }

まず、GET または POST で渡された値を取り出すユーザー関数 getParam を用意する。
たとえば、$_POST['sour'] で渡された値は、getParam('sour') で取り出すことができる。
space

サンプル・プログラムの解説:正規化した数値を取り出す

0024: /**
0025:  * $_GET または $_POST から正規化した数値を取り出す
0026:  * @param string $type int:整数 float:浮動小数
0027:  * @param string $key キー
0028:  * @param mixed $min, $max 最小値、最大値
0029:  * @param string $errmsg エラーメッセージを格納する
0030:  * @return mixed 取得値/NULL:エラー
0031: */
0032: function getValidNumber($type$key$min$max, &$errmsg) {
0033:     //整数かどうか
0034:     if (preg_match("/int/i", $type) != 0) {
0035:         $flag_int = TRUE;
0036:         $format = "%d";
0037:     } else {
0038:         $flag_int = FALSE;
0039:         $format = "%f";
0040:     }
0041: 
0042:     $errmsg = '';
0043:     $res = NULL;
0044:     //引数チェック
0045:     if ($min > $max) {
0046:         $errmsg = sprintf("最小値({$format})が最大値({$format})より大きい.", $min$max);
0047: 
0048:     //値の取り出し
0049:     } else {
0050:         $res = getParam($key);
0051:         if ($res == '' || $res == NULL) {
0052:             $errmsg = "値がない.";
0053:             $res = NULL;
0054:         } else if (! is_numeric($res)) {
0055:             $errmsg = "数値ではない.";
0056:             $res = NULL;
0057:         } else {
0058:             if ($flag_int)  $res = round($res);      //整数に丸める
0059:             //最大値・最小値チェック
0060:             if ($res > $max) {
0061:                 $errmsg = sprintf("最大値({$format})より大きい.", $max);
0062:                 $res = NULL;
0063:             } else if ($res < $min) {
0064:                 $errmsg = sprintf("最小値({$format})より小さい.", $min);
0065:                 $res = NULL;
0066:             }
0067:         }
0068:     }
0069:     return $res;
0070: }

ユーザー関数 getParam で取り出した値は整数または浮動小数とみなし、正規化するのがユーザー関数 getValidNumber である。
ここで行う正規化処理は下記の通り。
  1. 整数として扱うかどうかを確認する。
  2. 引数が異常でないか確認する。
  3. 引数として与えられた値があるかどうか確認する。
  4. 引数として与えられた値が数値かどうか確認する。( is_numeric を利用)
  5. 整数の場合、与えられた値を丸める。( round を利用)
  6. 最大値、最小値から逸脱していないかどうか確認する。

space

参考書籍

(この項おわり)
header