PHP的filter_input()函数是用于安全获取并过滤外部输入数据的内置函数,主要用于防御XSS/SQL注入等攻击。以下是详细说明和用法示例:
函数原型
mixed filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, mixed $options = null)
参数解析
常用过滤器类型
典型用法示例
1. 获取并清理POST数据
// 清理用户输入的电子邮件
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
if ($email === false) {
echo "无效的邮箱格式";
}2. 验证GET参数为整数
// 验证ID是否为1-100的整数
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'max_range' => 100]
]);
if ($id === null) {
echo "ID参数缺失";
} elseif ($id === false) {
echo "ID必须是1-100的整数";
}3. 批量过滤COOKIE数据
// 清理所有COOKIE中的HTML标签 $clean_cookies = filter_input_array(INPUT_COOKIE, FILTER_SANITIZE_STRING);
注意事项
返回值
成功时返回过滤后的值
未找到变量时返回
null验证失败时返回
false与直接访问超全局变量的区别
// 不安全方式 $raw_email = $_POST['email']; // 可能包含恶意代码 // 安全方式 $safe_email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
性能建议
对高频访问的参数可缓存过滤结果,避免重复调用:
if (!isset($filtered_id)) {
$filtered_id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
}
完整案例:表单安全处理
// 处理登录表单
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW); // 密码需特殊处理
if ($username && $password) {
// 安全数据库查询(需配合预处理语句)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
}通过filter_input()可有效减少代码注入风险,是PHP安全编程的基础实践。