Php 简明教程
PHP – Filters
重要的是,在 PHP 应用程序中处理之前,验证以客户端请求的形式接收的输入数据。为了执行输入验证,PHP 中的 filter 扩展程序提供了一些 filter 函数,并由预定义的 filter 常量和标志支持。PHP 库的 filter 扩展程序还有助于通过 GET 或 POST 方法净化接收的输入。
filter 扩展程序是一项强大的功能,有助于防止安全漏洞,例如 SQL 注入和跨站脚本攻击。扩展程序有两种类型的过滤器 −
Validation Filters
验证过滤器检查数据是否符合某些标准。例如,您想确保用户正确地输入了 HTML 表单中的电子邮件字段。FILTER_VALIDATE_EMAIL 将确定数据是否有效的电子邮件地址。但是,验证过滤器不会更改数据本身。
Sanitization Filters
清理是指从输入中删除不需要的字符的过程。因此,它可以通过删除不需要的字符来更改数据。例如,传入 FILTER_SANITIZE_EMAIL 将删除不适合包含在电子邮件地址中的字符,而不会执行验证。
Filter Flags
PHP 中的 filter 扩展程序定义了许多 filter flags 如下所示 −
Sr.No |
ID & Description |
1 |
FILTER_FLAG_STRIP_LOW 移除数值 <32 的字符。 |
2 |
FILTER_FLAG_STRIP_HIGH 移除数值 >127 的字符。 |
3 |
FILTER_FLAG_STRIP_BACKTICK Strips backtick characters. |
4 |
FILTER_FLAG_ALLOW_FRACTION 允许数字中使用句点 (.) 作为小数分隔符。 |
5 |
FILTER_FLAG_ALLOW_THOUSAND 允许数字中使用逗号 (,) 作为千分位分隔符。 |
6 |
FILTER_FLAG_ALLOW_SCIENTIFIC 允许在数字中使用 e 或 E 表示科学记数法。 |
7 |
FILTER_FLAG_NO_ENCODE_QUOTES 如果存在此标志,则单引号 (') 和双引号 (") 将不会被编码。 |
8 |
FILTER_FLAG_ENCODE_LOW 编码数值 <32 的所有字符。 |
9 |
FILTER_FLAG_ENCODE_HIGH 编码数值 >127 的所有字符。 |
10 |
FILTER_FLAG_ENCODE_AMP Encodes ampersands (&). |
11 |
FILTER_NULL_ON_FAILURE 对于无法识别的值,返回 null 。 |
12 |
FILTER_FLAG_ALLOW_OCTAL 将以零 (0) 开头的输入视为八进制数。 |
13 |
FILTER_FLAG_ALLOW_HEX 将以 0x 或 0X 开头的输入视为十六进制数。 |
14 |
FILTER_FLAG_EMAIL_UNICODE 允许电子邮件地址的本地部分包含 Unicode 字符。 |
15 |
FILTER_FLAG_IPV4 允许 IP 地址采用 IPv4 格式。 |
16 |
FILTER_FLAG_IPV6 允许 IP 地址采用 IPv6 格式。 |
17 |
FILTER_FLAG_NO_PRIV_RANGE 验证以下专用 IPv4 范围时失败:10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。 |
18 |
FILTER_FLAG_NO_RES_RANGE 验证以下保留 IPv4 范围时失败:0.0.0.0/8、169.254.0.0/16、127.0.0.0/8 和 240.0.0.0/4 验证以下保留 IPv6 范围时失败:::1/128、::/128、::ffff:0:0/96 和 fe80::/10。 |
19 |
FILTER_FLAG_GLOBAL_RANGE 验证非全局 IPv4/IPv6 范围时失败 |
20 |
FILTER_FLAG_SCHEME_REQUIRED 要求 URL 包含方案部分。 |
21 |
FILTER_FLAG_HOST_REQUIRED 要求 URL 包含主机部分。 |
22 |
FILTER_FLAG_PATH_REQUIRED 要求 URL 包含路径部分。 |
23 |
FILTER_FLAG_QUERY_REQUIRED 要求 URL 包含查询字符串。 |
24 |
FILTER_REQUIRE_SCALAR 要求该值是标量类型。 |
25 |
FILTER_REQUIRE_ARRAY 要求该值是数组。 |
26 |
FILTER_FORCE_ARRAY 如果该值是标量类型,则它将被视为数组,其标量值作为唯一的元素。 |
Filter Functions
过滤器扩展包括以下内容: filter functions −
Sr.No |
ID & Description |
1 |
filter_has_var() 检查是否存在指定类型的变量 |
2 |
filter_id() 返回属于命名过滤器的过滤器 ID |
3 |
filter_input_array() 获取外部变量并可以选择对其进行筛选 |
4 |
filter_input () 按名称获取特定外部变量并对其进行筛选 |
5 |
filter_list() 返回所有受支持过滤器列表 |
6 |
filter_var_array() 获取多个变量并可以选择对其进行筛选 |
7 |
filter_var() 使用指定过滤器筛选变量 |
Predefined Constants
以上函数使用一个名为 input_type 的参数,它是用来表示向 PHP 脚本提供输入用于筛选目的的预定义枚举常量之一。
Constant |
Types |
INPUT_POST (int) |
POST Variables |
INPUT_GET (int) |
GET Variables |
INPUT_COOKIE (int) |
COOKIE Variables |
INPUT_ENV (int) |
ENV Variables |
INPUT_SERVER (int) |
SERVER Variables |
INPUT_SESSION (int) |
SESSION Variables |
INPUT_REQUEST (int) |
REQUEST Variables |
filter_has_var() function
filter_has_var() 函数检查指定类型变量是否存在。
filter_has_var(int $input_type, string $var_name): bool
input_type 是预定义常量之一,如 INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER 或 INPUT_ENV;var_name 参数是用于检查的变量名称。该函数在成功时返回 true,失败时返回 false。
filter_input() function
filter_input() 函数通过名称获取特定外部变量并根据应用的过滤器常量过滤它
filter_input(
int $type,
string $var_name,
int $filter = FILTER_DEFAULT,
array|int $options = 0
): mixed
type 参数是常量之一,如 INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER 或 INPUT_ENV。第二个参数是 var_name,这是用于获取的变量名称。你可以使用要应用的过滤器。使用任何预定义筛选标志。如果省略,则使用 FILTER_DEFAULT
该函数在成功时返回所请求变量的值,如果过滤器失败则返回 false,如果未设置 var_name 变量则返回 null。
Example
请看以下示例:
<?php
if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) {
echo("Email is not valid");
} else {
echo("Email is valid");
}
?>
它将生成以下 output −
如果你使用 URL http://localhost/hello.php?email= abc@example.com ,
Email is valid
如果 URL 为 http://localhost/hello.php?email=a b c@example.com ,
Email is not valid
你还可以针对通过 POST 方法接收的输入使用 INPUT_POST 类型 −
<?php
if (!filter_input(INPUT_POST, "email", FILTER_VALIDATE_EMAIL)) {
echo("Email is not valid");
} else {
echo("Email is valid");
}
?>
要使用 POST 请求传递数据,打开命令提示符,并使用以下 CURL 命令
curl -X POST -d "{\"email\": \"a@b.com\"}" http://localhost/hello.php
filter_list() function
filter_list() 函数返回所有受支持的过滤器的列表
filter_list(): array
Example
该函数返回所有受支持的过滤器的名称数组,如果没有这样的过滤器,则返回空数组。
<?php
print_r(filter_list());
?>
它将生成以下 output −
Array
(
[0] => int
[1] => boolean
[2] => float
[3] => validate_regexp
[4] => validate_domain
[5] => validate_url
[6] => validate_email
[7] => validate_ip
[8] => validate_mac
[9] => string
[10] => stripped
[11] => encoded
[12] => special_chars
[13] => full_special_chars
[14] => unsafe_raw
[15] => email
[16] => url
[17] => number_int
[18] => number_float
[19] => add_slashes
[20] => callback
)
filter_input_array() function
filter_input_array() 获取外部变量,并可选地对其进行筛选。
filter_input_array(int $type, array|int $options = FILTER_DEFAULT,
bool $add_empty = true): array|false|null
此函数用于在不重复调用 filter_input() 的情况下检索多个值。
type 参数是 INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER 或 INPUT_ENV 之一。
options 参数是用于定义参数的数组。有效键是包含变量名称的字符串,有效值是过滤器类型或选择性指定过滤器、标志和选项的数组。此参数也可以是用于保存过滤器常量的整数。然后输入数组中的所有值都将通过该过滤器进行筛选。
此函数在成功时返回一个包含请求变量值数组。如果由 type 指定的输入数组未填充,则在未给出 FILTER_NULL_ON_FAILURE 标志的情况下函数返回 null,否则返回 false。对于其他失败,则返回 false。
Example
要在 HTTP 请求中包含数组,我们在“hello.html”中使用以下 HTML 表单,并通过 POST 方法发送。
<!DOCTYPE html>
<html>
<body>
<h1>Filter Input Array</h1>
<form action="hello.php" method="POST">
<p><label for="email">Enter your email:</label>
<input type="text" id="email" name="email"></p>
<p><label for="age">Enter your age<label>
<input type = "text" id="age" name="age"></p>
<input type="submit">
</form>
</body>
</html>
验证输入数组的 PHP 脚本如下所示 −
<?php
$filters = array (
"age" => array ("filter"=>FILTER_VALIDATE_INT,
"options"=>array("min_range"=>20,"max_range"=>40) ),
"email" => FILTER_VALIDATE_EMAIL
);
print_r(filter_input_array(INPUT_POST, $filters));
?>
打开 HTML 表单,并将年龄填为 30, * abc@example.com* 作为电子邮件,结果将是一个数组,验证这两个输入 −
Array ( [age] => 30 [email] => abc@example.com )
尝试给出无效的输入,如“age=15”。输出数组将显示 age 密钥的 null 值
Array ( [age] => [email] => abc@example.com )