Php520中的输入过滤函数Filter.docx.pdf

上传人:tbuqq 文档编号:5616295 上传时间:2020-07-02 格式:PDF 页数:23 大小:479.47KB
返回 下载 相关 举报
Php520中的输入过滤函数Filter.docx.pdf_第1页
第1页 / 共23页
Php520中的输入过滤函数Filter.docx.pdf_第2页
第2页 / 共23页
Php520中的输入过滤函数Filter.docx.pdf_第3页
第3页 / 共23页
Php520中的输入过滤函数Filter.docx.pdf_第4页
第4页 / 共23页
Php520中的输入过滤函数Filter.docx.pdf_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《Php520中的输入过滤函数Filter.docx.pdf》由会员分享,可在线阅读,更多相关《Php520中的输入过滤函数Filter.docx.pdf(23页珍藏版)》请在三一文库上搜索。

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

2、入的过滤是保证整个程序安全的基础,和采用什么 语言或者什么系统毫无关系。Php 提供了很多相应的函数来对数据进行转换或者验证,但是和其 他语言比起来明显的缺陷是没有一个标准的函数来过滤所有数据。新的函数 Filter实现了这个 功 能。 什么是外部输入数据? 所有的 fonn 提交的数据 所有的 $_GET, $_POST, $_REQUEST Cookie($_COOKIES) 网络服务齧数据 文件 服务器信息(比如 $_SERVER SERVER NAME) 环境变量 数据库的查询 Filter很好的支持了上述这些输入数据。 为什么用 Filter? Filter扩展库的 A的就是要达到使

3、数据过滤尽量的简单,下面是两个简单例子: 检查 2 个通过 _GET方式输入的整数: 1 ; 6 exit(); 7 8 $mode 二(int) $_GET mode; 9 else 10 echo “The mode argument is missing. ; 11 exit(); 12 13 14 if (isset ($_GETtype) 15 $type = (int) $_GETtype; 16 if (! is_numeric($_GETtype) | 17 (is_numeric($_GET , type , ) 19 exit (); 20 else 21 $mode $_

4、GET type , ; else 24 echo “The type argument is missing.br / ; 25 exit (); 26 27 echo 0k. br / ; 28 ? view plain | print | copy to clipboard | ? “; exit (); ) $mode = (int)$ GETmode; )else echo “The mode argument is missing?br /“; exit (); 使用 Filter扩展库的 filtcr_input函数來过滤 : 1 array minngc =3, max_ran

5、gc =10); 5 6 if (is_null($mode) 7 echo “The mode argument is missing.“; exit (); arr 9 elseif ($mode = false) 10 echo “The mode argument /; 11 exit (); 12 else 13 echo “mode is: $mode ? br 14 15 16 if (isnull($type) 17 echo “The type , argument 18 exit(); 19 elseif ($type 二二二 false) 20 echo “The typ

6、c , argument 3 and 10.“; 21 exit(); 22 else 23 echo “type is: $type. must be a vali d i nteger. ; must be am integer betwecn / ; array (J minange 1 =3, if (is_null($mode) echo “The mode argument is missing?br / ;exit (); )elseif ($mode = false) ” echo “The 1 mode1 argument must be a valid integer ?b

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

8、 SAP1默认支持 filter。 假设有一个这样的简单的POST 请求: POST /myform. php?myfi eld=hola 下图说明了正常情况下 (php5. 1或之前没有 Filter扩展的时候 ) 和安装了 Filter 扩展后在处理上的区 别: Web Server PHP SAPI Create the superglobal myfield: alert( lhola,) Scripts Web Server PHP SAPI Scripts Duplicate the raw data 运行条件 Filter在 PHP 5. 1 和之前的版本可以使用扩展方式。从PH

9、P 5. 2.0 开始变成了 PHP的标准 库。 安装 PHP 5.2.0 中已经默认支持,所以不需要再额外安装。 Unix/Linux: $ peel install filter 或者 $ wget http:/pecl.php? net/get/f订 ter $ tar xzf filter $ cd filter-0. 11.0 $ phpizc $ ? /configure $ make $ make install Windows: 在这里 http:/pec 14win. php. net 可以下载与 PHP版木相对应的 filter, dll文 件。 pOSTRAW Imyfi

10、eld: |alert(hola ,) Filter the original data and create the super globals POST myfield: alert(hola*) 在任何系统中都需要修改php. ini文件加入 extension二 filter, so然后重起 web 服务。 原则 Filter可以有两种形式: 1. 过滤判断 *允许或者不允许字符串中有指定的字符 *和数据的格式无关 *返回一个字符串 2.检测判断 *强大的数据分析 *已知的数据格式 *成功返回指定的格式可用到的函数: *filter input,得到一个输入值 *fi 1 ter_in

11、put_array, 一次得到多个输入值 *filtcr_var,过滤一个值 *fi 1 ter_var_array, 一次过滤多个值如果成功的话将返回转换过之后的格式,如果失败 (格式不符 , 值超出范围等等。)将返冋 FALSE, 如果变量没有设置将返冋NULLo使用 FTLTRR_NULL_ON_FATLURE 标记后将会在失败的时候返回NULL,变量没有设置的时候返回FALSEo 请看下面的例子,可以避免使用isset或者 is_numeric 这样的混乱局面。 检测判断的例子 1 2 3 5 Enter your age: 6 7 8 9 view plain print copy

12、to clipboard ? Enter your age: input type二“submit“ name二“submit“ value二“Go“ 处理脚本 : 1 ; 10 submit) age , , FTLTER_VAIJDATE_TNT); elseif ($age = FALSE) 11 echo “Please enter a valid age.; 12 else 13 echo “Welcome. ,z; 14 15 ? view pleiin print copy to clipboard ? “; )elseif ($age 二二二FALSE) ” echo “Ple

