|
变量过滤器
数据来源 |
描述 |
表单 |
来自表单的用户输入数据 |
cookies |
来自浏览器的 cookie |
服务器变量 |
防止伪装的合法访问 |
web 服务数据 |
web 请求数据 |
数据库查询结果 |
数据表中的数据并不可信 |
函数 |
描述 |
filter_list() |
|
filter_id() |
|
filter_var() |
过滤单个变量 |
filter_var_array() |
过滤多个变量 |
filter_has_var() |
检测是否存在某个外部变量 |
filter_input() |
过滤单个外部变量 |
filter_input_array() |
过滤多个外部变量 |
1 验证过滤器常量
- 验证过滤器:又叫“验证器”,主要用于数据的类型和格式验证
过滤器函数 |
描述 |
FILTER_VALIDATE_INT |
验证整数 |
FILTER_VALIDATE_FLOAT |
验证浮点 |
FILTER_VALIDATE_BOOLEAN |
验证布尔项 |
FILTER_VALIDATE_EMAIL |
验证邮箱 |
FILTER_VALIDATE_URL |
验证 URL 地址 |
FILTER_VALIDATE_IP |
验证 IP 地址 |
FILTER_VALIDATE_REGEXP |
正则验证 |
-
FILTER_VALIDATE_BOOLEAN : 布尔选项的返回值类型 |
序号 |
返回值 |
描述 |
1 |
true |
"1", "true", "on" 和 "yes" |
2 |
false |
"0", "false", "off", "no", "" |
3 |
null |
除以上情形外 |
2 清理过滤器常量
序号 |
过滤器函数 |
描述 |
1 |
FILTER_UNSAFE_RAW |
保持原始数据 |
2 |
FILTER CALLBACK |
自定义函数过滤数据 |
3 |
FILTER_SANITIZE_STRING |
去除标签以及特殊字符:strip_tags() |
4 |
FILTER_SANITIZE_STRIPPED |
"string" 过滤器别名 |
5 |
FILTER_SANITIZE_ENCODED |
URL-encode 字符串,去除或编码特殊字符 |
6 |
FILTER_SANITIZE_SPECIAL_CHARS |
HTML 转义字符, 等价于 htmlspecialchars() |
7 |
FILTER_SANITIZE_EMAIL |
仅保留邮箱地址的合法字符 |
8 |
FILTER_SANITIZE_URL |
仅保留合法的 URL, 必须从协议开始http/https |
9 |
FILTER_SANITIZE_NUMBER_INT |
仅保留合法的数字和正负号+- |
10 |
FILTER_SANITIZE_NUMBER_FLOAT |
仅保留合法的数字和正负号+- 以及指数 .,eE |
11 |
FILTER_SANITIZE_MAGIC_QUOTES |
等价于函数: addslashes() |
3 选项与标志
- 可以对过滤器设置选项和标志, 对数据进行更加精准的过滤处理
- 选项与标志使用数组键名表示:
'options'=>[...], 'flags'=>... (复数)
- 举例:
filter_var($int, FILTER_VALIDATE_INT, ['options'=>['min_range'=>10,'max_range'=>80]]);
// FILTER_REQUIRE_SCALAR: 必须是标量(即单值数据,如字符串,数值,布尔, 不能是数组或对象)
filter_var($data, FILTER_VALIDATE_EMAIL, ['flags'=>FILTER_REQUIRE_SCALAR]);
示例代码: demo11.php
# 变量过滤器
// filter_list(): 查看支持的所有过滤器
// filter_id(): 返回过滤器常量对应的ID
foreach (filter_list() as $filter) {
// echo $filter . ' => ' . filter_id($filter) . '<br>';
}
echo '<hr>';
// 1. filter_var(): 过滤单个变量
$age = 30;
var_dump(filter_var($age, FILTER_VALIDATE_INT));
// 验证时,会将变量值转为字符串类型, 所以这样写也对
$age = '30';
var_dump(filter_var($age, FILTER_VALIDATE_INT));
echo '<br>';
// 还可以添加第三个参数,对过滤器行为进行限定
// 被过滤的数据也支持字面量,但不推荐这样
var_dump(filter_var(10, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));
$age = 40;
var_dump(filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));
echo '<br>';
// 既可以使用过滤器常量,也可以使用过滤器ID
$email = 'admin@php.cn';
// 过滤器常量
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
echo '<br>';
// 过滤器ID
var_dump(filter_var($email, 274));
echo '<br>';
var_dump(filter_var('peter@qq.com', 274));
echo '<br>';
// 2. filter_var_array():过滤多个变量
$a = 10;
$b = 'php';
// 返回值是数组, 验证失败返回false,成功返回原值
var_dump(filter_var_array([$a, $b], FILTER_VALIDATE_INT));
echo '<br>';
// 对于多变量验证最好将数组放在数组中统一处理
$data = [$a, $b, 'html', [6, 7, 8], 150, 200];
var_dump(filter_var_array($data, FILTER_VALIDATE_INT));
// 过滤掉验证未通过的元素
var_dump(array_filter(filter_var_array($data, FILTER_VALIDATE_INT)));
echo '<hr>';
// 3. filter_has_var(): 检测是否存在指定类型的外部变量
// 变量类型仅限:INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
var_dump(filter_has_var(INPUT_GET, 'id'));
echo '<br>';
//4. filter_input(): 通过名称获取特定的外部变量,并且可以通过过滤器处理它
// 变量类型仅限:INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
// false:验证失败, null: 变量不存在, 成功返回当前值
// $_GET['id'] 必须是大于1的整数
$res = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
var_dump($res);
echo '<hr>';
// 5. filter_input_array(): 同时验证多个外部变量
// 为一组数据应用统一过滤器
var_dump(filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING));
// 为每一个元素应用不同的过滤器
// 设置变量对应过滤器
$args = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
'blog' => FILTER_VALIDATE_URL,
];
// 非法: demo11.php?username=<a>admin</a>&email=abc&age=15&blog=blog.php.cn
// 合法: demo11.php?username=admin&email=abc@qq.com&age=25&blog=http://blog.php.cn
var_dump(filter_input_array(INPUT_GET, $args));
|
|