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。

Example

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

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

它将生成以下 output

Email found

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

Email is valid
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 )