13、ase enter a valid age? ; )a 1 7, min _range二 7 7); 7 Sage 二 filter_input(TNPUT_POST, age ,, FTLTER_VAIJDATE_TNT, $opt ions); 8 9 if (is_null(Sage) 10 echo “The age field is required? br /“; 11 elseif ($age 二二二 FALSE) 12 echo “You must be cn ter a valid age emd be bctwc cn 7 and 77 years old? br /“;

14、13 else 14 echo ,zWclcomc.br/“; 15 16 ? array C min_range =7, min_range =77); $age = filter.input(lNPUT_POST, J age , F1LTER.VAL1DATEJNT, $options); if (isnull($age) echo “The age field is required?br /“; elseif ($age = FALSE) ” orhn Vmi milQt ho ontov* a vol 5/1 anrl ho hotwoon 7 77 clrl /kr* / 、 ?

15、 ill 如果是要判断一个有效的邮件地址的话,可以这样: 1 $email = filter_input(1NPUT_POST, email, F1LTER_VAL1DATE_EMA1L) view plain print copy to clipboard | ? $email = filter.input (INPUTPOST, J emaif, FlLTERJr ALlDATEEMAlL): view plain print copy to clipboard d_l / 如果邮件地址不正确或者是空的话$ema订的值将为 FALSE 0 过滤判断的例子 1 2 3 4 5 Enter y

16、our name: 6 input type二submit“ name 二submit“ value二Go 7 8 9 view plain | print | copy to clipboard | ? body Enter your name: J J 下面的 f 订 ter_input函数将自动过滤并返回适当的值: 1 “; 9 else 10 echo “Hello $name. ,z ; 11 12 ? view plain | print | copy to clipboard | ? “; else echo “Hello $name. ,z: dJ jj 如果接收到的 name

17、值是: Johnny WeimUller Jr FI LTER_S AN ITI ZE_SPEC I AL_CI 1ARS 将会返回 : Hello Johnny Wei#223;muller bJr/b? 一个更好的过滤写法: name , , FILTER SANITIZE STRING, $name = filter.input(INPUT POST, name, F1LTER_SAN1T1ZE_STR1NG, FILTERJ ?LAG_ENCODEJUGII | FILTER_FLAG_ENCODEJLOW); $name 2 filter_input(INPUT_POST, 4 TE

18、R_FLAG_ENCODE_LOW); FILTER_FLAG_ENCODE_HIGH FIL view plain | print copy to clipboard ? 输出: Hello Johnny WeimIler Jr. 这里的函数还有很多选项,如果你想了解更多的细节可以查看Filter的文档。 如何一次处理所有输入? 1 2 3 5 Name: input name 二“name“ size二50br / 6 Email: input name 二ema订 size二50Xbr / 7 Homepage: in put n ennc 二 homcpeigc“ size 二“50b

