PHP: 用Filter对输入进行过滤

@ 2011-01-06 12:13:07
标签:

    PHP的开发过程中,少不了对来自客户端的各种“输入”进行验证和处理。比如,表单提交,Cookie检查,等。

    传统的做法是使用各种标准函数进行处理,比如

    if(isset($_POST['vname'])){
      $vname = htmlspecialchars($_POST['vname']);
    }
    

    PHP 5.2.0 以后提供了被称为 filter 的概念专门用于处理类似的操作。

    还是上面的操作,使用 filter 的做法如下:

    if(filter_has_var(INPUT_POST, 'vname')){
      $vname = filter_input(INPUT_POST, 'vname', FILTER_SANITIZE_SPECIAL_CHARS);
    }
    

    对一个变量的处理,看起来,并没有简单多少,但却提供了统一的“格式”。

    如果是多个变量需要同时处理,传统的方式怕就只能是写多个if语句。利用filter却可以通过一个函数调用(filter_input_array)加配置的方式实现。比如下面来自PHP参考文档的例子:

    $args = array(
        'product_id'   => FILTER_SANITIZE_ENCODED,
        'component'    => array('filter'    => FILTER_VALIDATE_INT,
                                'flags'     => FILTER_REQUIRE_ARRAY, 
                                'options'   => array('min_range' => 1, 'max_range' => 10)
                               ),
        'versions'     => FILTER_SANITIZE_ENCODED,
        'doesnotexist' => FILTER_VALIDATE_INT,
        'testscalar'   => array(
                                'filter' => FILTER_VALIDATE_INT,
                                'flags'  => FILTER_REQUIRE_SCALAR,
                               ),
        'testarray'    => array(
                                'filter' => FILTER_VALIDATE_INT,
                                'flags'  => FILTER_REQUIRE_ARRAY,
                               )
    
    );
    
    $myinputs = filter_input_array(INPUT_POST, $args);
    

    看起来简单不少吧。重要的是,filter使得我们有可能对用户输入的验证和处理进行模块化处理。

    Cheat Sheet of PHP Filter

    预定义常量:

    常量 备注
    INPUT_POST
    INPUT_GET
    INPUT_COOKIE
    INPUT_ENV
    INPUT_SERVER
    INPUT_SESSION
    INPUT_REQUEST
    • filter_input
    • filter_input_array
    • filter_var_array
    • filter_var
    • filter_has_var
    标签:

      分享到:
      comments powered by Disqus

      26/30ms