0

GETCodeIgniter の変数またはPOST変数が、ビューでエラーまたはステータス メッセージとして使用するために設定され、数値であるかどうかをすばやく検証するにはどうすればよいですか?

変数をチェックするたびに毎回このようなことをするのは非常に面倒です:

if ($this->input->get('error', True)) {
    if (is_numeric($this->input->get('error', True))) {
        $data['error'] = $this->input->get('error', True);
    }
}
4

3 に答える 3

2

CodeIgniter の get_numeric_input()

混合get_numeric_input ( string $name [, bool $required = True [, string $source = "GET" [, bool *$xss_clean* = True ]]] )

以下は、GET 変数と POST 変数が存在し、数値であるかどうかを確認するのにうんざりしていたので作成した関数です。

redirect("original_page.php?error=1");これは、元のページにエラーを渡すために使用できるため、主にエラーまたはステータス メッセージを処理するときに使用されました。元のページではif (isset($error)) { … }、値に応じてメッセージを表示するだけで済みました。ただし、セキュリティ上の理由から、これらの変数をビューに送信する前にチェックする必要がありました。このプロセスは非常に反復的で退屈なものであることが判明しました。

以下のこの関数は、wwwroot/application/system/core/Input.php

次のように使用します。

例 1:

function index() {
   if ($error = $this->input->get_numeric_input('error', True, "GET", True)) {
      $data['error'] = $error;
   }
}

この例で$_GET['error']は、 が設定と数値の両方である場合$data['error']、その値に設定されます。設定されていないか数値でない場合、スクリプトは終了します。

例 2:

function index() {
   if ($error = $this->input->get_numeric_input('error', False, "POST", True)) {
      $data['error'] = $error;
   }
}

この例で$_POST['error']は、 が設定と数値の両方である場合$data['error']、その値に設定されます。設定されていないか数値でない場合は、続行され、$data 配列に値は設定されません。

最初の引数は、チェックする変数名です。2 番目の変数は、チェックが必要かどうかを示すブール値です。これを TRUE に設定すると、変数が設定されていない場合、または変数が数値でない場合、エラーが表示され、スクリプトがすぐに終了します。False に設定すると、単純に False が返され、スクリプトは次に進みます。3 番目の変数は POST または GET のいずれかで、関数が $_GET または $_POST 配列で変数を検索するかどうかを決定します。最後に、4 番目の変数は、返されたときに値が XSS_CLEAN になるかどうかを示しました。

注: 2 番目、3 番目、および 4 番目の引数はいずれもオプションであり、デフォルトはそれぞれ True、"GET"、および True です。

コードは次のとおりです。

function get_numeric_input($name, $required = True, $source = "GET", $xss_clean = True) {
    if ($source === "GET") {
        if ($this->get($name, $xss_clean)) {
            if (is_numeric($this->get($name, $xss_clean))) {
                return $this->get($name, $xss_clean);
            } else {
                if ($required) {
                    show_error("$source variable $name is not numeric!");
                    log_message('error', "$source variable $name is not numeric!");
                    return False;
                } else {
                    return False;
                }
            }
        } else {
            if ($required) {
                show_error("$source variable $name is not set!");
                log_message('error', "$source variable $name is not set!");
                return False;
            } else {
                return False;
            }
        }
    } elseif ($source === "POST") {
        if ($this->post($name, $xss_clean)) {
            if (is_numeric($this->post($name, $xss_clean))) {
                return $this->post($name, $xss_clean);
            } else {
                if ($required) {
                    show_error("$source variable $name is not numeric!");
                    log_message('error', "$source variable $name is not numeric!");
                    return False;
                } else {
                    return False;
                }
            }
        } else {
            if ($required) {
                show_error("$source variable $name is not set!");
                log_message('error', "$source variable $name is not set!");
                return False;
            } else {
                return False;
            }
        }
    }
}
于 2012-08-13T02:59:13.350 に答える
1

短くて速いコードのために、中間変数を使用するだけです:

$input_error = $this->input->get('error');
$data['error'] = ctype_digit($input_error) ? $input_error : FALSE;


本当にワンライナーが必要な場合:

function validate_integer_input($input) {
    return ctype_digit($input) ? $input : FALSE;
}

$data['error'] = validate_integer_input($this->input->get('error'));


  • $data['error']$data常にビューに設定されるため、これは良いことです。そのため、if ($data)代わりにif (isset($data)).
  • GET および POST 入力を処理する場合、タイピングのいくつかの側面を知っておく必要があります。最も重要なこと:
    • もちろん、GET/POST 入力は、設定されている場合は常に文字列型です。
    • ''(空) と'0'文字列のみが FALSE と評価され、他のすべての値は TRUE と評価されます。
    • ctype_digit()は文字列を想定していますが、このコードは FALSE を渡す可能性があります (CI->input から)。しかし、FALSEは空の文字列にキャストされるので問題ありません。


ちなみに、この場合、XSS フィルタリングは必要ありません。

  • XSS フィルタリングはパフォーマンスに大きな影響を与えるため、必要な場合にのみ有効にする必要があります。経験則として、HTML ソースのどこにでも表示または含まれるデータにはフィルタリングが必要です。
  • この場合、入力に数字のみを含めることができることを既に確認しているので、安全です。
于 2012-09-03T06:41:54.017 に答える
1

考えられる代替手段は、フォームの検証を拡張して、$_GET も検証できるようにすることです。フォーム検証ライブラリを使用すると、時間を節約できます (必要に応じた拡張バージョンをお勧めします)。 CodeIgniter 検証: GET クエリ文字列を検証できますか? これについて語っています。

于 2012-08-13T20:06:50.350 に答える