Php 5.2.0 中的输入过滤函数 Filter_第1页
Php 5.2.0 中的输入过滤函数 Filter_第2页
Php 5.2.0 中的输入过滤函数 Filter_第3页
Php 5.2.0 中的输入过滤函数 Filter_第4页
Php 5.2.0 中的输入过滤函数 Filter_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Php 5.2.0 中的输入过滤函数 Filter程序的安全性已经成为php开发人员首要(或者经常要)考虑的问题。不论是在单独的,开源的或者商业项目中,它的重要性都越来越高。安全性对于php是一个很重要的部分。但是所有的讨论重点都是用户的输入数据。我们在这里并不讨论诸如XSS,SQL注入这样的话题,如果你对这些感兴趣可以看本文结尾出的相关文章。不要相信外部数据几乎所有的应用程序(web,桌面,命令行)都需要接收相应的数据或者动作来完成一定的操作然后再输出结果。这些输入数据可能是用户或者其他的程序(网络客户端,病毒,扫描器等)。基本原则是:过滤所有的外来数据。对于输入的过滤是保证整个程序安全的基

2、础,和采用什么语言或者什么系统毫无关系。Php提供了很多相应的函数来对数据进行转换或者验证,但是和其他语言比起来明显的缺陷是没有一个标准的函数来过滤所有数据。新的函数Filter实现了这个功能。什么是外部输入数据?所有的form提交的数据所有的$_GET, $_POST, $_REQUESTCookie($_COOKIES网络服务器数据文件服务器信息(比如 $_SERVERSERVER_NAME)环境变量数据库的查询Filter很好的支持了上述这些输入数据。为什么用Filter?Filter扩展库的目的就是要达到使数据过滤尽量的简单,下面是两个简单例子:检查2个通过_GET方式输入的整数:1p

3、hp 2 3if(isset($_GETmode 4if(!is_numeric($_GETmode 5echoThemodeargumentmustbeavalidinteger. ; 6exit(; 7 8$mode=(int$_GETmode; 9else 10echoThemodeargumentismissing. ; 11exit(; 12 13 14if(isset($_GETtype 15$type=(int$_GETtype; 16if(!is_numeric($_GETtype| 17(is_numeric($_GETtype&$type=3&$typeview plain

4、 | print | copy to clipboard | ?使用Filter扩展库的filter_input函数来过滤:1php 2 3$mode=filter_input(INPUT_GET,mode,FILTER_VALIDATE_INT; 4$type=filter_input(INPUT_GET,type,FILTER_VALIDATE_INT,array(options=array(min_range=3,max_range=10; 5 6if(is_null($mode 7echoThemodeargumentismissing. ; 8exit(; 9elseif($mode

5、=false 10echoThemodeargumentmustbeavalidinteger. ; 11exit(; 12else 13echomodeis:$mode. ; 14 15 16if(is_null($type 17echoThetypeargumentismissing. ; 18exit(; 19elseif($type=false 20echoThetypeargumentmustbeanintegerbetween3and10. ; 21exit(; 22else 23echotypeis:$type. ; 24 25?view plain | print | copy

6、 to clipboard | ?它是如何工作的?把一个请求处理成用户可以用到的变量是由SAPI层来完成的。这里不去研究SAPI层的具体细节,就把SAPI层看做是连接PHP引擎和web层之间的东西。PHP负责处理来自SAPI的数据(ENV,SERVER,COOKIE,GET,POST)并转换成能用的全局变量或者像getenv这样的函数能调用的数据。Filter能处理SAPI层的数据和PHP引擎数据。SAPI支持自定义的过滤选项,当每一个外部数据进行处理的时候PHP引擎都会调用Filter函数。通过配置php.ini文件可以使得SAPI默认支持filter。假设有一个这样的简单的POST请求:P

7、OST /myform.php?myfield=下图说明了正常情况下(php5.1或之前没有Filter扩展的时候)和安装了Filter扩展后在处理上的区别:运行条件Filter在PHP 5.1和之前的版本可以使用扩展方式。从PHPPHP的标准库。安装PHP 5.2.0 中已经默认支持,所以不需要再额外安装。Unix/Linux:$ pecl install filter或者$ wget $ tar xzf filter$ cd filter-0.11.0$ phpize$ ./configure$ make$ make installWindows:在这里可以下载与PHP版本相对应的filt

8、er.dll 文件。在任何系统中都需要修改php.ini文件加入 extension=filter.so 然后重起web服务。原则Filter 可以有两种形式:1. 过滤判断* 允许或者不允许字符串中有指定的字符* 和数据的格式无关* 返回一个字符串2. 检测判断* 强大的数据分析* 已知的数据格式* 成功返回指定的格式可用到的函数:* filter_input, 得到一个输入值* filter_input_array, 一次得到多个输入值* filter_var, 过滤一个值* filter_var_array, 一次过滤多个值如果成功的话将返回转换过之后的格式,如果失败(格式不符,值超出范

9、围等等。)将返回FALSE,如果变量没有设置将返回NULL。使用FILTER_NULL_ON_FAILURE标记后将会在失败的时候返回NULL,变量没有设置的时候返回FALSE。请看下面的例子,可以避免使用isset或者is_numeric这样的混乱局面。检测判断的例子1234 php method=post 5Enteryourage: 6 7 89view plain | print | copy to clipboard | ?处理脚本:1php 2if(!filter_has_var(INPUT_POST,submit 3echoform; 4/includetheform. 5 6

10、7$age=filter_input(INPUT_POST,age,FILTER_VALIDATE_INT; 8if(is_null($age 9echoTheagefieldisrequired. ; 10elseif($age=FALSE 11echoPleaseenteravalidage. ; 12else 13echoWelcome.; 14 15?view plain | print | copy to clipboard | ?filter_has_var检测给定的变量是否存在。它不会做任何处理只会告诉程序变量是否已经设置。相当于isset($_POSTsubmit。filter

11、_input会取得一个变量返回处理好的数据。在上面的例子中会返回一个整数。如果是要返回一个处于一定范围之内的值,假设是7-77岁之间的人。可以指定一个最大值和一个最小值。1php 2if(!filter_has_var(INPUT_POST,submit 3echoform; 4/includetheform. 5 6$options=array(options=array(min_range=7,min_range=77; 7$age=filter_input(INPUT_POST,age,FILTER_VALIDATE_INT,$options; 8 9if(is_null($age 10

12、echoTheagefieldisrequired. ; 11elseif($age=FALSE 12echoYoumustbeenteravalidageandbebetween7and77yearsold. ; 13else 14echoWelcome.; 15 16?view plain | print | copy to clipboard | ?如果是要判断一个有效的邮件地址的话,可以这样:1$email=filter_input(INPUT_POST,email,FILTER_VALIDATE_EMAIL;view plain | print | copy to clipboard

13、 | ?如果邮件地址不正确或者是空的话$email的值将为FALSE。过滤判断的例子1234 php method=post 5Enteryourname: 6 7 89view plain | print | copy to clipboard | ?下面的filter_input函数将自动过滤并返回适当的值:1php 2if(!filter_has_var(INPUT_POST,submit 3echoform; 4/includetheform. 5 6$name=filter_input(INPUT_POST,name,FILTER_SANITIZE_SPECIAL_CHARS; 7i

14、f(is_null($name 8echoThenamefieldisrequired. ; 9else 10echoHello$name.; 11 12?view plain | print | copy to clipboard | ?如果接收到的name值是:Johnny Weimller JrFILTER_SANITIZE_SPECIAL_CHARS 将会返回:Hello Johnny Weißmller Jr.一个更好的过滤写法:1$name=filter_input(INPUT_POST, 2name, 3FILTER_SANITIZE_STRING, 4FILTER_F

15、LAG_ENCODE_HIGH|FILTER_FLAG_ENCODE_LOW;view plain | print | copy to clipboard | ?输出:Hello Johnny Weimller Jr.这里的函数还有很多选项,如果你想了解更多的细节可以查看Filter的文档。如何一次处理所有输入?1234 php method=post 5Name: 6Email: 7Homepage: 8Age: 9Income: 10Yourtwofavouriteslanguages: 11 12 haskell 13 R 14 Lua 15 Pike 16 Rebol 17 php P

16、HP 18 19 20 2122view plain | print | copy to clipboard | ?处理程序:1php 2if(!filter_has_var(INPUT_POST,submit 3echoform; 4/includetheform. 5 6 7$defs=array( 8name=array(filter=FILTER_SANITIZE_STRING, 9flags=FILTER_FLAG_ENCODE_HIGH|FILTER_FLAG_ENCODE_LOW, 10email=FILTER_VALIDATE_EMAIL, 11homepage=FILTER_

17、VALIDATE_URL, 12age=array(filter=FILTER_VALIDATE_INT, 13options=array(min_range=7,min_range=77, 14income=FILTER_VALIDATE_FLOAT, 15favourites=array( 16filter=FILTER_SANITIZE_STRING, 17flags=FILTER_REQUIRE_ARRAY 18, 19; 20 21$input=filter_input_array(INPUT_POST,$defs; 22 23if($inputage=FALSE 24exit(Yo

18、umustbebetween7and77yearsold.; 25 26 27if(is_null($inputfavourites 28exit(Youhavetochoosetwoormorelanguages.; 29 30 31if(!in_array(PHP,$inputsfavourites 32exit(YoudontlikePHP!; 33 34 35/*Otherchecksforrequiredvalues*/36?view plain | print | copy to clipboard | ?正如上面例子中的,通过一个函数就能处理所有的变量。唯一不同的就是事先定义一个

19、对应的数组。需要注意的是数组中选项的正确性。这样的做法不但增加了程序的易读性,并且如果要添加移除或者修改处理规则也会非常方便。更复杂的处理在下面的处理“favourites”变量时用到了用户自定义函数。options指定一个用户自定义函数通过定义callback来实现,语法和PHP的call_user_func一样。1php 2classlanguage 3function_construct($name 4$this-name=$name; 5 6 78functioncheck_languages($var 9static$called=0; 10$called+; 11echocalle

20、d:$called:$var ; 12$var=filter_var($var,FILTER_SANITIZE_STRIPPED; 13$l=newlanguage($var; 14return$l; 15 1617if(!filter_has_var(INPUT_POST,submit 18echoform; 19/includetheform. 20 2122$defs=array( 23name=array(filter=FILTER_SANITIZE_STRING, 24flags=FILTER_FLAG_ENCODE_HIGH|FILTER_FLAG_ENCODE_LOW, 25email=FILTER_VALIDATE_EMAIL, 26homepage=FILTER_VALIDATE_URL, 27age=FILTER_VALIDATE_INT, 28income=FILTER_VALIDATE_FLOAT, 29favourites=array( 30filter=FILTER_CALLBACK, 31options=check_languages32, 33; 3435$input=fi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论