`

php5.2 中新的输入检查函数

阅读更多
  在PHP 5.2最新版本中,在对输入检查的函数方面,多了新的功能,默认是开启的,减少了很多写代码的工作量
,在IBM DW的http://www.ibm.com/developerworks/cn/opensource/os-php-v522/index.html上有很好的介绍,下面笔记并补充之


过滤扩展功能有两种过滤器:Sanitizing 和 Logical。

Sanitizing 过滤器只是允许或禁止字符串中的字符并将清理后的字符串作为结果返回。无论您将哪种数据格式传入这些函数,它们将始终返回字符串。对于特定类型的使用,这是至关重要的,因为您可以阻止用户发送不适当的输入并导致异常结果。例如,用户可以发现文本块的输入被返回到以下页面上并且要利用那些返回信息。如果清理输入,则将删除输入的所有危险部分。

Logical 过滤器将对变量执行测试并根据测试提供 true 或 false 结果。然后您可以使用结果来决定如何处理数据或获得用户的地址。这种过滤器的简单示例是验证年龄。逻辑测试还可以针对类似 Perl 的正则表达式进行测试。
<?php

echo "You are " . filter_var($_GET['1'], FILTER_SANITIZE_STRING) . ".<br>\n";
echo "Your favorite color is " . filter_var($_GET['2'], FILTER_SANITIZE_STRING) .
".<br>\n";
echo "The airspeed of an unladen swallow is " . filter_var($_GET['3'], FILTER_SANITIZE_STRING)
. ".<br>\n";
?>
filter_var() 函数来清理输入并使其有效并且安全。在这种情况下,使用选项 FILTER_SANITIZE_STRING,该选项将获取输入、删除所有 HTML 标记并选择性地编码或删除特定字符。

由于它将除去 HTML 标记,因此尝试运行 JavaScript 将失败,并且从脚本中获得更适当的结果。

再补充些

PHP: indicates the earliest version of PHP that supports the function.

Function Description PHP
filter_has_var() Checks if a variable of a specified input type exist 5
filter_id() Returns the ID number of a specified filter 5
filter_input() Get input from outside the script and filter it 5
filter_input_array() Get multiple inputs from outside the script and filters them 5
filter_list() Returns an array of all supported filters 5
filter_var_array() Get multiple variables and filter them 5
filter_var() Get a variable and filter it 5


PHP Filters

ID Name Description
FILTER_CALLBACK Call a user-defined function to filter data
FILTER_SANITIZE_STRING Strip tags, optionally strip or encode special characters
FILTER_SANITIZE_STRIPPED Alias of "string" filter
FILTER_SANITIZE_ENCODED URL-encode string, optionally strip or encode special characters
FILTER_SANITIZE_SPECIAL_CHARS HTML-escape '"<>& and characters with ASCII value less than 32
FILTER_SANITIZE_EMAIL Remove all characters, except letters, digits and !#$%&'*+-/=?^_`{|}~@.[]
FILTER_SANITIZE_URL Remove all characters, except letters, digits and $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=
FILTER_SANITIZE_NUMBER_INT Remove all characters, except digits and +-
FILTER_SANITIZE_NUMBER_FLOAT Remove all characters, except digits, +- and optionally .,eE
FILTER_SANITIZE_MAGIC_QUOTES Apply addslashes()
FILTER_UNSAFE_RAW Do nothing, optionally strip or encode special characters
FILTER_VALIDATE_INT Validate value as integer, optionally from the specified range
FILTER_VALIDATE_BOOLEAN Return TRUE for "1", "true", "on" and "yes", FALSE for "0", "false", "off", "no", and "", NULL otherwise
FILTER_VALIDATE_FLOAT Validate value as float
FILTER_VALIDATE_REGEXP Validate value against regexp, a Perl-compatible regular expression
FILTER_VALIDATE_URL Validate value as URL, optionally with required components
FILTER_VALIDATE_EMAIL Validate value as e-mail
FILTER_VALIDATE_IP Validate value as IP address, optionally only IPv4 or IPv6 or not from private or reserved ranges