19、r / 8 Age: br / 9 Income: br / 10 Your two favourites languages: 11 12 haskcll 13 R 14 Lua 15 Pike /option 16 Rebol/option 17 PHP 20 21 22 处理程序 : 1 FILTER_SANITIZE_STRIN 22 23 if ($input age = FALSE) 24 exit (You must be between 7 and 77 years old. ) ; 25 26 27 if (is_nul 1 ($input favourites , ) 28

20、 exit ( z, You have to choose two or more languages? ) ; 29 30 11 homepage“ 12 age ATE_1NT, 13 array ( mi n_range , 二7, 14 income , 15 favourites , 16 SANITIZE_STRING, 17 _REQUTRE_ARRAY 18 19 二FILTER_VALIDATE_URL, = array ( filter = FILTER_VALID options二 mi n_range , =77), = FILTER VALIDATE FLOAT, 二

21、array ( filter = FILTER. flags , 二FILTER ); ), 31 if (!in_array ( , PHP , , $inputsfavourites) 32 exit (“You don ,t like PHP! ) ; 33 34 35 /*0ther checks for required values */ 36 ? view plain print copy to clipboard ? arrayC filter二FILTER_SANITIZE_STRING, flags = FLTER_FLAG_ENCODE_HTGH|FILTER_FLAG_

22、ENCODE_LOW), = FTLTER_VALTDATE_EMAIL, = FILTER VALIDATE URL, =5 AWH 51“FTI TRP VAI TnATF TMT 正如上面例子中的,通过一个函数就能处理所有的变量。唯一不同的就是事先定义一个对应的 数组。需要注意的是数组中选项的正确性。 这样的做法不但增加了程序的易读性,并且如果要添加移除或者修改处理规则也会非常方便。 更复杂的处理 在下面的处理 “favourites变量时用到了用户自定义函数。“options“指定一 个用户自定义函 数通过定义 callback来实现,语法和PHP 的 call_user_func 一

23、样。 1 function _construct($name) 4 $thisname 二 $name; 5 6 8 function check_languages($var) 9 static $called 二 0; 10 $callcd+; 11 echo “called: $called: $var; 12 $var 二 filter_var($var, FTLTER_SANTTTZE_STRTPPED); 13 $1 = new language ($var); 14 return $1; 15 16 17 if (!fi1ter_has_var(TNPUTPOST, submit

24、) 18 echo “fornT; 19 / inelude the form. 20 21 22 $defs 二 array( 23 name , = array( , filter =F1LTER_SAN1T1ZE_STR1N 36 37 if ($inputf age ? = FALSE) 38 exit ( ,z You must be between 7 and 77 years old.“); 39 40 41 if (is_null ($input favourites , ) 42 exit(“You have to choose two or more lam guages?

25、 ) ; 43 FILTER_FLAG_ENCODE_LOW), DEJ4IGH 25 email 26 homepage 27 age , 28 incomc , 29 favourites = 30 FILTER CALLBACK, 31 二checklanguages 32 33 ) ; 二FILTER_VALIDATE_EMAIL, = FlLTER_VAL1DATE_URL, 二FILTER_VALIDATE_INT, = FILTER VALIDATE FLOAT, array ( filter , 二 options , ), 44 45 echo “Your favourite

26、 languages:ul ; 46 foreach ($inputfavourites as $1) echo . $-name 47 echo , ; 48 ? name = $name; ) function checklanguages($var) static $called = 0: $called+; echo “called: $called: $var“; ?var = 1 tov vaxCCvax PTI TRP ;AMTTT7R TPTPPFDi ? d I 如果参数是标准参数,函数将只会别调用一次,如果变量是一个数组,将会自动被数组的每个 成员调用一次。 当使用 cal

27、lback的时候 Filter不会转换或者验证输入数据。但是上面例子中的 filter var可 以在 callback函数或者方法中使用。 为什么不用面向对象 Filter不支持任何的对象。当前API 已经足够灵活,能方便的添加各种函数,支持 unicode, 可以方便的整合到你自己的结构中去。 如果你感兴趣的话,很高兴你可以自己去研究。但我们在短期内不会提供对00 的支持。 Default filter, PHP 5? 1? x and shared host 在 PHP 5.2.0 之后的版本中 filter默认已经支持。如果你打算使用,事先要修改好你的程序 或者提醒用户。 相信各种程序很快会依赖它。它虽然不能完全解决安全问题,但是为很多相同的问题和隐患提 供了一个解决方案。 view plain | print copy to clipboard | ?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1