如何快速验证 CodeIgniter 中的 GET
或POST
变量是否既设置又数字,以用作视图中的错误或状态消息?
每次我想检查变量时都做这样的事情是非常乏味的:
if ($this->input->get('error', True)) {
if (is_numeric($this->input->get('error', True))) {
$data['error'] = $this->input->get('error', True);
}
}
get_numeric_input() for CodeIgniter
mixed 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']
既是 set 又是数字,则会将$data['error']
设置为该值。如果未设置和/或未设置数字,它将终止脚本。
示例 2:
function index() {
if ($error = $this->input->get_numeric_input('error', False, "POST", True)) {
$data['error'] = $error;
}
}
在此示例中,如果$_POST['error']
既是已设置又是数字,则会$data['error']
设置为该值。如果未设置和/或不是数字,则它将继续,并且不会在$data数组中设置任何值。
第一个参数是要检查的变量名称。第二个变量是使检查是否需要的布尔值。如果将此设置为 TRUE,则如果未设置变量或不是数字,则将显示错误并立即终止脚本。如果设置为 False,那么它将简单地返回 False,脚本将继续。第三个变量是 POST 或 GET,它将确定函数是在 $_GET 还是 $_POST 数组中查找变量。最后,第四个变量指示返回时是否会XSS_CLEAN值。
注意:第二个、第三个和第四个参数都是可选的,分别默认为 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;
}
}
}
}
一种可能的替代方法是扩展表单验证,以便您也有一种方法来验证 $_GET。使用表单验证库确实可以节省时间(建议使用扩展版本 - 适合您的需求)。CodeIgniter 验证:可以验证 GET 查询字符串吗?谈论这个。
只需使用中间变量,即可获得简短而快速的代码:
$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源中的任何位置显示或包含的数据,都需要过滤。
- 对于这种情况,我们已经确保输入只能包含数字,因此我们是安全的。