- PHP 教程
- PHP - 首页
- PHP - 简介
- PHP - 安装
- PHP - 历史
- PHP - 特性
- PHP - 语法
- PHP - Hello World
- PHP - 注释
- PHP - 变量
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 变量
- PHP - 常量
- PHP - 魔术常量
- PHP - 数据类型
- PHP - 类型转换
- PHP - 类型混杂
- PHP - 字符串
- PHP - 布尔值
- PHP - 整数
- PHP - 文件与I/O
- PHP - 数学函数
- PHP - Heredoc & Nowdoc
- PHP - 复合类型
- PHP - 文件包含
- PHP - 日期与时间
- PHP - 标量类型声明
- PHP - 返回类型声明
- PHP 运算符
- PHP - 运算符
- PHP - 算术运算符
- PHP - 比较运算符
- PHP - 逻辑运算符
- PHP - 赋值运算符
- PHP - 字符串运算符
- PHP - 数组运算符
- PHP - 条件运算符
- PHP - 展开运算符
- PHP - 空值合并运算符
- PHP - 比较运算符(飞船运算符)
- PHP 控制语句
- PHP - 决策
- PHP - If…Else 语句
- PHP - Switch 语句
- PHP - 循环类型
- PHP - For 循环
- PHP - Foreach 循环
- PHP - While 循环
- PHP - Do…While 循环
- PHP - Break 语句
- PHP - Continue 语句
- PHP 函数
- PHP - 函数
- PHP - 函数参数
- PHP - 按值传递
- PHP - 按引用传递
- PHP - 默认参数
- PHP - 具名参数
- PHP - 可变参数
- PHP - 返回值
- PHP - 传递函数
- PHP - 递归函数
- PHP - 类型提示
- PHP - 变量作用域
- PHP - 严格类型
- PHP - 匿名函数
- PHP - 箭头函数
- PHP - 可变函数
- PHP - 局部变量
- PHP - 全局变量
- PHP 超全局变量
- PHP - 超全局变量
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 文件处理
- PHP - 文件处理
- PHP - 打开文件
- PHP - 读取文件
- PHP - 写入文件
- PHP - 文件是否存在
- PHP - 下载文件
- PHP - 复制文件
- PHP - 追加文件
- PHP - 删除文件
- PHP - 处理CSV文件
- PHP - 文件权限
- PHP - 创建目录
- PHP - 列出文件
- 面向对象的PHP
- PHP - 面向对象编程
- PHP - 类和对象
- PHP - 构造函数和析构函数
- PHP - 访问修饰符
- PHP - 继承
- PHP - 类常量
- PHP - 抽象类
- PHP - 接口
- PHP - 特性
- PHP - 静态方法
- PHP - 静态属性
- PHP - 命名空间
- PHP - 对象迭代
- PHP - 封装
- PHP - final 关键字
- PHP - 重载
- PHP - 克隆对象
- PHP - 匿名类
- PHP Web开发
- PHP - Web 概念
- PHP - 表单处理
- PHP - 表单验证
- PHP - 表单邮件/URL
- PHP - 完整表单
- PHP - 文件包含
- PHP - GET & POST
- PHP - 文件上传
- PHP - Cookie
- PHP - Session
- PHP - Session 选项
- PHP - 发送邮件
- PHP - 输入过滤
- PHP - Post-Redirect-Get (PRG)
- PHP - Flash 消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 代码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - Bug 调试
- PHP - 针对C语言开发者
- PHP - 针对PERL语言开发者
- PHP - 框架
- PHP - Core PHP vs 框架
- PHP - 设计模式
- PHP - 过滤器
- PHP - JSON
- PHP - 异常
- PHP - 特殊类型
- PHP - 哈希
- PHP - 加密
- PHP - is_null() 函数
- PHP - 系统调用
- PHP - HTTP 认证
- PHP - 交换变量
- PHP - Closure::call()
- PHP - 过滤后的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 期望值
- PHP - use 语句
- PHP - 整数除法
- PHP - 已弃用的特性
- PHP - 已移除的扩展和SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 进程
- PHP - PDO 扩展
- PHP - 内置函数
- PHP 有用资源
- PHP - 速查表
- PHP - 问答
- PHP - 快速指南
- PHP - 在线编译器
- PHP - 有用资源
- PHP - 讨论
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] )