サンプル・プログラムの実行例
サンプル・プログラム
| getValidString1.php | サンプル・プログラム本体。 |
| pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
解説:入力要件など
getValidString1.php
40: //表示幅(ピクセル)
41: define('WIDTH', 600);
42:
43: //入力要件
44: $InputRequirements = array(
45: //オブジェクト名, ラベル名, 最小長, 最大長, 排除パターンかどうか, マッチングパターン
46: array('id', 'ID', 1, 10, FALSE, array('/^[0-9]+$/')),
47: array('kana', 'カナ氏名', 1, 30, FALSE, array('/^[ァ-ヶ]+$/ui')),
48: array('name', '氏名', 1, 20, FALSE, array('/^[A-Zぁ-んァ-ヶー一-龠]+$/ui')),
49: );
50:
51: /**
- 最小長‥‥入力を許容する文字列の最小長。マルチバイト文字も1文字と数える。
- 最大長‥‥入力を許容する文字列の最大長。マルチバイト文字も1文字と数える。
- 排除パターンかどうか‥‥つづくマッチングパターン配列が、そのパターンにマッチする文字列を排除したいときはTRUEを、受容したいときはFALSEを指定する。
- マッチングパターン配列
サンプル・プログラムでは、ID、カナ氏名、氏名の3つの入力項目を用意し、それぞれに入力要件を設定した。これを配列 $InputRequirements に定義してある。
入力要件は次の通り。
- ID‥‥1文字以上、10文字以下、数字のみ
- カナ氏名‥‥1文字以上、30文字以下、全角カタカナのみ
- 氏名‥‥1文字以上、20文字以下、全角英字・ひらがな・カタカナ・漢字のみ
解説:文字列バリデーション
pahooInputData.php
412: /**
413: * 文字列バリデーションを行う.
414: * filter_input()関数および $argv を参照する.
415: * 文字列の最小長,最大長,排除または受容するパターンを指定する.
416: * @参考URL https://www.pahoo.org/e-soul/webtech/phpsec/phpsec-10-01.shtm
417: * @param string $data バリデーションしたい文字列
418: * @param string $errmsg エラーメッセージを格納する
419: * @param int $minlen 入力可能な最小長(省略時=1)
420: * @param int $maxlen 入力可能な最大長(省略時=99)
421: * @param bool $exclusion $patternsはTRUE:受容/FALSE:排除(省略時=TRUE)
422: * @param array $patterns 受容/排除するパターンマッチ配列(省略時=NULL)
423: * @return bool TRUE:成功/FALSE:失敗
424: */
425: function validString($data, &$errmsg, $minlen=1, $maxlen=99, $exclusion=TRUE, $patterns=NULL) {
426: $res = TRUE;
427: $errsg = '';
428:
429: // 引数チェック
430: if ($minlen > $maxlen) {
431: $errmsg = "最小長({$minlen})が最大長({$maxlen})より大きい";
432: $res = FALSE;
433:
434: // 文字列バリデーション
435: } else {
436: // 値の存否
437: if ($data == '' || $data == NULL) {
438: $errmsg = '値がありません';
439: $res = FALSE;
440: // 最小長チェック
441: } else if (mb_strlen($data) < $minlen) {
442: $errmsg = sprintf("最小長(%d)より短い", $minlen);
443: $res = FALSE;
444: // 最大長チェック
445: } else if (mb_strlen($data) > $maxlen) {
446: $errmsg = sprintf("最大長(%d)より長い", $maxlen);
447: $res = FALSE;
448: // 受容パターンのチェック
449: } else if ($exclusion && ($patterns != NULL)) {
450: foreach ($patterns as $pat) {
451: if (preg_match($pat, $data) == 0) {
452: $errmsg = '受容できない文字が含まれています';
453: $res = FALSE;
454: break;
455: }
456: }
457: // 排除パターンのチェック
458: } else if (!$exclusion && ($patterns != NULL)) {
459: foreach ($patterns as $pat) {
460: if (preg_match($pat, $data) > 0) {
461: $errmsg = '受容できない文字が含まれています';
462: $res = FALSE;
463: break;
464: }
465: }
466: }
467: }
468: return $res;
469: }
まず、引数 $minlen と $maxlen の大小関係に矛盾がないかどうかをチェックする。
次に文字列バリデーションを行うが、下記の順序でバリデーションを行う。
- 値は存在するか(空文字ではないか)
- 最小長と最大長の範囲にあるか
- $exclusionが受容なら、配列 $patterns の要素1つずつにマッチングさせ、受容できない文字が含まれているかどうかチェックする
- $exclusionが排除なら、配列 $patterns の要素1つずつにマッチングさせ、受容できない文字が含まれているかどうかチェックする
解説:バリデーション付き文字列取得
pahooInputData.php
510: /**
511: * HTML FORMで指定したINPUTの内容を文字列として取り出す(バリデーション付き)
512: * filter_input()関数および $argv を参照する.
513: * @参考URL https://www.pahoo.org/e-soul/webtech/phpsec/phpsec-10-01.shtm
514: * @param string $key パラメータ名(省略不可)
515: * @param string $errmsg エラーメッセージを格納する(省略不可)
516: * @param mixed $def 初期値(省略時:空文字)
517: * @param int $minlen 入力可能な最小長(省略時=1)
518: * @param int $maxlen 入力可能な最大長(省略時=99)
519: * @param bool $exclusion $patternsはTRUE:受容/FALSE:排除(省略時=TRUE)
520: * @param array $patterns 受容/排除するパターンマッチ配列(省略時=NULL)
521: * @return string 入力値
522: */
523: function getValidString($key, &$errmsg, $def='', $minlen=1, $maxlen=99, $exclusion=TRUE, $patterns=NULL) {
524: $data = (string)getParam($key, TRUE, $def); // URLパラメータを取り出す
525: $str = trim($data); // 先頭・末尾の空白文字を除く
526: $str = htmlspecialchars($str); // XSS対策
527: // 文字列バリデーション
528: if ($str != '') {
529: $res = validString($data, $errmsg, $minlen, $maxlen, $exclusion, $patterns);
530: }
531:
532: return $str;
533: }
HTML FORMからデータを取り出すユーザー関数 getParam については、「PHPでGET/POSTでフォームから値を受け取る」を参照いただきたい。
次に、取り出したデータの先頭、末尾の空白文字を組み込み関数 trim によって取り除く。
さらに、組み込み関数 htmlspecialchars を使って特殊文字をエスケープしておく。これはクロスサイトスクリプティング(XSS)対策のためである。
最後に、ユーザー関数 validString を使ってバリデーションを行う。
バリデーションの成否にかかわらず、入力データは、先頭・末尾の空白を取り除き、特殊文字をエスケープした状態で、戻り値とする。バリデーションで問題が発生した場合は $errmsg にエラーメッセージが入る仕組みである。
解説:メインプログラム
getValidNumber.php
194: // メイン・プログラム ======================================================
195: //パラメータ
196: $errmsg = '';
197: $num = getValidNumber('num', $errmsg, '', CLASS_INT, NUM_MIN, NUM_MAX);
198:
199: //リセット
200: if (isButton('reset')) {
201: $num = '';
202: }
203:
204: //表示HTML作成
205: $HtmlBody = makeCommonBody($num, $errmsg);
206:
207: //表示
208: echo $HtmlHeader;
209: echo $HtmlBody;
210: echo $HtmlFooter;
入力項目の各々について、ユーザー関数 getValidString を使って、バリデーション付きで数値取り出しを行い、それを画面に表示する。
参考サイト
- PHPでGET/POSTでフォームから値を受け取る:ぱふぅ家のホームページ
- PHPセキュリティ対策:数値入力とバリデーション:ぱふぅ家のホームページ

(2022年6月27日)FastCGIで正常動作しない不具合を修正
(2022年5月18日)大幅改訂,pahooInputData.php分離,PHP8対応