在PHP应用开发过程中,用户输入数据是不可信的,直接处理未过滤的输入很容易引发各类安全漏洞,因此掌握PHP输入过滤和安全处理函数是开发者的必备技能。不同的用户输入场景需要匹配不同的过滤方式,从基础的过滤函数到扩展的过滤规则,合理运用才能既保证数据安全又不影响正常业务流转。

PHP内置的输入过滤函数
PHP提供了一系列专门用于输入过滤的函数,其中最常用的是filter_var函数,它支持多种预设的过滤规则,可以快速处理不同类型的输入数据。除了filter_var,还有filter_input函数,可以直接从GET、POST等超全局数组中获取并过滤输入,避免手动获取后再做过滤的繁琐步骤。
下面是filter_var函数的基础用法示例,演示如何过滤整数类型的用户输入:
<?php
// 模拟用户通过表单提交的年龄输入
$user_input = $_POST['age'] ?? '';
// 使用FILTER_VALIDATE_INT规则过滤整数输入
// 额外参数可以设置最小值和最大值
$options = [
'options' => [
'min_range' => 1,
'max_range' => 120
]
];
$filtered_age = filter_var($user_input, FILTER_VALIDATE_INT, $options);
if ($filtered_age === false) {
echo '输入的年龄不是合法的整数,或者不在1-120的范围内';
} else {
echo '过滤后的合法年龄:' . $filtered_age;
}
?>常用过滤规则与适用场景
PHP的过滤扩展提供了多种预设规则,开发者可以根据输入数据的类型选择对应的规则,以下是常见的规则说明:
- FILTER_VALIDATE_EMAIL:用于验证邮箱格式是否合法,适合过滤用户注册的邮箱输入
- FILTER_VALIDATE_URL:用于验证URL格式是否合法,适合过滤用户提交的链接类输入
- FILTER_SANITIZE_STRING:用于去除字符串中的HTML标签和特殊字符,适合过滤普通的文本输入,规避XSS攻击风险
- FILTER_SANITIZE_NUMBER_INT:用于去除字符串中除了数字、正负号之外的所有字符,适合过滤纯数字类型的输入
- FILTER_SANITIZE_SPECIAL_CHARS:用于将特殊字符转义为HTML实体,比如把<转成<,适合需要保留输入原始内容但避免HTML解析的场景
针对超全局数组的直接过滤
如果不需要先获取超全局数组的值再过滤,可以直接使用filter_input函数,直接从GET、POST等输入源获取数据并过滤,减少中间变量的使用。示例如下:
<?php
// 直接从POST数组中获取并过滤邮箱输入
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo '提交的邮箱格式不合法';
} else {
echo '合法的邮箱地址:' . $email;
}
// 直接从GET数组中获取并过滤搜索关键词,去除HTML标签
$keyword = filter_input(INPUT_GET, 'keyword', FILTER_SANITIZE_STRING);
echo '过滤后的搜索关键词:' . $keyword;
?>自定义过滤规则的扩展用法
如果预设的过滤规则无法满足需求,还可以自定义回调函数配合filter_var使用,实现更复杂的过滤逻辑。比如需要过滤用户名,要求只能包含中文、字母和下划线,长度在3-20位之间,就可以用如下方式实现:
<?php
function validate_username($username) {
// 正则匹配:只允许中文、字母、下划线,长度3-20位
if (preg_match('/^[\x{4e00}-\x{9fa5}a-zA-Z_]{3,20}$/u', $username)) {
return $username;
}
return false;
}
$user_input_name = $_POST['username'] ?? '';
// 使用FILTER_CALLBACK规则,指定自定义回调函数
$filtered_name = filter_var($user_input_name, FILTER_CALLBACK, ['options' => 'validate_username']);
if ($filtered_name === false) {
echo '用户名格式不合法,只能包含中文、字母、下划线,长度3-20位';
} else {
echo '合法的用户名:' . $filtered_name;
}
?>输入过滤的注意事项
首先要注意过滤和验证的区别,验证类规则(如FILTER_VALIDATE_INT)如果输入不合法会返回false,而净化类规则(如FILTER_SANITIZE_STRING)会直接修改输入内容返回处理后的值,使用时要根据需求选择。
其次,输入过滤只是安全的一环,对于涉及数据库操作的输入,还需要结合预处理语句(如PDO的prepare方法)来避免SQL注入,不能只依赖输入过滤。另外,输出到页面的数据时,如果是用户输入的内容,也要根据输出场景做对应的转义处理,比如输出到HTML页面时用htmlspecialchars函数转义,避免存储型XSS攻击。
PHP输入过滤PHP_安全处理PHP_用户输入filter_var修改时间:2026-06-03 23:39:22