PHP Filter(译文)

原文链接:http://www.w3schools.com/php/php_filter.asp

PHP filters是用来验证和过滤从不安全的输入源传送过来的数据,比如用户输入的数据。

什么是PHP过滤器?
PHP过滤器就是用来验证和过滤从不安全的输入源传送过来的数据的。
测试、验证和过滤用户输入的数据或客户端数据是web应用程序很重要的一部分。
这个PHP过滤器扩展功能的设计就是为了使数据过滤变得更简单、更快。

为什么要用过滤器?
几乎所有的web应用程序都基于外部输入数据。有时输入数据来源于一个用户或是其他的应用程序(比如一个web服务)。用过滤器你就可以确保你的应用程序能够获取正确的输入格式。
你应该养成过滤所有外部数据的习惯!
输入过滤问题是最重要的应用程序安全问题之一。
那什么是外部数据呢?

  • 表单的输入数据
  • Cookies
  • Web 服务响应的数据
  • 服务器端的变量
  • 数据库查询结果

过滤器函数
过滤一个变量,需要用到下面的一些过滤函数:

  • filter_var()-用指定的过滤类型来过滤一个变量
  • filter_var_array()-用相同的或不同的过滤类型来过滤一个数组变量
  • filter_input-获取一个输入变量,然后过滤这个输入变量
  • filter_input_array-获取一组输入变量,然后用相同的或不同的过滤类型来过滤这个数组变量

在下面的例子中,我们会用到filter_var()函数来验证一个整数:

<?php
   $int = 123;

   if(!filter_var($int, FILTER_VALIDATE_INT))
   {
     echo("Integer is not valid");
   }
   else
   {
     echo("Integer is valid");
   }
?>

上面的代码中用到了"FILTER_VALIDATE_INT"过滤类型来过滤变量,如果这个整数变量是有效的,上面的代码将会输出:"Integer is valid"。
如果我们设置一个不是整数的变量(比如"123abc"),输出结果将会是:"Integer is not valid"。
关于一个完整的过滤函数列表,请访问我们的 PHP Filter Reference

验证和清理
过滤器有两种:
验证型过滤器:

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

清理型过滤器:

  • 用来允许或不允许一个字符串里的特殊字符
  • 没有数据格式规则
  • 一般返回string类型

选项和标记
选项和标记用来对特殊的过滤类型增加额外的过滤选项。
不同的过滤类型有不同的选项和标记。
在下面的例子中,我们用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("Integer is not valid");
  }
  else
  {
     echo("Integer is valid");
  }
?>

就像上面的代码那样,选项必须放在一个名为"options"的关联数组里。如果是一个单一的标记则不用放到一个数组里。
由于上面的整数是300,不在规定的范围之内,所以代码将会输出:"Integer is not valid"。
关于一个完整的过滤函数列表,请访问我们的 PHP Filter Reference。检查每个过滤类型看看哪些选项和标记是可用的。

验证输入
让我们一起试着去验证一个表单的输入数据。
我们要做的第一件事是确认我们所寻找的输入数据是否存在。
然后我们用filter_input()函数来过滤输入数据。
在下面的例子中,输入的变量"email"是发送给这个PHP文件的:

例子解析

上面的例子有一个用"GET"方式发送过来的输入数据(email):
1.检查"GET"类型的输入变量"email"是否存在
2.如果输入变量存在,再检查是否是一个有效的e-mail地址

清理输入
让我们一起试着清理从表单传送过来的一个URL。
首先,我们得确认我们所寻找的输入数据是否存在。
然后,我们再用filter_input()函数来清理输入数据。
下面的例子中,输入的变量"url"是发送给这个PHP文件的:

<?php
  if(!filter_has_var(INPUT_POST, "url"))
  {
    echo("Input type does not exist");
  }
  else
  {
    $url = filter_input(INPUT_POST,  "url", FILTER_SANITIZE_URL);
  }
?>

例子解析
上面的例子有一个用"POST"方式发送过来的输入数据(url):
1.检查"POST"类型的输入变量"url"是否存在
2.如果输入变量存在,清理(除去无效的字符),然后把结果存入$url这个变量中
如果输入的变量是一个类似"http://www.W3ååSchøøools.com/"的字符串,清理后的变量$url将会是:

http://www.W3Schools.com/

过滤多重输入数据
一个表单往往包含不止一个的输入域。为了避免一遍一遍地调用filter_var或filter_input函数,我们可以使用filter_var_array或filter_input_array函数。
在这个例子中,我们用filter_input_array()函数来过三个GET变量。接收到的三个变量分别是name、age、e-mail address:

<?php
  $filters = array
  (
    "name" => array
    (
      "filter"=>FILTER_SANITIZE_STRING
    ),
    "age" => array
    (
      "filter"=>FILTER_VALIDATE_INT,
      "options"=>array
      (
      "min_range"=>1,
      "max_range"=>120
      )
    ),
    "email"=> FILTER_VALIDATE_EMAIL
  );

  $result = filter_input_array(INPUT_GET, $filters);

  if (!$result["age"])
  {
    echo("Age must be a number between 1 and 120.<br>");
  }
  elseif(!$result["email"])
  {
    echo("E-Mail is not valid.<br>");
  }
  else
  {
    echo("User input is valid");
  }
?>

例子解析
上面的例子有三个用"GET"方式发送过来的输入数据(name,age,email):
1.定义一个包含输入变量名的数组,其中的过滤类型用来过滤不同的输入变量
2.把GET获取的输入数据和已经设置好的数组作为参数调用filter_input_array()函数
3.检查$result数组里的"age"和"email"变量是否有效(如果一个输入变量是无效的,那么这个输入变量在调用filter_input_array()函数后就会返回FALSE)
filter_input_array()函数的第二个参数可以是一个数组或是一个单一的过滤类型ID。
如果第二个参数是一个单一的过滤类型ID,输入数据数组里的所有值将以这个过滤类型进行过滤。
如果第二个参数是一个数组,它必须遵循以下规则:

  • 必须是一个包含把所有输入变量作为数组键的关联数组(比如上面的"age"输入变量)
  • 这个关联数组的值必须是一个过滤类型ID或是一个指定过滤类型、标记和选项的数组

使用过滤器回调
通过使用FILTER_CALLBACK过滤类型,使用户自己定义的函数作为一个过滤器成为可能。这样我们就可以完全控制对数据的过滤。
你可以创建你自己定义的函数或者使用已经存在的PHP函数
这个你希望用来当做过滤器的函数是指定一种相同方式作为一个选项来定制的。在一个关联数组里就是键名为"options"的值
在下面的例子中,我们用一个用户创建的函数来把所有的"_"转换为空格字符:

<?php
  function convertSpace($string)
  {
    return str_replace("_", " ", $string);
  }

  $string = "Peter_is_a_great_guy!";

  echo filter_var($string, FILTER_CALLBACK,
  array("options"=>"convertSpace"));
?>

上面的代码输出的结果应该是这样的:

Peter is a great guy!

例子解析
上面的例子把所有的"_"转换为空格字符:
1.创建一个函数用来把"_"用空格字符来代替
2.调用filter_var()函数,把FILTER_CALLBACK过滤类型和一个包含我们创建的函数的数组作为参数

Tagged on: ,

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>