zoukankan      html  css  js  c++  java
  • php基础-14

    PHP 过滤器


    转载至:https://www.runoob.com/php/php-filter.html

    PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。


    什么是 PHP 过滤器?

    PHP 过滤器用于验证和过滤来自非安全来源的数据。

    测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。

    PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。


    为什么使用过滤器?

    几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。

    您应该始终对外部数据进行过滤!

    输入过滤是最重要的应用程序安全课题之一。

    什么是外部数据?

    • 来自表单的输入数据
    • Cookies
    • Web services data
    • 服务器变量
    • 数据库查询结果

    函数和过滤器

    如需过滤变量,请使用下面的过滤器函数之一:

    • filter_var() - 通过一个指定的过滤器来过滤单一的变量;如果成功,则返回被过滤的数据。如果失败,则返回 FALSE。
    • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
    • filter_input - 获取一个输入变量,并对它进行过滤
    • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

    在下面的实例中,我们用 filter_var() 函数验证了一个整数:

    实例

    <?php 
    $int = 123;  
    if(!filter_var($int, FILTER_VALIDATE_INT)) 
    {    
        echo("不是一个合法的整数"); 
    } 
    else 
    {    
        echo("是个合法的整数"); 
    } 
    ?>
    

    上面的代码使用了 "FILTER_VALIDATE_INT" 过滤器来过滤变量。由于这个整数是合法的,在浏览器输入http://www.php.com/demo.php

    显示:是个合法的整数

    如果我们尝试使用一个非整数的变量(比如 "123abc"),则将输出:"Integer is not valid"。

    如需查看完整的函数和过滤器列表,请访问我们的 PHP Filter 参考手册


    Validating 和 Sanitizing

    有两种过滤器:

    Validating 过滤器:

    • 用于验证用户输入
    • 严格的格式规则(比如 URL 或 E-Mail 验证)
    • 如果成功则返回预期的类型,如果失败则返回 FALSE

    Sanitizing 过滤器:

    • 用于允许或禁止字符串中指定的字符
    • 无数据格式规则
    • 始终返回字符串

    选项和标志

    选项和标志用于向指定的过滤器添加额外的过滤选项。

    不同的过滤器有不同的选项和标志。

    在下面的实例中,我们用 filter_var() 和 "min_range" 以及 "max_range" 选项验证了一个整数:

    <?php
    $var=300;
    $int_options = array(
        "options"=>array
        (
            "min_range"=>0,
            "max_range"=>256
        )
    );
    if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
    {
        echo("不是一个合法的整数");
    }
    else
    {
        echo("是个合法的整数");
    }
    ?>
    

    就像上面的代码一样,选项必须放入一个名为 "options" 的相关数组中。如果使用标志,则不需在数组内。

    由于整数是 "300",它不在指定的范围内,以上代码的输出将是:

    不是一个合法的整数
    

    如需查看完整的函数和过滤器列表,请访问我们的 PHP Filter 参考手册。您可以看到每个过滤器的可用选项和标志。

    验证输入

    让我们试着验证来自表单的输入。

    我们需要做的第一件事情是确认是否存在我们正在查找的输入数据。

    然后我们用 filter_input() 函数过滤输入的数据。

    在下面的实例中,输入变量 "email" 被传到 PHP 页面:

    <?php
    if(!filter_has_var(INPUT_GET, "email"))
    {
        echo("没有 email 参数");
    }
    else
    {
        if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
        {
            echo "不是一个合法的 E-Mail";
        }
        else
        {
            echo "是一个合法的 E-Mail";
        }
    }
    ?>
    

    看测试:

    测试2:为什么在地址栏输入参数,这里就是在假装GET方法提交的数据

    解释:任意输入一个通过 "GET" 方法传送的输入变量 (email):

    1. 检测是否存在 "GET" 类型的 "email" 输入变量
    2. 如果存在输入变量,检测它是否是有效的 e-mail 地址

    净化输入

    让我们试着清理一下从表单传来的 URL。

    首先,我们要确认是否存在我们正在查找的输入数据。

    然后,我们用 filter_input() 函数来净化输入数据。

    在下面的实例中,输入变量 "url" 被传到 PHP 页面:

    <?php
    if(!filter_has_var(INPUT_GET, "url"))
    {
        echo("没有 url 参数");
    }
    else
    {
        $url = filter_input(INPUT_GET, 
        "url", FILTER_SANITIZE_URL);
        echo $url;
    }
    ?>
    

    测试:

    任意输入通过 "GET" 方法传送的输入变量 (url):

    1. 检测是否存在 "GET" 类型的 "url" 输入变量
    2. 如果存在此输入变量,对其进行净化(删除非法字符),并将其存储在 $url 变量中

    假如输入变量是一个类似这样的字符串:"http : //www.ruåånoøøob.com/",则净化后的 $url 变量如下所示:

    使用 Filter Callback

    通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。

    您可以创建自己的自定义函数,也可以使用已存在的 PHP 函数。

    将您准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options"。

    在下面的实例中,我们使用了一个自定义的函数把所有 "_" 转换为 ".":

    <?php
    function convertSpace($string)
    {
        return str_replace("_", ".", $string);
    }
     
    $string = "www_runoob_com!";
     
    echo filter_var($string, FILTER_CALLBACK,
    array("options"=>"convertSpace"));
    ?>
    >>>
    www.runoob.com!
    

    上面的实例把所有 "_" 转换成 "." :

    1. 创建一个把 "_" 替换为 "." 的函数
    2. 调用 filter_var() 函数,它的参数是 FILTER_CALLBACK 过滤器以及包含我们的函数的数组

    PHP 高级过滤器


    检测一个数字是否在一个范围内

    以下实例使用了 filter_var() 函数来检测一个 INT 型的变量是否在 1 到 200 内:

    <?php
    
    $int = 122;
    $min = 1;
    $max = 200;
    
    if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) {
       echo("变量值不在合法范围内");
    } 
    else {
       echo("变量值在合法范围内");
    }
    
    ?>
    >>>变量值在合法范围内
    

    检测 IPv6 地址

    以下实例使用了 filter_var() 函数来检测一个 $ip 变量是否是 IPv6 地址:

    <?php
    $ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
    
    if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
       echo("$ip 是一个 IPv6 地址");
    } 
    else {
       echo("$ip 不是一个 IPv6 地址");
    }
    ?>
    >>>2001:0db8:85a3:08d3:1319:8a2e:0370:7334 是一个 IPv6 地址
    

    检测 URL - 必须包含QUERY_STRING(查询字符串)

    以下实例使用了 filter_var() 函数来检测 $url 是否包含查询字符串:

    <?php
    $url = "http://www.runoob.com";
    
    if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
       echo("$url 是一个合法的 URL");
    } 
    else {
       echo("$url 不是一个合法的 URL");
    }
    ?>
    >>>http://www.runoob.com 不是一个合法的 URL
    

    移除 ASCII 值大于 127 的字符

    以下实例使用了 filter_var() 函数来移除字符串中 ASCII 值大于 127 的字符,同样它也能移除 HTML 标签:

    <?php
    $str = "<h1>Hello WorldÆØÅ!</h1>";
    $newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
    echo $newstr;
    ?>
    >>>Hello World!
    

    PHP 过滤器参考手册

    你也可以通过访问本站的 PHP 过滤器参考手册 来查看过滤器的具体应用。

    参考手册中包含了过滤器参数的简要说明和使用例子!

  • 相关阅读:
    Java String截取判断文件类型
    HttpServletRequest request 转 Json
    httprunner3.x详细教程七(三种方式实现参数化数据驱动)
    httprunner3.x详细教程六(httprunner的setup和teardown及hook)
    httprunner3.x详细教程五(debugtalk.py介绍)
    httprunner3.x详细教程四(.env文件介绍)
    httprunner3.x详细教程三(httprunner中testcase的构造)
    httprunner3.x详细教程二(har文件录制及har文件转换)
    httprunner3.x详细教程一(框架结构介绍及搭建)
    mybatis.xml和mapper.xml文件的基本配置
  • 原文地址:https://www.cnblogs.com/IronMind/p/13380691.html
Copyright © 2011-2022 走看看