PHP 过滤器(Filters)完整指南
                           
天天向上
发布: 2025-03-21 00:09:49

原创
986 人浏览过

1. 什么是 PHP 过滤器?

PHP 过滤器(Filters)用于 验证清理 数据,主要用于:

  • 过滤 用户输入数据(如 $_GET$_POST
  • 过滤 表单数据
  • 处理 API 请求参数
  • 过滤 数据库输入
  • 过滤 文件上传

2. filter_var() – 过滤单个变量

语法

filter_var(变量, 过滤器, 选项);

示例

$email = "test@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "有效的 Email 地址";
} else {
    echo "无效的 Email 地址";
}

📌 FILTER_VALIDATE_EMAIL 用于 验证 Email 格式。


3. filter_input() – 过滤全局变量

语法

filter_input(类型, 变量名, 过滤器, 选项);
  • 类型
  • INPUT_GET
  • INPUT_POST
  • INPUT_COOKIE
  • INPUT_SERVER
  • INPUT_ENV
  • 变量名:要检查的变量(如 "email"
  • 过滤器:验证或清理数据
  • 选项(可选):额外的验证规则

示例

$email = filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL);
if ($email) {
    echo "有效 Email";
} else {
    echo "无效 Email";
}

📌 从 $_GET['email'] 读取数据,并进行 Email 验证


4. 过滤器类型

PHP 提供了 两大类 过滤器:

  1. 验证过滤器(Validation)✅:用于 检查 数据是否符合格式
  2. 清理过滤器(Sanitization)🧼:用于 删除 不需要的字符

5. 验证过滤器

常见 FILTER_VALIDATE_* 过滤器

过滤器作用示例
FILTER_VALIDATE_INT验证整数123 ✅, "abc"
FILTER_VALIDATE_FLOAT验证浮点数3.14 ✅, "test"
FILTER_VALIDATE_BOOLEAN验证布尔值true, false, 1, 0, "yes"
FILTER_VALIDATE_EMAIL验证 Email"test@example.com"
FILTER_VALIDATE_URL验证 URL"https://www.example.com"
FILTER_VALIDATE_IP验证 IP 地址"192.168.1.1"
FILTER_VALIDATE_MAC验证 MAC 地址"00:1A:2B:3C:4D:5E"

示例

$int = "100";
if (filter_var($int, FILTER_VALIDATE_INT)) {
    echo "有效整数";
} else {
    echo "无效整数";
}

6. 清理过滤器

常见 FILTER_SANITIZE_* 过滤器

过滤器作用示例
FILTER_SANITIZE_STRING移除 HTML 标签"Hello <b>World</b>" → "Hello World"
FILTER_SANITIZE_EMAIL移除非法 Email 字符"test @ example.com" → "test@example.com"
FILTER_SANITIZE_URL移除非法 URL 字符"http:// example.com"
FILTER_SANITIZE_NUMBER_INT过滤整数(保留数字+-"123abc""123"
FILTER_SANITIZE_NUMBER_FLOAT过滤浮点数(支持小数点)"3.14abc""3.14"
FILTER_SANITIZE_SPECIAL_CHARSHTML 实体编码"<script>" → "&lt;script&gt;"

示例

$dirty_string = "<h1>Hello</h1>";
$clean_string = filter_var($dirty_string, FILTER_SANITIZE_STRING);
echo $clean_string; // 输出 "Hello"

📌 FILTER_SANITIZE_STRING 移除了 HTML 标签,防止 XSS 攻击


7. 选项和标志

PHP 过滤器 支持自定义选项 以更精确地控制数据格式。

示例:设置最小/最大整数范围

$options = array(
    "options" => array(
        "min_range" => 1,
        "max_range" => 100
    )
);
$number = 50;
if (filter_var($number, FILTER_VALIDATE_INT, $options)) {
    echo "有效数字";
} else {
    echo "超出范围";
}

8. 过滤多个输入数据

使用 filter_input_array() 可以一次性过滤多个数据。

示例

$filters = array(
    "name" => FILTER_SANITIZE_STRING,
    "email" => FILTER_VALIDATE_EMAIL,
    "age" => array(
        "filter" => FILTER_VALIDATE_INT,
        "options" => array("min_range" => 18, "max_range" => 100)
    )
);
$input = filter_input_array(INPUT_POST, $filters);
if ($input["email"] && $input["age"]) {
    echo "数据有效";
} else {
    echo "数据无效";
}

9. 结合 htmlspecialchars() 防止 XSS

$name = filter_input(INPUT_GET, "name", FILTER_SANITIZE_STRING);
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');

📌 防止 XSS 攻击,确保特殊字符(< > & " ')不会执行脚本。


10. 综合案例

过滤和验证用户注册信息

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = filter_var($_POST["username"], FILTER_SANITIZE_STRING);
    $email = filter_var($_POST["email"], FILTER_VALIDATE_EMAIL);
    $age = filter_var($_POST["age"], FILTER_VALIDATE_INT, [
        "options" => ["min_range" => 18, "max_range" => 100]
    ]);

    if ($username && $email && $age) {
        echo "注册成功!";
    } else {
        echo "输入无效,请检查数据格式!";
    }
}

11. 过滤器最佳实践

表单数据一定要过滤:防止 SQL 注入 & XSS 攻击
使用 filter_var() 进行数据清理,避免手写正则
对于 URL、Email、IP 地址等数据使用 FILTER_VALIDATE_*
对用户输入的字符串使用 FILTER_SANITIZE_STRING 过滤特殊字符
结合 htmlspecialchars() 确保前端安全


总结

方法作用
filter_var()过滤单个变量
filter_input()过滤 $_GET / $_POST / $_COOKIE / $_SERVER
filter_input_array()批量过滤
FILTER_VALIDATE_*用于 验证 数据
FILTER_SANITIZE_*用于 清理 数据
htmlspecialchars()防止 XSS 攻击

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *