PHP – 过滤器



在PHP应用程序中处理客户端请求接收到的输入数据之前,进行数据验证非常重要。为了执行输入验证,PHP中的filter扩展提供了许多filter函数,并由预定义的filter常量和标志支持。PHP库的filter扩展还有助于清理通过GET或POST方法接收到的输入。

filter扩展是一个强大的功能,有助于防止安全漏洞,例如SQL注入和跨站点脚本攻击。此扩展包含两种类型的过滤器:

验证过滤器

验证过滤器检查数据是否满足某些条件。例如,您希望确保用户已在HTML表单中正确输入电子邮件字段。FILTER_VALIDATE_EMAIL将确定数据是否是有效的电子邮件地址。但是,验证过滤器不会更改数据本身。

清理过滤器

清理是指从输入中删除不需要的字符的过程。因此,它可能会通过删除不需要的字符来更改数据。例如,传入FILTER_SANITIZE_EMAIL将删除电子邮件地址中不应包含的不合适的字符,而无需执行验证。

过滤器标志

PHP中的filter扩展定义了许多过滤器标志,如下所示:

序号 ID 和描述
1

FILTER_FLAG_STRIP_LOW

删除数值<32的字符。

2

FILTER_FLAG_STRIP_HIGH

删除数值>127的字符。

3

FILTER_FLAG_STRIP_BACKTICK

删除反引号字符。

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

编码和号(&)。

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扩展包含以下过滤器函数

序号 ID 和描述
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()

使用指定的过滤器过滤变量

预定义常量

以上函数使用一个名为 input_type 的参数,该参数是预定义的枚举常量之一,表示输入是如何被提供给 PHP 脚本进行过滤的。

常量 类型
INPUT_POST (int)

POST 变量

INPUT_GET (int)

GET 变量

INPUT_COOKIE (int)

COOKIE 变量

INPUT_ENV (int)

ENV 变量

INPUT_SERVER (int) SERVER 变量
INPUT_SESSION (int) SESSION 变量
INPUT_REQUEST (int) REQUEST 变量

filter_has_var() 函数

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。

示例

在 XAMPP 服务器上访问以下 PHP 脚本。

<?php
   if (!filter_has_var(INPUT_GET, "email")) {
      echo("Email not found");
   } else {
      echo("Email found");
   }
?>

它将产生以下 **输出** −

访问 **https://127.0.0.1/[email protected]**

Email found

filter_input() 函数

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。

示例

请看下面的例子 −

<?php
   if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) {
      echo("Email is not valid");
   } else {
      echo("Email is valid");
   }
?>

它将产生以下 **输出** −

如果您使用 URL **https://127.0.0.1/[email protected]**,

Email is valid

如果 URL 是 **https://127.0.0.1/hello.php?email=a b [email protected]**,

Email is not valid

您也可以使用 INPUT_POST 类型来验证通过 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\": \"[email protected]\"}" https://127.0.0.1/hello.php

filter_list() 函数

filter_list() 函数返回所有支持的过滤器的列表。

filter_list(): array

示例

该函数返回所有支持的过滤器的名称数组,如果没有这样的过滤器则返回空数组。

<?php
   print_r(filter_list());
?>

它将产生以下 **输出** −

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() 函数

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 参数是一个定义参数的数组。有效的键是包含变量名称的字符串,有效的 value 或者是过滤器类型,或者是一个数组,可选地指定过滤器、标志和选项。此参数也可以是一个整数,包含一个过滤器常量。然后输入数组中的所有值都将通过此过滤器进行过滤。

该函数在成功时返回一个包含请求变量值的数组。如果由 type 指定的输入数组未填充,则如果未给出 FILTER_NULL_ON_FAILURE 标志,则函数返回 null,否则返回 false。对于其他失败,返回 false。

示例

要在 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 作为年龄,**[email protected]** 作为电子邮件,结果将是一个数组,验证这两个输入 −

Array ( [age] => 30 [email] => [email protected] )

尝试给出无效的输入,例如“age=15”。输出数组将为 **age** 键显示空值。

Array ( [age] => [email] => [email protected] )
广告