检测判断的例子

1 <html>  
2 <head></head>  
3 <body  
4     <form action="example04.php" method="post" >  
5     Enter your age: <input name="age" size="2">  
6     <input type="submit" name="submit" value="Go">  
7     </form>  
8 </body>  
9 </html> 
view plain | print | copy to clipboard | ?


处理脚本:

1 <?php  
2 if (!filter_has_var(INPUT_POST, 'submit')) {  
3     echo "form";  
4     // include the form.  
5 }  
6    
7 $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT);  
8 if (is_null($age)) {  
9     echo "The 'age' field is required.<br />";  
10 elseif ($age === FALSE) {  
11     echo "Please enter a valid age.<br />";  
12 else {  
13     echo "Welcome.<br/>";  
14 }  
15 ?> 
view plain | print | copy to clipboard | ?


filter_has_var检测给定的变量是否存在。它不会做任何处理只会告诉程序变量是否已经设置。相当于isset($_POST[‘submit’])。filter_input会取得一个变量返回处理好的数据。在上面的例子中会返回一个整数。

如果是要返回一个处于一定范围之内的值,假设是7-77岁之间的人。可以指定一个最大值和一个最小值。

1 <?php  
2 if (!filter_has_var(INPUT_POST, 'submit')) {  
3     echo "form";  
4     // include the form.  
5 }  
6 $options = array('options'=> array('min_range'=>7, 'min_range'=>77));  
7 $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, $options);  
8    
9 if (is_null($age)) {  
10     echo "The 'age' field is required.<br />";  
11 elseif ($age === FALSE) {  
12     echo "You must be enter a valid age and be between 7 and 77 years old.<br />";  
13 else {  
14     echo "Welcome.<br/>";  
15 }  
16 ?> 
view plain | print | copy to clipboard | ?


如果是要判断一个有效的邮件地址的话,可以这样:

1 $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); 
view plain | print | copy to clipboard | ?


如果邮件地址不正确或者是空的话$email的值将为FALSE。

过滤判断的例子

1 <html>  
2 <head></head>  
3 <body>  
4     <form action="example05.php" method="post" >  
5     Enter your name: <input name="name" size="50">  
6     <input type="submit" name="submit" value="Go">  
7     </form>  
8 </body>  
9 </html> 
view plain | print | copy to clipboard | ?


下面的filter_input函数将自动过滤并返回适当的值:

1 <?php  
2 if (!filter_has_var(INPUT_POST, 'submit')) {  
3     echo "form";  
4     // include the form.  
5 }  
6 $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);  
7 if (is_null($name)) {  
8     echo "The 'name' field is required.<br />";  
9 else {  
10     echo "Hello $name.<br/>";  
11 }  
12 ?> 
view plain | print | copy to clipboard | ?


如果接收到的name值是:
Johnny Wei&szlig;müller <b>Jr</b>

FILTER_SANITIZE_SPECIAL_CHARS 将会返回:
Hello Johnny Wei&#223;müller <b>Jr</b>.

一个更好的过滤写法:

1 $name = filter_input(INPUT_POST,   
2                      'name',  
3                      FILTER_SANITIZE_STRING,   
4                      FILTER_FLAG_ENCODE_HIGH|FILTER_FLAG_ENCODE_LOW); 
view plain | print | copy to clipboard | ?


输出:
Hello Johnny Weißmüller Jr.

这里的函数还有很多选项,如果你想了解更多的细节可以查看Filter的文档。

如何一次处理所有输入?

1 <html>  
2 <head></head>  
3 <body  
4     <form action="example07.php" method="post" >  
5     Name: <input name="name" size="50"><br />  
6     Email: <input name="email" size="50"><br />  
7     Homepage: <input name="homepage" size="50"><br />  
8     Age: <input name="age" size="4"><br />  
9     Income: <input name="income" size="50"><br />  
10     Your two favourites languages:  
11     <select name="favourites[]" size="6" multiple>  
12         <option value="haskell">haskell</option>  
13         <option value="r">R</option>  
14         <option value="lua">Lua</option>  
15         <option value="pike">Pike</option>  
16         <option value="rebol">Rebol</option>  
17         <option value="php">PHP</option>  
18     </select><br />  
19     <input type="submit" name="submit" value="Go">  
20     </form>  
21 </body>  
22 </html> 
view plain | print | copy to clipboard | ?


处理程序:

1 <?php  
2 if (!filter_has_var(INPUT_POST, 'submit')) {  
3     echo "form";  
4     // include the form.  
5 }  
6    
7 $defs = array(  
8     'name'       => array('filter'=>FILTER_SANITIZE_STRING,  
9                     'flags' => FILTER_FLAG_ENCODE_HIGH|FILTER_FLAG_ENCODE_LOW),  
10     'email'      => FILTER_VALIDATE_EMAIL,  
11     'homepage'   => FILTER_VALIDATE_URL,  
12     'age'        => array(  'filter' => FILTER_VALIDATE_INT,  
13                             'options'=> array('min_range'=>7, 'min_range'=>77)),  
14     'income'     => FILTER_VALIDATE_FLOAT,  
15     'favourites' => array(  
16                         'filter' => FILTER_SANITIZE_STRING,  
17                         'flags'  => FILTER_REQUIRE_ARRAY  
18                     ),  
19           );  
20    
21 $input = filter_input_array(INPUT_POST, $defs);  
22    
23 if ($input['age'] === FALSE) {  
24     exit("You must be between 7 and 77 years old.");  
25 }  
26    
27 if (is_null($input['favourites'])) {  
28     exit("You have to choose two or more languages.");  
29 }  
30    
31 if (!in_array('PHP'$inputs['favourites'])) {  
32     exit("You don't like PHP!");  
33 }  
34    
35 /*Other checks for required values */ 
36 ?> 
view plain | print | copy to clipboard | ?


正如上面例子中的,通过一个函数就能处理所有的变量。唯一不同的就是事先定义一个对应的数组。需要注意的是数组中选项的正确性。

这样的做法不但增加了程序的易读性,并且如果要添加移除或者修改处理规则也会非常方便。

更复杂的处理

在下面的处理“favourites”变量时用到了用户自定义函数。"options"指定一个用户自定义函数通过定义callback来实现,语法和PHP的call_user_func一样。

1 <?php  
2 class language {  
3     function __construct($name) {  
4         $this->name = $name;  
5     }  
6 }  
7  
8 function check_languages($var) {  
9     static $called = 0;  
10     $called++;  
11     echo "called: $called: $var<br />";  
12     $var = filter_var($var, FILTER_SANITIZE_STRIPPED);  
13     $l = new language($var);  
14     return $l;  
15 }  
16  
17 if (!filter_has_var(INPUT_POST, 'submit')) {  
18     
分享到:
评论

相关推荐

    PHP 5.2 标准课程初级函数-2

    PHP 5.2 标准课程初级函数-2

    PHP 5.2 标准课程初级函数-1

    PHP 5.2 标准课程初级函数-1

    PHP 5.2 标准课程初级函数-1-1

    PHP 5.2 标准课程初级函数-1_1

    PHP 5.2 标准课程初级函数-1-2

    PHP 5.2 标准课程初级函数-1_2

    §5.2有界变差函数[归纳].pdf

    §5.2有界变差函数[归纳].pdf

    PHP 5.2中文手册

    这份"PHP 5.2中文手册"是开发人员不可或缺的参考资料,它详细介绍了PHP 5.2的所有核心概念、语法和函数,帮助开发者更深入地理解和应用PHP语言。 一、PHP基础 PHP是一种广泛使用的开源服务器端脚本语言,尤其适用于...

    php 5.2 集成zend文件包

    - Filter_var 函数:用于过滤和验证输入数据,增强了安全性。 2. Zend Engine 知识点: - Zend Engine 是 PHP 的核心,负责解释和执行 PHP 代码。在 PHP 5.2 中,Zend Engine 已经进化到第二代(Zend Engine 2)...

    ubuntu 同时装php5.3和5.2

    sudo apt-get install php5 php5-common php5-cli php5-dev php5-mysql phpmyadmin php5-pgsql phppgadmin php5-gd php5-mcrypt php5-curl php-pear libapache2-mod-php5 php5-xdebug php5-codesniffer ``` 2. *...

    中文php.ini php5.2 php优化

    中文php.ini php5.2 php优化

    pdflib for php5.2 PHP网站PDF插件,PHP网站pdf补丁

    extension=libpdf_php_for PHP5.2.x.dll 添加效果: ;extension=php_ibm_db2.dll ;extension=memcache.dll extension=libpdf_php_for PHP5.2.x.dll ;;;;;;;;;;;;;;;;;;; ; Module Settings ; ;;;;;;;;;;;;;;;;;;; ...

    php_manual_zh_5.2 手册中文版

    6. **过滤器**:PHP 5.2增加了输入过滤器,用于验证和清理用户输入,提高了应用程序的安全性。 7. **JSON支持**:JavaScript Object Notation (JSON) 是一种轻量级的数据交换格式,PHP 5.2开始内置了对JSON的编码和...

    odbtp 支持 php-5.2.x

    PHPUTF-8是一个PHP的扩展,提供了一组函数来处理UTF-8编码的字符串。当ODBTP结合PHPUTF-8使用时,用户可以更好地在PHP中处理和操作非ASCII字符,确保数据的完整性和一致性。 PHP SQL Server连接通常依赖于特定的...

    php5.2+apache2.2.rar

    《PHP 5.2与Apache 2.2的集成配置详解》 PHP 5.2是PHP编程语言的一个较早版本,它在当时的Web开发领域扮演了重要角色,提供了丰富的功能和良好的性能。Apache 2.2则是一款广泛应用的开源Web服务器软件,两者结合...

    PHP5.2 windows

    PHP5.2是PHP语言的一个历史版本,发布于2006年,直到2011年停止了安全更新,2017年底正式终止支持。这个版本在当时具有里程碑意义,因为它引入了许多新特性,同时也对代码性能进行了优化。在Windows环境下运行PHP5.2...

    php5.2redis扩展.rar

    标题中的“php5.2redis扩展.rar”表明这是一个与PHP 5.2版本相关的Redis扩展压缩包,适用于Windows操作系统。Redis是一种高性能的键值数据存储系统,常用于缓存、数据库和消息中间件等场景。PHP的Redis扩展使得...

    phpstudy学习工具php5.2

    CHM文件是Windows系统的帮助文件,包含了PHP5.2的所有函数、类和常量的详细文档,是学习和解决问题的重要参考资料。 **phpStudy(PHP5.2).exe** 这是PHPStudy的安装程序,用户可以通过双击执行这个文件来安装整个...

    APACHE2.4+PHP5.2安装环境必备文件

    所以如果需要配置PHP5.2环境,必须单独下载本文件才能正确配置。 注意:本文件仅适用于PHP 5.2 TS(线程安全)版本。不适合NTS,不适合PHP5.3 PHP5.4 如果需要PHP5.3 或PHP5.4 请下载我另外上存的资源。

    php5.2+php_redis.dll

    标题 "php5.2+php_redis.dll" 指的是在PHP 5.2版本下,为了连接并操作Redis分布式数据库而需要的一个扩展模块。这个扩展是PHP与Redis交互的关键,它允许PHP脚本通过一个名为`php_redis.dll`的动态链接库与Redis...

    九年级数学下册第5章二次函数5.2二次函数的图像和性质第1课时作业pdf无答案新版苏科版

    九年级数学下册第5章二次函数5.2二次函数的图像和性质第1课时作业pdf无答案新版苏科版

    PHP_Mongo_extension PHP5.2 -5.4 VC6 VC9

    - **索引管理**:`createIndex()`, `ensureIndex()`, `dropIndex()`等函数用于创建、检查和删除索引,以优化查询性能。 - **游标**:查询结果通常返回一个游标对象,如`MongoCursor`,它可以遍历查询结果,实现分页...

Global site tag (gtag.js) - Google Analytics